• ベストアンサー

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 では実行結果が 異なってきますよね。 どうしてなんでしょうか。 まず、?の使い方がよく分かりません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.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)
回答No.2

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の値が同じになっています。 大変ややこしいですが、よく読んで理解いただければ幸いです。

0418
質問者

お礼

大変助かり、理解できました! 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • furyfox
  • ベストアンサー率56% (58/103)
回答No.1

>K++<6 と ++k<6 では実行結果が異なってきますよね。 後置は直前の値を返すのに対して前置はその値を返す。 もしk = 5だとするなら 前者は5<6(真) 後者は6<6(偽) となり結果が変わる。 >まず、?の使い方がよく分かりません。 ?は条件演算子 if (条件) 変数 = 式1 else 変数 = 式2 は 変数 = 条件 ? 式1 : 式2; と書き換える事ができる。

0418
質問者

お礼

大変参考になりました! ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c言語について

    #include <stdio.h> MakeData(int *a,int n){ int i,b[5]={5,1,4,7,2}; for(i=0;i<5;i++){a[i]=b[i];} } BubbleSort(int n,int *a){ ここに流れ図に沿ったプログラムを作る } main(){ int i,n,a[100]; n=5; MakeData(a,n); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); printf("並べ替え後¥n"); BubbleSort(n,a); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); } この課題が分かりません。 もし詳しい方がいらっしゃいましたら教えて頂けると助かります。

  • C言語  九九表

    九九表を作ろうとしたのですが、うまくいきません、解説お願いします。 #include<stdio.h> main() { int i ; int j ; for( i=1 ; i<=10 ; i++){ for( j = 1 ; j<=10 ; j++) { printf("%4d\n") , i*j ; } printf("\n") ; } } 結果 10 -748408832 -748408832 -748408832 -748408832 -748408832 -748408832 -748408832 -748408832 -748408832     が10個続いてました・・・・

  • C言語プログラム 配列

    C言語プログラム初心者です。以下のプログラムに対して、実行結果がなぜそうなるかがわからないので、詳しく教えてください。 #include<stdio.h> int func(int a[ ],int b[ ],int n); main(){ int i,k; static int a[12] ={1,2,3,4,5,(省略)・・・,12};  static int b[12] ={21,22,23,24,(省略)・・・,32}; k = func(a,b,6); k = func(b+3,a+3,6); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\n = b"); for(i=0;i<12;i++)printf("%d",b[i]); printf("\n k = %d\n",k); } int func(int a[ ],int b[ ],int n){ int i,x=0; for(i=0;i<n;i++);{ a[i] = b[i]; x = x+a[i]; } return(x); } 結果: a = 21 22 23 .... 26 7 8 9 10 11 12 b = 21 22 23 .... 26 7 8 9 30 31 32 k = 99

  • C言語

    【プログラム】 #include<stdio.h> int main (void) { int i,n; long a; scanf("%d",&n); a=1; for(i=1;i<=n;i++){ printf("%3d回目 %12ld\n",i,a); a=a*2; } return 0; 【実行結果】("33"と入力) 33 1回目      1 2回目      2 3回目      4 4回目      8  :        :  :        : 31回目 1073741824 32回目 -2147483648 33回目      0 【質問】 2倍していくと、32回目に負の数になり さらに33回目には0になりました。 こうなる理由を教えてください。 私は高2です。 出来ればわかりやすくお願いします。

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • C言語の質問です。

    下記のプログラムを実行すると結果が 10,20 になるですが if(a%2)のところが何が真で何が偽なのかよくわかりません。どなたか教えていただけないでしょうか? #include<stdio.h> main(){   int a, b=0;   for(a=0;a<10;a++){   if(a%2) continue;   b+=a; }   printf("%d,%d\n",a,b); }  

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • C言語 素数判定

    1000以下の素数を求めるプログラム kadai7-2.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 という問題なのですが、以下のプログラムを実行しても動きませんでした。どこが違うのでしょうか。ご指摘お願いします。 #include<stdio.h> #include<math.h> main(){ int i,j,ix,k,h; for (i=2;i<=1000;i++){ ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++){ if(i%j==0){ k=1; } } if(k==0){ printf("%4d",i); h+=1 if(h=15){ printf("\n"); h=0; } }

  • C言語で困っています

    C言語で 100:1 99:2 98:3 .......ループ 1:100とやりたいんですが このやりかたがわかりません goto文などを使うのでしょうか? 一応コードは #include <stdio.h> int main(void) { int i,a; for(i=100; i>=1; i--){ for(a=1; a<=100; a++){ printf("%d:\n",i); break; printf("%d",a); } } return 0; } です まったくこれだと右側が出力されなくてだめみたいです どなたかお知恵をください お願いします

  • C言語で分からないところがあるのですが・・・

    すみません。C言語で分からないところがあったので来ました。 ユーザから数字を任意の数だけ受け取って、その数字とその和を表示するプログラムです。atoiなる関数、そしてコマンドライン引数というのを使って考えてみた結果を下に書きましたので、どなたか修正してください。お願いします。 実行結果(のイメージ図) 20 39 4 sum 20 39 4 63 途中までのソースコードです。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc,char *argv[]) { int sum; int n,i; printf("How many numbers INPUT?: "); scanf("%d", &n); for(i = 0; i <= n; i++){ atoi(argv[i]); } sum = printf("%d",sum); return 0; }

このQ&Aのポイント
  • 来月半月板の内視鏡での手術を控えている妊娠初期の方が、手術前に胃液の逆流症状が出ているため検査薬で妊娠を確認。
  • 手術まで3週間ほどあるが、膝の痛みが激しくなり、手術を決断。睡眠薬や神経系の薬も服用中。
  • どちらに相談すべきか迷っているが、同じ経験がある方のアドバイスを求めている。
回答を見る