【ISO/ANSI/JIS】 C言 ..
[2ch|▼Menu]
2:デフォルトの名無しさん
07/09/20 13:23:05
【質問者の絶対心得】
このスレは初心者スレではありません。Cの手練れが悩んで悩んでわからない事を
質問するスレです。スレのレベルに合わない低レベル質問は禁止です。
質問する前に先ず自分で最低1週間はいろいろ調べましょう。
K&Rに書かれているような事は質問しないこと

3:デフォルトの名無しさん
07/09/20 15:13:48
>ビットシフトはなんの役に立つのでしょうか でググれ
もうこのスレが出て来る
ぐーぐるさんはえーマジはえー

4:デフォルトの名無しさん
07/09/20 22:42:27
CHAR_BIT が 16 の処理系で fputc( 1000, fp ) で書き込んだファイルを
CHAR_BIT が 8 の処理系で fgetc( fp ) を読んだら何が返ってきますか?


5:デフォルトの名無しさん
07/09/20 22:51:13
整数の加算や積算の結果オーバーフローしたか(あるいはするか)
判定するにはどういう方法があるんでしょうか

インラインアセンブラ使うならオーバフローフラグ調べて終了なんですが、
C言語レベルでの検知方法を知りたいです

6:デフォルトの名無しさん
07/09/20 22:57:16
標準ではありません。
でもDSP系のコンパイラなら書けます。
もっとも専用に拡張されているのかも知れませんが。


7:デフォルトの名無しさん
07/09/20 22:57:34
演算結果が演算前より小さくなっていたら、オーバーフローとか。

8:デフォルトの名無しさん
07/09/20 23:31:24
同一機種用の処理系で、それぞれCHAR_BITが異なるという例はないと思う。
だから、わからない。

ケースバイケースともいえる。

9:デフォルトの名無しさん
07/09/20 23:42:32
int a, b;
if ((long long)a + b > INT_MAX) printf("overflow");

10:デフォルトの名無しさん
07/09/21 00:44:06
>>9
a, b が負数のときはどうなんです?

11:デフォルトの名無しさん
07/09/21 00:46:26
(long long)a + b < INT_MIN

12:デフォルトの名無しさん
07/09/21 05:37:53
>>5
符号なしではオーバーフローは決して起きないので
(ラップアラウンドするのは仕様)検出できません。
符号ありでオーバーフローが起きた場合の動作は未定義なので、
処理系依存の検出方法が存在するかもしれませんが
一般にはやはり不可能です。

13:デフォルトの名無しさん
07/09/21 09:37:08
void MergeSort(int x[ ], int left, int right);
void main(void);

void MergeSort(int x[ ], int left, int right)
{
int mid, i, j, k;
if (left >= right) /* 配列の要素がひとつなら */
return; /* 何もしないで戻る */
mid = (left + right) / 2; /* 中央の値より */
MergeSort(x, left, mid); /* 左を再帰呼び出し */
MergeSort(x, mid + 1, right); /* 右を再帰呼び出し */

for (i = left; i <= mid; i++)
temp[i] = x[i];

for (i = mid + 1, j = right; i <= right; i++, j--)
temp[i] = x[j];

i = left; /* i とj は作業領域のデーターを */
j = right; /* k は配列の要素を指している */

for (k = left; k <= right; k++) /* 小さい方から配列に戻す */
if (temp[i] <= temp[j]) /* ここでソートされる */
x[k] = temp[i++];
else
x[k] = temp[j--];
}

こういうマージソートって後ろからマージしていく感じでしょうか?
あと、グローバル変数を使わずにポインタで領域確保していったほうが
いいでしょうか?

14:デフォルトの名無しさん
07/09/21 11:46:20
UINT_MAX が 2 の累乗 - 1 以外の処理系は ISO/IEC 9899:1990 に適合しているといえるでしょうか?
たとえば UINT_MAX が 99999 の処理系があっても問題ないでしょうか?
最低値が 65535 という記述は見つけたのですが。

15:デフォルトの名無しさん
07/09/21 13:15:28
>13
「後ろからマージしていく感じ」ってなんだ、もっと厳密に話せ
でないと「お前がそう感じるならそうなんだろう」としか言えん

ソートできる配列の大きさに制限をかけたくないなら
必要に応じてallocするしかない

16:デフォルトの名無しさん
07/09/21 13:20:03
前と後ろの両端からマージしてく
左右どちらかの配列が終わったときの処理を別に書かなくていい分、短くかけることが利点

17:13
07/09/21 14:20:02
>>15
まだわかってないのでイメージでしか言えなかったです。すいません
>>16
なるほど。ありがとうございます

18:デフォルトの名無しさん
07/09/21 14:22:58
#include <stdio.h>
int main(void)
{
int no1,no2,max;

puts("整数二つを入力してください。");
printf("整数1:"); scanf("%d",&no1);
printf("整数2:"); scanf("%d",&no2);

if (no1==no2)
puts("二つは同じです。");
else if (no1>no2)
max=no1;
else
max=no2;
printf("大きい値は、%dです。",max);

return (0);
}

で0と0を入れると、
「二つは同じです。
大きい値は、1です。」と出ます。
なぜですか?

19:デフォルトの名無しさん
07/09/21 14:26:09
no1==no2のとき、maxに値を代入してないからたまたま最初から入ってた数字が表示されてる

20:デフォルトの名無しさん
07/09/21 14:31:41
数値が同じときに「大きい値は〜」を表示させたくないのなら、
最初のelseの後ろのifからreturnの手前までを{}で囲む

21:デフォルトの名無しさん
07/09/21 14:34:43
#include <stdio.h>
int main(void)
{
int no1,no2,max;

puts("整数二つを入力してください。");
printf("整数1:"); scanf("%d",&no1);
printf("整数2:"); scanf("%d",&no2);

if (no1==no2)
puts("二つは同じです。");
else if {
(no1>no2)
max=no1;
else
max=no2;
printf("大きい値は、%dです。",max);
}

return (0);
}
したら、
If文に ( がない(関数 main )
とエラーがでます。

22:デフォルトの名無しさん
07/09/21 14:37:14
else { if

23:デフォルトの名無しさん
07/09/21 14:39:07
>>22
thx!

24:デフォルトの名無しさん
07/09/21 19:04:29
const char** と char* const * と const char* const * の違いがよくわかる
説明サイト、参考書があったら教えていただけませんか? JISX 3010の当該章の提示
でも結構です。

よろしくおねがいします。

25:デフォルトの名無しさん
07/09/21 19:36:51
if (n1>n2)
max=n1;
else
max=n2;

max=(n1>n2) ? n1:n2;
とはどう違いますか?

26:デフォルトの名無しさん
07/09/21 19:42:21
>>25
結果は同じだが、後者の方が速い

27:デフォルトの名無しさん
07/09/21 19:45:19
いや同じでしょう

28:デフォルトの名無しさん
07/09/21 19:45:31
また適当な事言ってスレを盛り上げようとして〜

29:デフォルトの名無しさん
07/09/21 19:48:43
アセンブリ見てみなよ

30:デフォルトの名無しさん
07/09/21 19:51:33
結局どっちなの?

31:デフォルトの名無しさん
07/09/21 19:55:48
>max=(n1>n2) ? n1:n2;
これって()要らないんじゃない?
max=n1>n2 ? n1:n2;
でいいんじゃない?

32:デフォルトの名無しさん
07/09/21 20:07:42
>>30
同じ
>>31
いい

33:デフォルトの名無しさん
07/09/21 20:39:35
>>24もおながいします..

34:デフォルトの名無しさん
07/09/21 21:13:07
constは直後のトークンを修飾する。

const char** p1; //charを修飾
char* const * p2; // char *を修飾
const char* const * p3; //charと char *を修飾
ならば
**p1がconst
*p2がconst
*p3と**p3がconst
だと想う。

35:デフォルトの名無しさん
07/09/21 21:15:48
>>24
URLリンク(kmaebashi.com)

36:デフォルトの名無しさん
07/09/21 22:17:52
num?printf("その数は0ではない。"):printf("その数は0。");

(num)?printf("その数は0ではない。"):printf("その数は0。");
のほうがいいですか?

37:デフォルトの名無しさん
07/09/21 22:27:47
if-elseのほうがいい。常考。

38:デフォルトの名無しさん
07/09/21 22:30:56
C言語ってなんですか、

39:デフォルトの名無しさん
07/09/21 22:32:01
>>36
どうでもいい。


40:デフォルトの名無しさん
07/09/21 22:33:48
Cライブラリのワイド文字(wchar_tとかwint_t)について質問です。
ユニコード(UTF16)では0x0000〜0xffffまでの値が文字の領域として
定義されているらしいですが、WEOFは0xffffと定義されています。
これだと文字とWEOFを区別できない様な気がするのですが、
0xffffの文字は存在しないと考えてよいのでしょうか?

ここを見ると一応未使用となっていますが、気持ち悪いです。
Wikipedia項目リンク

なんでEOFじゃなくWEOFになったんでしょうね。


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

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

43:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/21 22:41:09
>>43
どうでもいいよ。

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


46:デフォルトの名無しさん
07/09/21 22:41:54
4つともおk


47:デフォルトの名無しさん
07/09/21 22:42:32
>>41
ほっといてやれ
知ったばかりで使いたい年頃なんだ

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

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

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

51:デフォルトの名無しさん
07/09/21 22:49:56
>max=n1>n2 ? n1:n2;
はNG
maxにn1が入る

52:デフォルトの名無しさん
07/09/21 22:55:27
>>51
それはどんな処理系?

53:デフォルトの名無しさん
07/09/21 22:56:16
>>52
C/C++処理系ではないことは確か

54:デフォルトの名無しさん
07/09/21 22:57:28
>>51
>>49

55:40
07/09/21 22:57:35
おい、さっさと教えろよ

56:デフォルトの名無しさん
07/09/21 22:59:24
>>40
知るかヴォけ

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

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

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

60:デフォルトの名無しさん
07/09/21 23:06:03
>>59
芸風真似すんなww

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

URLリンク(www.bohyoh.com)

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


63:デフォルトの名無しさん
07/09/21 23:12:17
>>62
分かってないのはお前じゃないのか?

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

65:デフォルトの名無しさん
07/09/21 23:15:17
>>40
0xfffe, 0xffffはアプリケーション定義

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

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

68:デフォルトの名無しさん
07/09/21 23:37:13
BOM

69:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/21 23:51:36
jは文字列のインデクス
増えるたびに
J A P A N
と順に指してる

73:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/22 00:06:00
>>71
ポインタの型スケーリング

75:デフォルトの名無しさん
07/09/22 00:32:37
>>72 >>74

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

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

76:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/22 00:44:06
>>75
spは要素7のcharの配列へのポインタだから、
これに1を足すと要素7のcharの配列のサイズぶん後を指す
charのサイズぶん後を指させたいならcharへのポインタにしなければならない

78:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/22 00:49:13
こういう場合普通は char sp[][7] って書いて
sp[i][j] みたいに参照するんだけどな
なんだこのソース

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

80:75
07/09/22 01:11:26
みなさんありがとうございます!非常にすっきりしました。どんだけ悩んだことか・・・

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

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

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

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

82:デフォルトの名無しさん
07/09/22 04:28:28
どこが間違ってるか説明お願いしますよ

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

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

85:デフォルトの名無しさん
07/09/22 10:42:54
>80
あってる

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

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

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

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

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

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

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

90:デフォルトの名無しさん
07/09/22 12:09:33
↑リンカーを自分で作ったら可能

91:デフォルトの名無しさん
07/09/22 12:12:15
JavaScriptに近いC++ありませんか?

92:デフォルトの名無しさん
07/09/22 12:14:34
>>91
C#

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


94:デフォルトの名無しさん
07/09/22 13:50:05
できませんよ

95:デフォルトの名無しさん
07/09/22 13:50:52
できますよ

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

97:デフォルトの名無しさん
07/09/22 13:52:43
そう思うならやってごらんよ

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

99:デフォルトの名無しさん
07/09/22 16:13:40
できますよ

100:デフォルトの名無しさん
07/09/22 16:15:38
できますん

101:デフォルトの名無しさん
07/09/22 16:23:29
自演乙

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

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

104:デフォルトの名無しさん
07/09/22 17:35:38
>>103
スレ違いは誘導しましょう。

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


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


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

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

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

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



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


109:デフォルトの名無しさん
07/09/22 19:00:18
>>108
規格の文言を一字一句たがわず書いてみて

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

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



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



112:デフォルトの名無しさん
07/09/22 19:22:00
NicoVideo動画リンクが付いて超便利になった
URLリンク(www.freewebs.com)


113:デフォルトの名無しさん
07/09/22 19:27:03
if (sa > 10 || sa < -10)

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

114:デフォルトの名無しさん
07/09/22 19:29:12
>>113
sa が整数型なら

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


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

117:デフォルトの名無しさん
07/09/22 19:45:33
>>115
身勝手な奴だな

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

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

119:デフォルトの名無しさん
07/09/22 20:13:55
>>113
こんなとこまで来ててフイタ

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


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

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


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

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

125:デフォルトの名無しさん
07/09/22 20:44:23
>>120-124
間違い探しか?

126:デフォルトの名無しさん
07/09/22 21:01:22
Stand Alone Comlex(笑)

127:デフォルトの名無しさん
07/09/22 21:02:33
>>109
C90 ではなく C99 であるが URLリンク(www.jisc.go.jp)
6.3.1.3 に同じような内容がある。
UINT_MAX が 65535 のとき (unsigned int)(-1) は 65535 ということに
ならないでしょうか?


128:デフォルトの名無しさん
07/09/22 22:13:22
intで2バイトってまだあるの?

129:デフォルトの名無しさん
07/09/22 22:13:34
うん

130:デフォルトの名無しさん
07/09/22 22:36:41
ifとswitchはどのように使い分ければいいですか?

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

132:デフォルトの名無しさん
07/09/22 22:58:04
>>131
具体的に教えてください。

133:デフォルトの名無しさん
07/09/22 22:59:41
>>132
具体的に聞いてください。

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

135:デフォルトの名無しさん
07/09/22 23:05:31
知らなくておk

136:デフォルトの名無しさん
07/09/22 23:07:42
分かったときに分かればいいだけの話

137:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/22 23:16:34
馬鹿な質問に対して列挙型を〜って素直に教えないところがこのスレの優しさだな。

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

140:デフォルトの名無しさん
07/09/22 23:19:48
>>138
皮肉なんか言ってないで教えたらどうなの。

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

142:デフォルトの名無しさん
07/09/23 00:01:27
符号付き整数 x を2のn乗 (n は 0 から 8 の整数) で割って-∞方向の
整数に丸める整数演算はどのようにすればいいでしょうか?
Windows なら右シフトで x >> n のようにできますが処理系定義なので
一般的には右シフトではできないようですが。


143:デフォルトの名無しさん
07/09/23 01:23:10
>>142
x / (1 << n)

144:デフォルトの名無しさん
07/09/23 01:28:14
>>143
それだと負の数が0方向に丸められないか?

145:デフォルトの名無しさん
07/09/23 01:43:54
>>144
んじゃ、負の数ん時は条件分岐して適当にやっておいて。

146:デフォルトの名無しさん
07/09/23 02:38:31
>>127
ファイルが見つかりません。
ならない。

147:デフォルトの名無しさん
07/09/23 02:39:26
ちなみに-(unsigned int)1なら65535になる。

148:デフォルトの名無しさん
07/09/23 02:43:26
へ? (unsigned int)(-1) は UINT_MAX と同じだろ。

149:デフォルトの名無しさん
07/09/23 02:46:46
>>146-147
何でそう思うか、きみが前提としている諸条件と共に述べよ。

150:デフォルトの名無しさん
07/09/23 03:22:22
どーでもいい話してんなお前ら

151:デフォルトの名無しさん
07/09/23 04:45:40
>>149
それはむしろ俺が>>127に言いたいんだが

152:デフォルトの名無しさん
07/09/23 09:48:24
/*奇数か偶数か*/
#include <stdio.h>
int main(void)
{
int no;

printf("整数:"); scanf("%d",&no);

switch (no%2) {
case 0:puts("偶数");break;
case 1:puts("奇数");break;
}
return (0);
}


153:デフォルトの名無しさん
07/09/23 10:14:31
switch (no%2) {
case 0:puts("偶数");break;
case 1:puts("奇数");break;
}



puts((no%2)?"奇数":"偶数");

154:デフォルトの名無しさん
07/09/23 10:15:26
/*月の季節を表示 switchで*/
#include <stdio.h>
int main(void)
{
int no;

printf("月:"); scanf("%d",&no);

switch(no) {
case 3:
case 4:
case 5:puts("春です。");break;
case 6:
case 7:
case 8:puts("夏です。");break;
case 9:
case 10:
case 11:puts("秋です。");break;
default:puts("冬です。");break;
}

return (0);
}




155:デフォルトの名無しさん
07/09/23 10:16:26
>>153
条件演算子は、見にくくなるから使わないほうがいいって言われたんですが、どうなんでしょうか?

156:デフォルトの名無しさん
07/09/23 10:21:29
>>154
そらぁさすがに、defaultはエラー処理に使うべきじゃね?

157:デフォルトの名無しさん
07/09/23 10:22:56
>>155
>>153が見にくい?

158:デフォルトの名無しさん
07/09/23 10:27:14
>>153は十分に可読性を残してるだろ

159:デフォルトの名無しさん
07/09/23 10:39:46
>>50参照。

160:デフォルトの名無しさん
07/09/23 10:40:00
>>41
参照。

161:デフォルトの名無しさん
07/09/23 10:41:06
>>154
/*月の季節を表示 switchで*/
#include <stdio.h>
int main(void)
{
int no;

printf("月:"); scanf("%d",&no);

switch(no) {
case 3:
case 4:
case 5:puts("春です。");break;
case 6:
case 7:
case 8:puts("夏です。");break;
case 9:
case 10:
case 11:puts("秋です。");break;
case 12:
case 1:
case 1:puts("冬です。");break;
default:puts("そんな月ありません。");
}

return (0);
}




162:デフォルトの名無しさん
07/09/23 10:56:22
>>161
バグがある

163:デフォルトの名無しさん
07/09/23 11:08:22
>>154,>>161
何故これを書いたの?この後に質問が続くのか?
先に意図を書いて欲しい...

164:デフォルトの名無しさん
07/09/23 11:15:23
return (0); //(笑)

case 1:
case 2:puts("冬です。");break;
の間違い?

165:デフォルトの名無しさん
07/09/23 11:31:54
>>163
多分>>134の例だろ

166:デフォルトの名無しさん
07/09/23 12:42:42
>>147
6.5.3.3 単項演算子-の結果は,その(拡張された)オペランドの符合を反転した値とする。
オペランドに対して整数拡張を行い,その結果は,拡張された型を持つ。

拡張された型で負数を表現できない場合にどうなるかの記述を見つけることができ
なかったが,拡張された型に変換されると考えれば
(unsigned int)(-1) と -(unsigned int)1 は同じ結果になるんじゃないか?


167:デフォルトの名無しさん
07/09/23 13:36:46
puts("\a負の数を入力しないでください。");
の\aはどんな意味がありますか?

168:デフォルトの名無しさん
07/09/23 13:41:27
>>167
ビープ音を1回鳴らす。

169:デフォルトの名無しさん
07/09/23 13:53:52
\a = alert
実際の動作は処理系依存。
ビープ音もあれば画面をフラッシュさせることもあるらしい。

170:デフォルトの名無しさん
07/09/23 14:11:57
前者はaudible alarm、後者はvisible alarmと言うこともあるね。

171:デフォルトの名無しさん
07/09/23 16:08:05
int no;
int sum;
no=1;
sum=2;

int no=1;
int sum=2;
は同じですか? どちらを使うべきですか?

172:デフォルトの名無しさん
07/09/23 16:09:39
後者は古い規格だと使えない事がある

173:デフォルトの名無しさん
07/09/23 16:23:02
>>172
それはないやろ。

174:デフォルトの名無しさん
07/09/23 16:23:55
いいえ。このスレ的には全く問題ありません。

175:デフォルトの名無しさん
07/09/23 16:25:57
>>172
そうなんですか。前者を使うほうがいいんですね。

176:デフォルトの名無しさん
07/09/23 16:33:04
>>175
いいえ。後者を使うべきです。

177:デフォルトの名無しさん
07/09/23 16:33:33
なんで?

178:デフォルトの名無しさん
07/09/23 16:38:37
前者を使うべき理由がないからです。

179:デフォルトの名無しさん
07/09/23 16:38:43
どっちでもいいだろ

180:デフォルトの名無しさん
07/09/23 16:39:56
それだと 後者を使うべき理由が無いから前者を使うべきです とも言える

181:デフォルトの名無しさん
07/09/23 17:05:35
>>172さんへ
質問者です。それは本当ですか?
ということは、前者を使ったほうがいいってことですか?
どうなんでしょうか?


182:デフォルトの名無しさん
07/09/23 17:09:43
>>181
C89とC99あたりの違いで言ってるんだろうけど本当だよ

183:デフォルトの名無しさん
07/09/23 17:11:06
ボーランドのbccを使っているんですが、
その場合も前者を使ったほうがいいですか?

184:デフォルトの名無しさん
07/09/23 17:12:06
バージョンくらい書けよ

185:デフォルトの名無しさん
07/09/23 17:13:22
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
ってなってます

186:デフォルトの名無しさん
07/09/23 17:14:37
Borland C++Compiler 5.5.1
です。

187:デフォルトの名無しさん
07/09/23 17:43:05
C++だと、初期化と代入が区別されるから、Cでも意識して使いわけてもいいんじゃないか?


188:デフォルトの名無しさん
07/09/23 17:45:33
どういうこと?

189:デフォルトの名無しさん
07/09/23 17:55:52
>>127,146-147,166
(unsigned int)(-1) は 6.3.1.3 p2 により UINT_MAX と同じになる。

"if the new type is unsigned, the value is converted by repeatedly adding or
subtracting one more than the maximum value that can be represented in the new type
until the value is in the range of the new type."

-(unsigned int)1 は 6.2.5 p9 により UINT_MAX と同じになる。

"A computation involving unsigned operands can never overflow,
because a result that cannot be represented by the resulting unsigned integer type is
reduced modulo the number that is one greater than the largest value that can be
represented by the resulting type."

引用は ISO のドラフト (n1124) からね。

190:デフォルトの名無しさん
07/09/23 18:11:50
>>180
いいえ、後者を使うべき理由ならあります。
宣言以降代入までの不定値が存在する期間を排除することができるというのがそれです。

191:デフォルトの名無しさん
07/09/23 18:21:32
互換性のために前者で書いたほうがいい

192:デフォルトの名無しさん
07/09/23 18:26:22
Cで前者にしか対応してないコンパイラがまだまだ普及してる
互換性を切り捨てるには時期尚早

193:デフォルトの名無しさん
07/09/23 18:29:23
っていうか、俺涙目みたいな・・・

194:デフォルトの名無しさん
07/09/23 18:46:58
代入と初期化は違うんだよ!
初期化を怠ると、後でひでーめに遭うんだよ!
むしろ初期化は強制すべきなんだよ!

195:デフォルトの名無しさん
07/09/23 18:51:24
そんな事言ってる君らはどのコンパイラ使ってるの?

196:デフォルトの名無しさん
07/09/23 18:54:37
Kylix

197:デフォルトの名無しさん
07/09/23 18:59:33
>>189
ありがとうございます。勉強になりました。

198:デフォルトの名無しさん
07/09/23 20:01:38
>>194
私をお呼びですか?フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ

199:デフォルトの名無しさん
07/09/23 20:02:50
>194
代入を禁止したらいい。


200:デフォルトの名無しさん
07/09/23 20:09:43
・変数の初期値は必ず決める
・変数への代入は可能な限り行わない(変数を使いまわさない)

でもコンテナとかポインタ先への間接代入はしょうがないよね。


201:デフォルトの名無しさん
07/09/23 20:24:46
関数型言語でおk

202:デフォルトの名無しさん
07/09/23 20:41:26
C++でもSICPの問題がとけるんだからきっとCでも解けるさ

203:デフォルトの名無しさん
07/09/23 21:14:28
>>191
>>192
どこに初期化ができないCコンパイラがあるというんだ?
だれもブロックの途中だなんて一言も言ってないわけで、宣言できる場所でなら初期化代入は必ずできるわけだが。

204:デフォルトの名無しさん
07/09/23 21:29:25
構造体変数のコピー初期化ができないコンパイラには遭ったことがある。
struct s a = {...}; /* これはいける */
struct s b = a; /* こっちはエラー */

205:デフォルトの名無しさん
07/09/23 21:31:01
>>204
スレタイに注目。

206:デフォルトの名無しさん
07/09/23 21:46:28
>>204
こいつ最高にアホ。

207:204
07/09/23 21:47:18
>>205 何か問題でも?

208:デフォルトの名無しさん
07/09/23 22:03:51
K&Rならいざしらず、ISOその他では204ができないといけないことになっている。

209:デフォルトの名無しさん
07/09/23 22:08:32
ビットフィールドは、ビット演算を使わないように気を付ければ移植性は問題無しですか?

210:デフォルトの名無しさん
07/09/23 22:15:17
>>209
メモリ上のレイアウトを意図したビットフィールドの使い方には移植性に問題があります。
ビット演算を使うかどうかは、あんまり関係ないでしょう。

211:209
07/09/23 22:47:20
>>210
どうもありがとう。

ちなみに、処理速度的にはやっぱりビットフィールド使うとたいていの場合遅くなるもんですか?
どっちみち今やってるプログラムはメモリの制約があるので使わざるを得ないんですが…

212:デフォルトの名無しさん
07/09/23 22:55:49
>>211
遅くなることのほうが多いだろうけど、使い方とコンパイラの実装の相性による。
速度は実測が基本。

213:デフォルトの名無しさん
07/09/24 17:19:46
プログラミングが上達するコツ
スレリンク(tech板)

214:デフォルトの名無しさん
07/09/24 21:50:47
clock()が本来返すべき値がclock_tの範囲を超えた場合ってどうなるんですか?

215:デフォルトの名無しさん
07/09/24 21:55:11
If the processor time  used is  not  available  or  its  value cannot be represented, the function shall return the value (clock_t)-1.





216:デフォルトの名無しさん
07/09/24 21:59:26
>>215
ありがとう。

217:デフォルトの名無しさん
07/09/25 15:39:42
int sum;
int dig;
とint sum,dig;
とはどう違いますか?

218:デフォルトの名無しさん
07/09/25 15:59:30
違わない

219:デフォルトの名無しさん
07/09/25 16:17:39
C99の標準機能だけで、UNIXのsleepコマンドみたいな機能は実現可能ですか?

220:デフォルトの名無しさん
07/09/25 16:19:40
whileとforはどう使い分けるべきですか?

221:デフォルトの名無しさん
07/09/25 17:04:51
>>219
不可能

>>220
whileとforの仕様を本当に理解していたらそんな出るはずない
教科書読み直せ

222:デフォルトの名無しさん
07/09/25 17:05:22
×そんな
○そんな質問

223:デフォルトの名無しさん
07/09/25 18:10:20
そんなあー

224:デフォルトの名無しさん
07/09/25 18:20:56
>>223
>>223
>>223
>>223
>>223

225:デフォルトの名無しさん
07/09/25 21:46:08
>>219
system("sleep

226:デフォルトの名無しさん
07/09/25 21:57:02
");

227:デフォルトの名無しさん
07/09/26 00:47:34
JIS X3010 の 6.2.6.2 を読んだだけでは分からなかったのですが
int の負数の表現が 2 の補数で short の負数の表現が 1 の補数
という処理系はありえますか?


228:デフォルトの名無しさん
07/09/26 01:08:58
灯油を燃やした熱で水蒸気を発生させてタービンを回して発電した電力で水を電気分解して得られた水素と酸素を爆発させてシリンダーを動かしてプロペラに伝えて走るホバークラフトくらいにはありえる

229:デフォルトの名無しさん
07/09/26 01:39:47
面白くない

230:デフォルトの名無しさん
07/09/26 01:46:44
>>228
ロジン貸そうか

231:デフォルトの名無しさん
07/09/26 15:21:00
int goto;
int while;
int for;
とかintに関数を使ってもいいですか?

232:デフォルトの名無しさん
07/09/26 15:23:13
>>231
gotoもwhileもforも関数じゃないが、予約語は変数名に使えない。


233:デフォルトの名無しさん
07/09/26 15:43:22
#include <stdio.h>
int main(void)
{
int kara;
int made;
int kankaku;
int cnt;

printf("何cmから:"); scanf("%d",&kara);
printf("何cmまで:"); scanf("%d",&made);
printf("何cmごと:"); scanf("%d",&kankaku);

for (cnt=0; (kara+cnt)<=made; cnt=+kankaku) {
printf("%dcm ",kara+cnt);
printf("%.2fkg\n",(double)(kara+cnt-100)*0.9);
}

return (0);
}

これどこがミスってますか?

234:デフォルトの名無しさん
07/09/26 15:43:33
>>232
thx!

235:デフォルトの名無しさん
07/09/26 15:44:21
>cnt=+kankaku
ですね。thx!

236:デフォルトの名無しさん
07/09/26 19:11:09
while (!cont)
ってどういう意味?


237:デフォルトの名無しさん
07/09/26 19:16:18
!は以外ってこと
contだけのときは、0
!contは!0ってこと。
だから、0以外

238:デフォルトの名無しさん
07/09/26 19:55:47
>>236はどういう意味ですか?
!contっていう部分です

239:デフォルトの名無しさん
07/09/26 19:58:11
否定ってこと。0のこと。

240:デフォルトの名無しさん
07/09/26 20:00:13
>>239
???

>>238
cont=0;
printf("cont=%d !cont=%d\n", cont, !cont);
cont=1;
printf("cont=%d !cont=%d\n", cont, !cont);
cont=2;
printf("cont=%d !cont=%d\n", cont, !cont);
cont=-1;
printf("cont=%d !cont=%d\n", cont, !cont);

241:デフォルトの名無しさん
07/09/26 20:03:21
contの反対ですよ。

242:デフォルトの名無しさん
07/09/26 20:08:26
アホばっか

243:デフォルトの名無しさん
07/09/26 20:08:32
while文は0以外の時に真となりループする。
while(cont)は、contが0以外だったらループする。
while(!cont)は、「contが0以外」以外だったら、つまり0だったらループする。

244:デフォルトの名無しさん
07/09/26 20:12:15
>while(!cont)は、「contが0以外」以外だったら、つまり0だったらループする。
どういう意味?

245:デフォルトの名無しさん
07/09/26 20:28:37
どういう意味もなにも、それ以外の意味は無いんだが…

while ( ! (cont) )

こう書けば分かるかね?論理否定演算子あたりでググってくれ。

246:デフォルトの名無しさん
07/09/26 21:15:22
釣られすぎ

247:デフォルトの名無しさん
07/09/26 21:20:06
コントです

248:デフォルトの名無しさん
07/09/26 23:02:38
誰がうまい事言えと・・・

249:デフォルトの名無しさん
07/09/27 00:37:50
釣りだったのかよ。付き合って損した。こんなことしてもスレ住人が減るだけなのに。

250:デフォルトの名無しさん
07/09/27 14:54:01
型 X と型 Y が signed 付きか unsigned 付きかの違いしかない整数型のとき
X x = A;
Y* y = (Y*)&x;
のあと
(Y)x と *y は同じ結果になりますか?
または ISO/IEC 9899:1990 のどのあたりで分かりますか?


251:デフォルトの名無しさん
07/09/27 15:18:35
>signed 付き
>unsigned 付き

252:デフォルトの名無しさん
07/09/27 16:13:37
#include <stdio.h>
int main(void)
{
int width,height,i,j;

puts("長方形");
printf("幅はいくつ?:"); scanf("%d",&width);
printf("高さはいくつ?:"); scanf("%d",&height);

for (i=1; i<=height; i++) {
for (j=1; j<=width; j++)
putchar('*');
putchar('\n');
}

return (0);
}
を採点してください。こうしたほうが、スマートだよとか、
速いよ、とかあれば教えてください。

253:デフォルトの名無しさん
07/09/27 16:57:42
・scanf()は使わない方がいい。
・個数を回すループは 0 から n 未満とするのが一般的。
・forの中味の行が変わるなら括っておくのが無難。
・一文字変数は避けた方がいい。
・(0)は意味がないので 0 で充分。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5327日前に更新/146 KB
担当:undef