0

誰でも次の出力を説明できますか。私はすべてを推論しようとしましたが、「x」に式の値が割り当てられている後半部分を説明できますが、printfステートメントで答えがどのように異なるかを理解できません!!!

コンパイラが異なれば、動作も異なる場合があります。誰かがコンパイラのこの動作を説明できれば素晴らしいでしょう.

openSUSE 12.1 (アスパラガス) (i586) で gcc (SUSE Linux) 4.6.2 を使用しています。

コード:

#include<stdio.h>

int main()
{
unsigned int x=0;
printf("expr= %d x=%d\n",(x^x),x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
(x^=x);
printf("x=%d\n",x);
x=0;
(x^=x)||x++;
printf("x=%d\n",x);
x=0;
(x^=x)||x++||++x;
printf("x=%d\n",x);
x=0;
(x^=x)||x++||++x||x++;
printf("x=%d\n",x);

return 0;
}

出力:

expr= 0 x=0
x=0
expr= 0 x=1
x=1
expr= 1 x=2
x=2
expr= 1 x=2
x=2
expr= 0 x=1
x=1
expr= 1 x=1
x=1
expr= 1 x=2
x=2
expr= 1 x=2
x=2
x=0
x=1
x=2
x=2

ありがとう

4

2 に答える 2

4

不特定の動作を呼び出しています。

のような式func(a,b)では、C 標準では、どの引数を最初に評価するかを指定していません。コンパイラは、どちらも自由に実行できます。

では、次のことを考慮してくださいfunc(x++,x)。これと同等かどうかは不明です。

a = x++;
b = x;
func(a,b);

またはこれ:

b = x;
a = x++;
func(a,b);
于 2012-01-25T23:03:03.877 に答える
3
printf("expr= %d x=%d\n",(x^x)||x++||++x,x);

この関数は未規定の動作を示します。(x^x)||x++||++xとの間の評価の順序は規定されてxいません。

プログラム内の他のほとんどのprintf呼び出しにも同じ問題があります。

(C99、6.5.2.2) 「関数指定子、実引数、および実引数内の部分式の評価順序は指定されていませんが、実際の呼び出しの前にシーケンス ポイントがあります。」

出力が特定されていない動作に依存するプログラムは、厳密に準拠したプログラムではありません (C99、4.p5 を参照)。

于 2012-01-25T23:10:40.497 に答える