- ベストアンサー
インクリメント、デクリメントの順序について
式中にインクリメント、デクリメントがある場合、制御の順番はちゃんと定義されていないようですが ・これは、一度コンパイルされてしまったら、もう動作はその時置き換えられた形で固定される。 ・同じコンパイラ、同じ環境で、同条件でコンパイルした場合は、まず間違いなく同じ結果が得られる。 ・ただし、その順序はコンパイラ毎に違う可能性がある。 という事で正しいですか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
インクリメントした変数はその文中で1回しか使用したらいけないと言うことでいいと思いますよ。 正確には文ではなくて副作用完了点ですが 例えば #include <stdio.h> int main(void) { int i = 1; if (i++ == 1 && i == 2) { printf("OK"); } return 0; } の場合は && で副作用完了点なのでOKになります
その他の回答 (3)
- asuncion
- ベストアンサー率33% (2127/6289)
>*a++=*b++; これは全く問題ありません。 1)*a = *b; 2)a++; 3)b++; 2)と3)は逆かもしれませんが、どちらが先でも問題ないですね。 >a[i] = ++i; これは未定義です。a[i]にアクセスするときのiが、 インクリメントする前なのかした後なのか、 処理系によって異なります。どちらかに決めつけることはできません。
お礼
えっと・・・つまりやはりインクリメントされたものが複数回含まれると・・・でいいのですか? それともそれだけでは説明しきれないのでしょうか? a[i] = i++; の場合はどうなのでしょうか?
- asuncion
- ベストアンサー率33% (2127/6289)
>式中にインクリメント、デクリメントがある場合、制御の順番はちゃんと定義されていないようですが ちゃんと定義できる場合もあります。 具体的にどういうコードを想定されていますか?
お礼
ありがとうございます。 タイミングが行き違いましたね。 とりあえず、下記のような解釈でいいので問題ないのでしょうか?
補足
すみません 「でいいので問題ないのでしょうか」 は「でいいのでしょうか」 または 「で問題ないのでしょうか」 のいずれかです。
- titokani
- ベストアンサー率19% (341/1726)
規格上は、実行するたびに異なるということもありえます。 というか、実行順が結果に影響を与えるようなケースは「未定義」とされていますので、鼻から悪魔が出てきてもかまいません。 ということを踏まえたうえで、 >・これは、一度コンパイルされてしまったら、もう動作はその時置き換えられた形で固定される。 >・同じコンパイラ、同じ環境で、同条件でコンパイルした場合は、まず間違いなく同じ結果が得られる。 >・ただし、その順序はコンパイラ毎に違う可能性がある。 この世に存在するほぼすべての実装はこうなっているでしょう。 ただし、それに頼った書き方をするのは間違いです。
お礼
ありがとうございます。 では、具体的にはどういうのがまずくて どういうのがいいのでしょうか? 例えば *a++=*b++; などと言った表記は本やネットで何度も見かけたことがありました。 つまりこのように、式中に一つだけしかなければOKで a[i] = ++i; や Text = i++ +""+ i++; などのように 式中に同一の変数が、一度でもインクリメント、デクリメントされている形で複数回あるとNG、ということでしょうか?
お礼
なるほど、そういうことですか! ありがとうございました。