[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/09 19:03 / Filesize : 146 KB / Number-of Response : 644
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132



1 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 13:10:57 ]
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
pc11.2ch.net/test/read.cgi/tech/1170338926/


GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.42【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1188748806/
C/C++の宿題を片付けます 95代目
pc11.2ch.net/test/read.cgi/tech/1187944110/


【このスレ住人としての心得】
ビットシフトはなんの役に立つのでしょうか でググれ

41 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:33:49 ]
三項演算子はその演算結果を使用しないのであればif-elseを使うべき。
printfの戻り値を利用するのなら丸っきり否定はしないが。

42 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:37:22 ]
>>31は正しいのですか?
()はつける必要ないのですか?

43 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:39:01 ]
max=(n1>n2) ? n1:n2;
でOKなら、
(num)?printf("その数は0ではない。"):printf("その数は0。");
もOKですよね?

max=n1>n2 ? n1:n2;
がOKなら、
num?printf("その数は0ではない。"):printf("その数は0。");
はOKですよね?

どっちが適切ですか?

44 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:41:09 ]
>>43
どうでもいいよ。

45 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:41:17 ]
>>41
そうなんですか。それなら、基本的にif-elseを使えばいいんですね。


46 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:41:54 ]
4つともおk


47 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:42:32 ]
>>41
ほっといてやれ
知ったばかりで使いたい年頃なんだ

48 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:43:29 ]
>>47
教科書に載っていたので、条件演算子を使ったんです。
でも、あまり使われていないんですね。
if-elseのほうがいいんですよね?

49 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:45:41 ]
>>43
演算子の優先順位について調べろ。
?:と=と>でどれがより優先されるか。



50 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:49:56 ]
>>48
異論もあるだろうけど、if文を使った方が読みやすい場合が多いと思う。
?:を使ってコンパクトに書いた方がいいという積極的な理由がなければif文を選択した方が無難だと思う。

51 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:49:56 ]
>max=n1>n2 ? n1:n2;
はNG
maxにn1が入る

52 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:55:27 ]
>>51
それはどんな処理系?

53 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:56:16 ]
>>52
C/C++処理系ではないことは確か

54 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:57:28 ]
>>51
>>49

55 名前:40 mailto:sage [2007/09/21(金) 22:57:35 ]
おい、さっさと教えろよ

56 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:59:24 ]
>>40
知るかヴォけ

57 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:01:16 ]
>>55
>>40 のリンク先をもう一度よく見なおしてみれば満足できるかも

58 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:01:42 ]
>>51
だから、
max=(n1>n2)?n1:n2;
がいいよ。()をつけるべき。

59 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:01:49 ]
>>40
異論もあるだろうけど、ここは条件演算子の是非を今更議論するような
幼稚なスレなので、他を当たって下さい。ちなみに自分もわかりませんので。



60 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:06:03 ]
>>59
芸風真似すんなww

61 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:08:03 ]
>>51>>58
ホレ。ググってきてやったぞ。
コレ見て落ち着いて来い。な?

ttp://www.bohyoh.com/CandCPP/C/operator.html

62 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:09:57 ]
>>40
頭悪いな。
16bit処理系だとEOFも0xffffなんだよ。
判る?
たとえると実際のハードウェアやOSでNULLの0を示す
アドレス付近を読み出し専用にして不正なアドレスをトラップする仕組みと同じ。


63 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:12:17 ]
>>62
分かってないのはお前じゃないのか?

64 名前:40 mailto:sage [2007/09/21(金) 23:15:06 ]
あー未使用じゃなくて「不使用」なのね。
よくわかった。
けど、wikipediaなんて信用すんなこのアホが!
って人もいるけど、その辺どうよ?
俺は信用したが。

65 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:15:17 ]
>>40
0xfffe, 0xffffはアプリケーション定義

66 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:18:34 ]
え、おれ今までwint_tってintなのかと思ってた
wchar_tなのかよ
やべえwwww

67 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:28:56 ]
>>40
wchar_tはunsigned shortになってるから、WEOFの時だけ
short→intとキャストすればEOFと共有できるよ。

68 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:37:13 ]
BOM

69 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:41:13 ]
>>67
WEOFの時だけ、って条件だと、
int my_fputwc(wint_t c, FILE *fp)
{ wint_t r = fputwc(c, fp);
return (r == WEOF) ? EOF : r;
}
みたいな書き方しかないと思うけど、
これを条件分岐させずに書く方法ってある?



70 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:46:38 ]
#include <stdio.h>

void wprt(char (*sp)[7], int n);

int main(void)
{
char str[3][7] = {"JAPAN", "USA", "FRANCE"};

wprt(str, 3);

return 0;
}

void wprt(char (*sp)[7], int n)
{
int i, j;

for(i = j = 0; i < n; i++, sp++, j = 0)
{
printf("string: %d line = ", i);
while(*((*sp) + j) != '\0')
{
printf("%c", *((*sp) + j ));
j++;
}
printf("\n");
}
}


71 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:47:23 ]
>>70のプログラムで、出力結果は
string: 0 line = JAPAN
string: 1 line = USA
string: 2 line = FRANCE


となるのですが、どうしても
*((*sp) + j)
の部分できちんと処理されてるのかわかりません

この書き方だと配列strの最初の「J」にjの値を足すことになるのでは?
なぜきちんとアドレスに1足したように処理されているのでしょうか?

72 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:51:36 ]
jは文字列のインデクス
増えるたびに
J A P A N
と順に指してる

73 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:59:02 ]
>>69
int wtbl[0x10000];
void dokkade_jikkou(void ) {
int i;
for (i = 0; i < 0x10000; i++)
wtbl[i] = i;
wtbl[0xffff] = EOF;
}
int my_fputwc(wint_t c, FILE *fp) return wtbl[fputwc(c, fp);]; }

256KB我慢できれば。

74 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:06:00 ]
>>71
ポインタの型スケーリング

75 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:32:37 ]
>>72 >>74

返答ども!
やってることは確かにそうなんですよねぇ

なんで*(sp + j)でやると異常終了するんでしょう?
アドレスを1づつ増やして、*でその1増えたアドレスを差せば
順番に出力されてもいいはずなのになぁ

76 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:40:34 ]
>>71
どこから引っ張ってきたソースだかしらんけど
spは要素7のcharの配列へのポインタだから*spは要素7のcharの配列そのものを意味するけど
これは直ちに要素7のcharの配列の先頭要素へのポインタつまりcharへのポインタに成り下がるので、
これにjを足せばそれは要素7のcharの配列の先頭要素から数えてj個目の要素を指すポインタになるから
*(*sp+j)は要素7のcharの配列の先頭要素から数えてj個目の要素を意味する

77 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:44:06 ]
>>75
spは要素7のcharの配列へのポインタだから、
これに1を足すと要素7のcharの配列のサイズぶん後を指す
charのサイズぶん後を指させたいならcharへのポインタにしなければならない

78 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:44:21 ]
spは「要素7の配列」へのポインタだから
有効なのはsp+0〜sp+2 の間だけ
spに1足すと
[JAPAN\0\0]
→[USA\0\0\0\0]
[FRANCE\0]
に移動する
JAPANの'A'に移動するわけじゃない

79 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:49:13 ]
こういう場合普通は char sp[][7] って書いて
sp[i][j] みたいに参照するんだけどな
なんだこのソース

それとも訓練用にわざとわかりにくい書き方をしてるのか



80 名前:75 mailto:sage [2007/09/22(土) 01:11:26 ]
みなさんありがとうございます!非常にすっきりしました。どんだけ悩んだことか・・・

spは配列strの先頭アドレスが入ってて、1足せば次の文字が出るもんだと思ってた
今の場合は2次元配列で要素数が7だからsp+1だと7つ分一気にずれるのか

で、*spにすることでcharへのポインタになり、1足せば次の要素に行く。と・・・

こんな感じであってるんでしょうか?

81 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 03:19:35 ]
> ユニコード(UTF16)では0x0000〜0xffffまでの値が文字の領域として
> 定義されているらしいですが、WEOFは0xffffと定義されています。
このそもそも間違いだらけの文章に誰も突っ込まないってどうよ

82 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 04:28:28 ]
どこが間違ってるか説明お願いしますよ

83 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 04:30:29 ]
1行目はC言語のワイド文字(Unicodeとは限らない)の話なのに
なぜか唐突にUnicodeが出てくる
WEOFは0xffffとは限らない

84 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 10:19:03 ]
たまたま40の処理系ではそうだったけど、ということで勘弁してやろうぜ。

85 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 10:42:54 ]
>80
あってる

86 名前:デフォルトの名無しさん [2007/09/22(土) 10:56:34 ]
objと lib は同じようなものですか?

objを標準のlibフォルダに入れておけばコンパイル速いですか?

87 名前:デフォルトの名無しさん [2007/09/22(土) 11:09:52 ]
複数の関数が入っているlibファイルを作って、<***.h>と書いたとき自動的に必要なlibファイルを読み込むように出来ますか?
printfとかは必要なlibファイルを勝手に読み込みますよね?

88 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:14:15 ]
環境とコンパイラによる
C言語そのものとは関係ない

89 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:21:32 ]
>>86
>objと lib は同じようなものですか?
Windowsのlibの話ならlibはobjのアーカイブ

>objを標準のlibフォルダに入れておけばコンパイル速いですか?
関係ない

>>87
ムリ
>printfとかは必要なlibファイルを勝手に読み込みますよね?
gccならlibc、VCならCRTが自動的にリンクされるだけで、ヘッダファイルとは関係ない



90 名前:デフォルトの名無しさん mailto:age [2007/09/22(土) 12:09:33 ]
↑リンカーを自分で作ったら可能

91 名前:デフォルトの名無しさん mailto:age [2007/09/22(土) 12:12:15 ]
JavaScriptに近いC++ありませんか?

92 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:14:34 ]
>>91
C#

93 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:46:57 ]
3つの数字が同じかどうかを
A==B==C
で比較できますか?


94 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:50:05 ]
できませんよ

95 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:50:52 ]
できますよ

96 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:52:20 ]
AもBもCも1である、という限られた条件なら可能w。

97 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:52:43 ]
そう思うならやってごらんよ

98 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:59:01 ]
>>95
お前バカだなぁ
わかってないんだから出てくるなよ

99 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:13:40 ]
できますよ



100 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:15:38 ]
できますん

101 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:23:29 ]
自演乙

102 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:54:14 ]
どうでもいいが、馬鹿は初心者スレで言ってくれ。

103 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:21:48 ]
>>87
>複数の関数が入っているlibファイルを作って、<***.h>と書いたとき自動的に必要なlibファイルを読み込むように出来ますか?
Visual C++ なら、ヘッダファイルに次のように書いておけば、mylib.libがリンクされる。
#pragma comment(lib, "mylib.lib")

104 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:35:38 ]
>>103
スレ違いは誘導しましょう。

105 名前:デフォルトの名無しさん [2007/09/22(土) 18:28:21 ]
JIS X 3010-1993 6.2.1.2 から
負の整数 A を A の型と同じサイズか大きいサイズの符号無し整数 B に変換するとき
処理系の負の整数の表現がどうであれ B は A の 2 の補数表現と同じビットパターン
になると考えてもいいですか?


106 名前:デフォルトの名無しさん [2007/09/22(土) 18:36:22 ]
規格は、処理系が採用している数値の内部表現(2's complementとか)には言及してないだろ。
だから、符号拡張が起きるかどうか(が聞きたいのだろうがそれ)も処理系による。


107 名前:デフォルトの名無しさん [2007/09/22(土) 18:38:41 ]
とはいえ、まーそのへんの2's complementな処理系だと、

32bit signed int が INT_MIN
10000000000000000000000000000000
だったとして、それを64bit unsigned long longに代入したら
1111111111111111111111111111111110000000000000000000000000000000
だわな。

| B は A の 2 の補数表現と同じビットパターン
| になると考えてもいいですか?

だから、この答えはNoかな。



108 名前:デフォルトの名無しさん [2007/09/22(土) 18:58:19 ]
規格では B の型の最大値 + 1 + A だから型のサイズが同じ処理系なら
負数の表現方法にかかわらず同じ結果になるんじゃないですか?


109 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:00:18 ]
>>108
規格の文言を一字一句たがわず書いてみて



110 名前:デフォルトの名無しさん [2007/09/22(土) 19:06:05 ]
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら

>>105と前提が変化した件について。相手にするの止めようかな。



111 名前:デフォルトの名無しさん [2007/09/22(土) 19:18:17 ]
ビットの話がしたいなら、規格持ち出すの止めて処理系書けよ。



112 名前:デフォルトの名無しさん mailto:age [2007/09/22(土) 19:22:00 ]
NicoVideo動画リンクが付いて超便利になった
www.freewebs.com/photoradio/?0/1103271


113 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:27:03 ]
if (sa > 10 || sa < -10)

if (sa>=11 || sa<=-11)
は同じですか?

114 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:29:12 ]
>>113
sa が整数型なら

115 名前:デフォルトの名無しさん [2007/09/22(土) 19:33:15 ]
>> 109
JIS X 3010-1993 は会社にしかないし紙しかなく文が長いので
ここに書くには手間がかかりすぎます。


116 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:42:48 ]
>>113
お前宿題スレでしつこく書いてるバカだろ
お前だけだぞ、わかってないの

117 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:45:33 ]
>>115
身勝手な奴だな

118 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:08:10 ]
printfなどの関数でefgなど浮動小数点数の変換を行うとき、
私は四捨五入が行われるものと思っていましたが、
X3014 : 2003 7.19.6.1には「この変換は適切な桁数への値の丸めも行う」と書かれているのみです。

この丸めもFLT_ROUNDSに従うものなのでしょうか。
あるいは、私が見落としただけで、ほかの箇所で規定されているのでしょうか。

119 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:13:55 ]
>>113
こんなとこまで来ててフイタ



120 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:24:25 ]
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)


121 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:25:21 ]
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)

122 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:25:47 ]
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)


123 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:35:32 ]
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑

124 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:38:03 ]
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)

125 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:44:23 ]
>>120-124
間違い探しか?

126 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:01:22 ]
Stand Alone Comlex(笑)

127 名前:デフォルトの名無しさん [2007/09/22(土) 21:02:33 ]
>>109
C90 ではなく C99 であるが ttp://www.jisc.go.jp/app/pager?id=26811 の
6.3.1.3 に同じような内容がある。
UINT_MAX が 65535 のとき (unsigned int)(-1) は 65535 ということに
ならないでしょうか?


128 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:13:22 ]
intで2バイトってまだあるの?

129 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:13:34 ]
うん



130 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:36:41 ]
ifとswitchはどのように使い分ければいいですか?

131 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:52:49 ]
switchは複数個の定数値を取るかもしれない1個の変数を判断するとき
それ以外はif
というか全部if、else ifでも別に

132 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:58:04 ]
>>131
具体的に教えてください。

133 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:59:41 ]
>>132
具体的に聞いてください。

134 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:00:20 ]
>複数個の定数値を取るかもしれない1個の変数を判断するとき
というのが良く分かりません。

135 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:05:31 ]
知らなくておk

136 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:07:42 ]
分かったときに分かればいいだけの話

137 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:09:55 ]
>>134
if(xxx==0){
.....
}else if(xxx==1){
.....
}else{
.....
}
↑こういうのならswitchで↓この様に書けるけど
switch(xxx){
case 0:.....break;
case 1:.....break;
default:.....
}
↓こういうのはswitchを使って書けない
if(xxx==0){
.....
}else if(yyy==1){
.....
}else if(yyy==zzz){
.....
}else{
.....
}

138 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:16:34 ]
馬鹿な質問に対して列挙型を〜って素直に教えないところがこのスレの優しさだな。

139 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:17:04 ]
と言ってしまったけどswitchを複数使えば書けないことも無いか
でもやっぱりそこまでして使うくらいならifを使ったほうがいい



140 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:19:48 ]
>>138
皮肉なんか言ってないで教えたらどうなの。

141 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:43:39 ]
初心者スレじゃないんだから、わざわざ教えることもない。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<146KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef