2

重複の可能性:
誰でもこれらの未定義の動作を説明できますか (i = i++ + ++i 、 i = i++ など…)

#include<stdio.h>
void call(int,int,int);

int main(){

int a=10;
call(a,a++,++a);
return 0;   
}

void call(int x,int y,int z){
printf("x=%d y=%d z=%d\n",x,y,z);
}

このコードを実行すると、12 11 12 が出力されます。誰かがこれがどのように起こっているかを正確に説明できますか?

4

2 に答える 2

3

2つのbehaviour is undefinedシーケンスポイント間で変数を2回変更するためです。

c99 standard : 5.1.2.3 Program execution

2

"Accessing a volatile object, modifying an object, modifying a file, or calling a function
that does any of those operations are all `side effects` which are changes in the state of
the `execution environment`. Evaluation of an expression may produce side effects. At
certain specified points in the execution sequence called `sequence points`, all side effects
of previous evaluations shall be complete and no side effects of subsequent evaluations
shall have taken place."

aここでは、2つのシーケンスポイント間で変数を2回変更しています。

,拡張編集:これらの概念をすでに知っていて、そのコンマ演算子を考えると、シーケンスポイントであるため、プログラムとして機能するはずです。ここで関数呼び出しでwell defined間違って使用されているのは、,comma separatorcomma operator

于 2012-11-29T15:22:51.830 に答える
3

シーケンス ポイント間で 2 回変更しているため、コードの動作は未定義です。a

call(a,a++,++a);
于 2012-11-29T15:20:15.247 に答える