- ベストアンサー
C言語 解釈の違い
#include <stdio.h> main() { int k, a[10], i; for(i=0;i<10;i++) a[i]=i; k=5; a[k]=(k>5 || k++<6)? 10: 20; for(i=0;i<10;i++) printf("%d\n", a[i]); } このプログラムについてなんですが、 a[k]=(k>5 || k++<6)? 10: 20; 特に、この部分について教えてください。 K++<6 と ++k<6 では実行結果が 異なってきますよね。 どうしてなんでしょうか。 まず、?の使い方がよく分かりません。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2の書き間違いの訂正と補足です。 訂正 中断の&&演算子と||演算子の振る舞いについての説明にて 誤: &&演算子と||演算子は前の項が真になると、後ろの項は評価しません。 正: &&演算子は前の項が偽になると、後ろの項は評価されません。同様に||演算子は前の項が真になると、後ろの項は評価されません。 一番最後の++kの場合の説明の部分にて 誤: a[k]=(k>5 || k++<6)? 10: 20; 正: a[k]=(k>5 || ++k<6)? 10: 20; 補足説明 a[k]=(k>5 || k++<6)? 10: 20; を?演算子も||演算子も使わずにif文を使って書き直すと if(k > 5) a[k]=10; else if(k < 6) a[k]=10; else a[k]=20; k++; となります。 また、 a[k]=(k>5 || ++k<6)? 10: 20; を同様にif文を使って書き直すと if(k > 5) a[k]=10; else { int l; l=k; ++k; if(k < 6) a[l]=10; else a[l]=20; } となります。
その他の回答 (2)
- rentahero
- ベストアンサー率53% (182/342)
a[k]=(k>5 || k++<6)? 10: 20; この式を、if文を使って書き換えてみましょう。 ?演算子の説明は#1のかたの説明のとおりですので、省略します。 if(k>5 || k++<6) a[k]=10; else a[k]=20; となります。 また、前置インクリメントと後置インクリメントの違いですが k=0; i=k++; printf("i=%d,k=%d\n", i, k); と k=0; i= (++k); printf("i=%d,k=%d\n", i, k); を実行してみれば実感できます。 さて、蛇足かもしれませんが、これ、副作用のある演算子を特定の状況で利用するコードなので、危険なコードです。(コメントがないと後で読んだときに混乱すること確定です) &&演算子と||演算子は前の項が真になると、後ろの項は評価しません。 したがって、以下の式では副作用により、意図しないことが起こることがあります。 a[k]=(k>5 || k++<6)? 10: 20; k=4のとき a[k]=( k(=4)>5(偽) || k++(=4)<6(真))(真)?10:20; a[4]には10が代入され、kは5です。 k=5のとき a[k]=( k(=5)>5(偽) || k++(=5)<6(真))(真)?10:20; a[5]には10が代入され、kは6です。* k=6のとき a[k]=( k(=6)>6(真) || k++<6(評価されない))(真)?10:20; a[6]には10が代入され、kは6です。* *をつけた2つの場合でその式の通過後のkの値が同じになっています。 また、 a[k]=(k>5 || k++<6)? 10: 20; k=4のとき a[k]=( k(=4)>5(偽) || ++k(=5)<6(真))(真)?10:20; a[4]には10が代入され、kは5です。 k=5のとき a[k]=( k(=5)>5(偽) || ++k(=6)<6(偽))(偽)?10:20; a[5]には20が代入され、kは6です。* k=6のとき a[k]=( k(=6)>6(真) || ++k<6(評価されない))(真)?10:20; a[6]には10が代入され、kは6です。* やはり*をつけた2つの場合でその式の通過後のkの値が同じになっています。 大変ややこしいですが、よく読んで理解いただければ幸いです。
- furyfox
- ベストアンサー率56% (58/103)
>K++<6 と ++k<6 では実行結果が異なってきますよね。 後置は直前の値を返すのに対して前置はその値を返す。 もしk = 5だとするなら 前者は5<6(真) 後者は6<6(偽) となり結果が変わる。 >まず、?の使い方がよく分かりません。 ?は条件演算子 if (条件) 変数 = 式1 else 変数 = 式2 は 変数 = 条件 ? 式1 : 式2; と書き換える事ができる。
お礼
大変参考になりました! ありがとうございます。
お礼
大変助かり、理解できました! 有難うございました。