• ベストアンサー

c programming language

OrangeCup150の回答

  • ベストアンサー
回答No.3

>kはなぜ0ですか? && 演算子は、左辺と右辺の式を評価して両辺が非ゼロであれば、 1 を片辺または両辺がゼロであれば 0 を返します。 下のコードを実行してみてください。 printf("1 && 1 --> %d\n", 1 && 1); printf("1 && 0 --> %d\n", 1 && 0); printf("0 && 1 --> %d\n", 0 && 1); printf("0 && 0 --> %d\n", 0 && 0); >(i+2,j--)は+-*/の中で何もしなかったのに&&したのでfalseの0が出たんですか? 誤植でしょうか? こちら、(i+=2,j--) としてお答えします。 (i+=2, j--) というのは、 , (comma)演算子が働きます。左辺を評価(実行)し、右辺の評価結果が式の値になります。つまり、 i+=2 と j-- が実行され、式の値は 0 になります。 下のコードを実行してみてください。 int a = 1, b = 2, c = 0; printf("%d:c --> %d\n", __LINE__, c); c = a , b; // c = b printf("%d:c --> %d\n", __LINE__, c); c = b , a; // c = a printf("%d:c --> %d\n", __LINE__, c); >何でこんな結果が出たのでしょ? この行(k=(i+=2,j--)&&(i+=2,j--)&&(i+=2,j--);)の実行結果について整理すると k= (i+=2,j--) // i+=2 実行されます。 j-- 実行されます。 && (i+=2,j--) // i+=2 実行されます。 j-- 実行されます。 && (i+=2,j--); // 実行されません。省略されます。 && 演算子は、実行効率を考慮して、式の評価を省略することがあります。 上記の文は、下のようになります。 式1 && 式2 && 式3 このとき、 && 演算子は左から順番に評価されるため、まず、式1が評価されますが、式1と式2が括弧演算子で囲まれているため括弧内の演算を先に行います。つまり、式1と式2を評価します。 式1 は、(i+=2,j--) とあるので、i+=2 が実行され i が 4 になります。 , (comma)演算子で続く、 j-- が実行され j が 0 になります。 次に式2が評価されます。式1と同じように (i+=2,j--) とあるので i が 6 になります。 j は -1 になります。 ここで、式1と式2の評価が終わったので、 && 演算が行われます。 式1 の評価は 0 式2 の評価は -1 となるので && 演算の結果は、式3を評価せずとも偽 (false) と確定するため、式3は評価されずに k に 0 (false) が設定されます。 このような式3の評価が省略される論理演算を行うことから、&&はショートカット演算子と呼ばれます。 実行効率がよくなる特徴がありますが、式3が評価されないという性質は一般に混乱をきたすため論理演算と算術演算を混ぜることは好ましくありません。 正確な理解をするために、次の括弧演算子付きと括弧演算子なしの実行結果を見比べてみてください。 int a = 0, b = 0, c = 0; a && b++ && c++; printf("a --> %d b --> %d c --> %d\n", a, b, c); int a = 0, b = 0, c = 0; (a) && (b++) && (c++); printf("a --> %d b --> %d c --> %d\n", a, b, c); あと、 +-*/ は、算術演算(+-*/)と書いた方が伝わりやすいと思います。

関連するQ&A

  • グローバル変数の初期化のタイミング

    #include <stdio.h> int i; void main() { int j; printf( "%d\n", i ); printf( "%d\n", j ); } この結果が 0 -85899346 になるのですが グローバル変数 int i は初期化しなくても 0 になるということは 保証されているのでしょうか?

  • 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 languageで 簡単な質問があります

    下のcodeで 1u 2Uはなんですか? void main(void) { int a = -1; if(a < 1u) printf("True"); else printf("False"); } //結果 False void main(void) { if(3 < -2U) printf("Large : %d\n", -2U); else printf("Large : %d\n", 3); } //結果 Large : -2

  • C言語の実行について、

    #include <stdio.h> #define N 2 void main(void) { int i ,j ; for( i=1 ; i <= N ; ++i) { for( j=i ; j < N+2 ; ++j) { printf("j=%d\n",j); } printf("i=%d\n",i); } } を実行すると、 j=1,j=2,j=3,i=1,j=2,j=3,i=2となったんですが、 どういった順序で行われているのでしょうか? よろしくお願いします。

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • 演算子がわかりません。

    最近、Cの勉強を始めたばかりの素人です。以下を実行すると、出力が45になります。iが6になって、jが9になり、掛けるだけなので54になると思うのですが、恥ずかしいことに私の理解力が足りないようです。 お手数ですが、どなたか分かりやすく教えて頂けませんでしょうか。 #include <stdio.h> int main(void) { int i = 5, j = 10, k; k = i++ * --j; printf("%d\n", k); return 0; }

  • pow

    「1~10までの数、 その2乗、 その3乗」を10行出力するものです。 なぜか5^2 = 24 なってしまいました。なぜですか。お願いします。 #include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 3; j++) { printf("%4d ", (int)pow(i+1, j+1)); } printf("\n"); } return 0; }

  • 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言語

    以下の出力結果はどうなりますか? 教えてください。 #include <stdio.h> #include <stdib.h> int main (void){ int n,f; n=792; f=2; while(f*f<=n){ while(n%f==0){ printf("%d",f); n=n/f; } f++; } if(n !=1) printf("%d",n); printf("\n"); return 0; }