• 締切済み

C言語の演算について

次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y+++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

>次のプログラムを実行したらどう出力されますか。  Borland C++5.6.4 で実行したところ、    1, 0, 7, 10, 3, 7 と出力されました。 >人間の頭で結果を出すための計算方法が分からず、頭を悩ませています。  ソースの一部に括弧を付加してみました。一助になれば・・。   int  x = 5;   int  y = 8;   int  z = 3;   int  a, b, c, d, e, f;   a = ( y == ( x + z ) );  // = y と x + z が等しい = 1   b = ! x;         // not true = false = 0   c = x + y / z;      // = 5 + 8 / 3 = 7   d = ( x *= ( z - 1 ) );  // x = 5 * ( 3 - 1 ) = 10   e = --y / --z;      // = 7 / 2 = 3   f = y++ % x++;      // = 7 % 10 = 7

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> 単純に計算だけをして、それぞれの変数に格納されている最終的な値だけを知りたい場合はどうなりますか? 未定義の動作なので、コンパイルが完了するかどうか、コンパイルできても起動するかどうか、起動しても知りたい箇所の演算部分に到達するかどうか、到達しても常に同じ結果になるかどうかなど、すべてがどうなるか分かりません。 処理系が特定できるのであれば、実際に試してみるのが一番です。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 書き換えて再度質問をさせていただいています。 まだ未定義の動作になります。 mainの返却値はintでなければなりません。 独自仕様として動作が既定されている処理系もありますが、処理系を限定していないのであれば、未定義の動作としかいえません。

em-0909
質問者

お礼

再度ありがとうございます。 学校で配られた演算演習のプリントに書かれているプログラムなので、そのような問題点が出てくるとは思ってませんでした。。 単純に計算だけをして、それぞれの変数に格納されている最終的な値だけを知りたい場合はどうなりますか? 基礎的なインクリメントの考え方などが分からなくて困っています。。

  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.2

> 未定義の動作のため、何が起きるかわかりません。 と聞くとやってみたくなる‥。私暇ですね。 ソースをコピペしてコンパイルしてみた。 $ vi test.c # ← コピペしている。 $ make test gcc test.c -o test test.c: In function `main': test.c:14: error: syntax error before '%' token test.c:3: warning: return type of 'main' is not `int' make: *** [test] Error 1 コンパイルエラーが出た。 質問者さんはコンパイルしてみなかったのだろうか‥。 よくわからないけど14行目(f = y+++ % x++;)を コメントアウト(/*f = y+++ % x++;*/)して再挑戦。 $ vi test.c # ← コメントアウトしている。 $ make test gcc test.c -o test test.c: In function `main': test.c:3: warning: return type of 'main' is not `int' コンパイル通った。警告とか無視。いざ実行。 $ ./test 1,0,7,10,3,2013314410 最後の大きな値はコメントアウトした部分の 未初期化のせいなので気にしない。

em-0909
質問者

お礼

回答ありがとうございます。 色々と試してくださり、ありがとうございました。 実は、 f = y+++ % x++; この部分は私の入力ミスです。 正しくは、 f = y++ % x++; です。大変失礼しました。 正しく書き換えて再度質問させていただいております。 そちらもご覧になっていただけると嬉しいです。 私の入力ミスがあったにも関わらず、答えが出力されていますね! ありがとうございます。 質問に記載しているプログラムは、筆記の出題だったのでコンパイルでエラーが出ることに気付きませんでした。。 人間の頭で結果を出すための計算方法が分からず、頭を悩ませています。 考え方もお分かりでしたら、ぜひ教えていただきたいです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

未定義の動作のため、何が起きるかわかりません。

em-0909
質問者

お礼

回答ありがとうございます。 未定義の動作、ですか…。 C言語初心者で詳しい問題点が分からなくて申し訳ありません。 ちなみに、 f = y+++ % x++; のところは入力ミスをしてしまいました。 正しくは、 f = y++ % x++; です。 書き換えて再度質問をさせていただいています。 皆様を混乱させてしまうミスをしてしまい、失礼しました。

関連するQ&A

  • C言語の演算について

    次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。 なお、先ほど記述ミスがあるのにも関わらず投稿してしまいました…。 正しい記述はこちらの質問です。 大変失礼しました。 前の質問は削除可能になり次第、削除いたします。

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • C言語のプログラムについて

    三角形を判定するプログラムを作ったのですが直角三角形ができるはずがないのに直角三角形の判定が出てしまいます。簡単なことなのかもしれませんが自分ではわからなくなってしまったのでご指摘してもらいたいです。 #include<stdio.h> void tri(int x,int y,int z) { if((x*x==y*y+z*z)||(y*y==x*x+z*z)||(z*z==x*x+y*y)) { printf("これは直角三角形です。"); printf("これは三角形です。"); }else if((x+y>=z)||(x+z>=y)||(y+z>=x)) { printf("これは三角形ではありません。"); }else{ printf("これは三角形です。"); } } int main(void) { int e1,e2,e3; printf("3辺を入力してください"); scanf("%f,%f,%f",&e1,&e2,&e3); tri(e1,e2,e3); return(0); }

  • C言語のポインタの考え方について

    ポインタについて理解ができていないのでお聞きしたいのですが 値を交換する関数のプログラミングでこの場合ポインタ で以下にしないといけないと思います。 #include<stdio.h> void swap(int *a int *b){ int c; c=*a; *a=*b; *b=c; } main(){ int x,y; x=123; y=456; swap(&x,&y); printf("x = %d, y = %d\n", x, y); } またポインタを使用せず以下のプログラムではなぜダメのでしょうか。 よろしくお願い致します。 #include<stdio.h> void swap(int a int b){ int c; c=a; a=b; b=c; } main(){ int x,y; x=123; y=456; swap(x,y); printf("x = %d, y = %d\n", x, y); }

  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

  • C言語で連立一次方程式

    C言語で連立一次方程式 /* 連立一次方程式 a*x + b*y = e c*x + d*y = f の解を求めるプログラムを作成したい。 a,b,c,d,e,f をキーボード入力させる ことで、 行列 [a b c d] の逆行列、及び、連立方程式の解( x= , y= )を求めたい。 なお、a b c d の値によっては、逆行列を求めることが 出来ません。その時は、 【解を求めることはできません】 と表示してプログラムを終了するようにして下さい。 (注) [a,b,c,d,e,f]を 2次元配列 ma[2][3]とする. [逆行列[a,b,c,d]と解x,y]を 2次元配列 mb[2][3]とする. ma[][] の値をmain関数内でキーボード入力する mb[][] の値は,mat_keisan関数内で計算 mb[][] の値をmain関数内で表示 関数 mat_keisan の戻り値として,「解」が求まる方程式か どうかを知らせる「int 型のフラグ(旗)」として用いるとよい. */ #include<stdio.h> int mat_keisan(int ma , int mb); int main(void) { int inverse; double ma[2][3]; double mb[2][3]={0}; printf("連立一次方程式の計算\n"); printf("a * x + b * y= e\n"); printf("c * x + d * y= f\n"); printf("Input a :"); scanf("%lf",&ma[1][1]); printf("Input b :"); scanf("%lf",&ma[1][2]); printf("Input c :"); scanf("%lf",&ma[1][3]); printf("Input d :"); scanf("%lf",&ma[2][1]); printf("Input e :"); scanf("%lf",&ma[2][2]); printf("Input f :"); scanf("%lf",&ma[2][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[1][1],ma[1][2],ma[1][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[2][1],ma[2][2],ma[2][3]); inverse=mat_keisan(ma,mb); if(inverse==1) printf("計算できません\n"); else{ printf("逆行列\n"); printf("%4.2f %4.2f\n", mb[1][1],mb[1][2]); printf("%4.2f %4.2f\n", mb[2][1],mb[2][2]); printf("解\n"); printf("x=%4.2f\n",mb[1][3]); printf("y=%4.2f\n",mb[3][3]); } return (0); } /* 配列の足し算 */ int mat_keisan(int ma ,int mb ) { int x,y,z;// 1/ma[1][1]*mb[2][2]-ma[1][2]*mb[2][2]; //逆行列と解を求めるプログラムを作成する。 //そしてその値をmb[][] に入力する。 return(#######); } 関数内が手も足もでません; 他のサイトを調べてみたのですが逆行列を求めるプログラムがよくわかりません; >int mat_keisan(int ma ,int mb ) は、あってないかもです; それとinverseの意味がわかりません; ヒントや、解説を よろしくお願いします;。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語の実数型の足し算

    C言語初心者です。関数の勉強していて、実数型計算に出くわしました。 #include <stdio.h> float add(float a, float b) { return a+b; } int main(void) { float x=10.5,y=20.3; printf("%f %f\n",x,y); printf("%f\n",add(x,y)); return 0; } としたら、 10.500000 20.299999 30.799999 という結果になりました。今のところint型でずーっと勉強していたので、20.3の20.299999表記が怪しく感じられ、結果も同様に怪しく感じられます。どうして、10.5+20.3=30.8とすっっきり表示してくれないのでしょうか。

  • 助けてください(C言語)

    初心者です。 足し算と引き算をするプログラムを作りましたが コンパイルまではとおっていますが、実行し、 5+3= とうつと、804399520 804399524 804399528[1] Done とでます。 どこがいけないのか?ご教授いただければと思います。 回答でなくても良いのでヒントを下さい。 #include<stdio.h> /* 演算を実行し,値を返す関数を設ける */ int tashizan(int keyInpInt1,int keyInpInt2); int hikizan(int keyInpInt1,int keyInpInt2); tashizan(int keyInpInt1,int keyInpInt2) /* 加算 */{ return(keyInpInt1 + keyInpInt2); } hikizan(int keyInpInt1,int keyInpInt2) /* 減算 */{ return(keyInpInt1 - keyInpInt2); } void main(void) { /*入力用と,出力用の変数を定義*/ int keyInpInt1,keyInpInt2,x; char F,tougou; /* 計算式の入力受付 */ printf("式-->"); scanf("%d %c %d %c",&keyInpInt1,&F,&keyInpInt2,&tougou); switch(F){ case '+' :x = tashizan(keyInpInt1,keyInpInt2); break; case '-' :x = hikizan(keyInpInt1,keyInpInt2); break; } /* 演算結果を出力 */ printf("%d %c %d %c %d",&keyInpInt1,&F,&keyInpInt2,&tougou,&x); }

  • C言語の簡単な質問です。

    #include "stdio.h" int tasizan(int a,int b){ int c; c=a+b; return c; } int main(void){ int a,b,c; a=1; b=1; c=tasizan(a,b); printf("%d+%d=%d",a,b,c); return 0; } と、あるとします。この文を読み込む順番を教えてください。  文の左に行番号みたいに順番を書き込んでください。   例 (例が間違ってたらすみません) 1 #include "stdio.h" 2 int main(void){ 3 int a,b,c; 4 a=1; 5 b=2; 6 c=a+b; 7 printf("%d+%d=%d",a,b,c); 8 return 0; }

専門家に質問してみよう