ページ 1 / 1
演算順序が良くわかりません
Posted: 2013年2月15日(金) 17:46
by dom
コード:
int main()
{
int N = 100, a = 0;
for (int i = 0; i < 200; i++) {
std::cout << a << std::endl;
a = (a++) % N;
}
return 0;
}
すべてのiについてaは0~99であってほしいのに、あるところでaが100となります。
考えたところ,
a = a % N;
a++;
となっているようなのですが、なぜこうなるのでしょうか?
Re: 演算順序が良くわかりません
Posted: 2013年2月15日(金) 17:55
by h2so5
Re: 演算順序が良くわかりません
Posted: 2013年2月15日(金) 18:52
by dom
文が終わってから評価されるということですか。そうすると、
後置増分演算子の順位はなんのために存在するのでしょうか?
Re: 演算順序が良くわかりません
Posted: 2013年2月15日(金) 19:17
by non
dom さんが書きました:後置増分演算子の順位はなんのために存在するのでしょうか?
面白い疑問ですね。演算順位であるのはおかしい。確かに。
すると、コンパイラの評価順ってことでしょうかね。
例えば
c=a+++b;
の場合、c=(a++)+b;のようにコンパイラが評価する。
Re: 演算順序が良くわかりません
Posted: 2013年2月15日(金) 19:49
by softya(ソフト屋)
副作用完了点までの間に変数を2度変更していることになるので、どうなるかは規約的には未定義だと思います。
「初級C言語Q&A(7)」
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
ここでは単に未定義って書いてありますね。
Re: 演算順序が良くわかりません
Posted: 2013年2月15日(金) 20:28
by dom
なるほど、式の中でいつインクリメントされるかは決まっていないのですね。
ありがとうございます、解決しました。