#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 が出力されます。誰かがこれがどのように起こっているかを正確に説明できますか?
#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 が出力されます。誰かがこれがどのように起こっているかを正確に説明できますか?
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 separator
comma operator
シーケンス ポイント間で 2 回変更しているため、コードの動作は未定義です。a
call(a,a++,++a);