- C言語での引数の評価順序について

ゲスト

#include <stdio.h>
void f(int x;int y;int z){
printf(“%d %d %d\n”,x,y,z);
}
int main(){
int n=10;
f(n++, --n, ++n);
return 0;
}
上のようなプログラムを書きCentOSのgccでコンパイルしたところ
10
と表示されました。
予想では
10
と表示されると思ったのですが、なぜ10
コメント

- 2:ゲスト (abc)
- 2008/11/06 22:30
たぶん、f(a,
評価と値というのは、
n=10;
n=10;
ということです。
しかし、すでに述べられているように、コンパイラによって評価順序が異なるので、必ずしもこうはなりません。

- 4:otn
- 2008/11/19 18:35
おもしろいですね。
後ろから順に評価してその都度スタックに積むと思っていましたが、
計算をまず後ろから順に3つ全部した上で、後ろから順に積んでいるようです。
第一引数は
第二引数、第三引数は、すべての計算が終わった後は11なのでその値が積まれます。
都度積むコンパイラもあると思うので、その場合は10,10,11になりますね。
実際、Windowsの「Borland
10,10,11
あと、gcc
前へ 1 次へ![]()
コメントする
[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。
[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。







こういうのは、評価順序の不定とか未定義とか言われる奴で、基本的にやってはいけないこととされていると思います。
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
ここにいろいろ解説されてました。
コンパイラの実装しだいでどうなるかはわからないということなので、やめたほうがよい書き方ですね。