• ベストアンサー

インクリメント、デクリメントの順序について

式中にインクリメント、デクリメントがある場合、制御の順番はちゃんと定義されていないようですが ・これは、一度コンパイルされてしまったら、もう動作はその時置き換えられた形で固定される。 ・同じコンパイラ、同じ環境で、同条件でコンパイルした場合は、まず間違いなく同じ結果が得られる。 ・ただし、その順序はコンパイラ毎に違う可能性がある。 という事で正しいですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

インクリメントした変数はその文中で1回しか使用したらいけないと言うことでいいと思いますよ。 正確には文ではなくて副作用完了点ですが 例えば #include <stdio.h> int main(void) { int i = 1; if (i++ == 1 && i == 2) { printf("OK"); } return 0; } の場合は && で副作用完了点なのでOKになります

FBL
質問者

お礼

なるほど、そういうことですか! ありがとうございました。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

>*a++=*b++; これは全く問題ありません。 1)*a = *b; 2)a++; 3)b++; 2)と3)は逆かもしれませんが、どちらが先でも問題ないですね。 >a[i] = ++i; これは未定義です。a[i]にアクセスするときのiが、 インクリメントする前なのかした後なのか、 処理系によって異なります。どちらかに決めつけることはできません。

FBL
質問者

お礼

えっと・・・つまりやはりインクリメントされたものが複数回含まれると・・・でいいのですか? それともそれだけでは説明しきれないのでしょうか? a[i] = i++; の場合はどうなのでしょうか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>式中にインクリメント、デクリメントがある場合、制御の順番はちゃんと定義されていないようですが ちゃんと定義できる場合もあります。 具体的にどういうコードを想定されていますか?

FBL
質問者

お礼

ありがとうございます。 タイミングが行き違いましたね。 とりあえず、下記のような解釈でいいので問題ないのでしょうか?

FBL
質問者

補足

すみません 「でいいので問題ないのでしょうか」 は「でいいのでしょうか」 または 「で問題ないのでしょうか」 のいずれかです。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

規格上は、実行するたびに異なるということもありえます。 というか、実行順が結果に影響を与えるようなケースは「未定義」とされていますので、鼻から悪魔が出てきてもかまいません。 ということを踏まえたうえで、 >・これは、一度コンパイルされてしまったら、もう動作はその時置き換えられた形で固定される。 >・同じコンパイラ、同じ環境で、同条件でコンパイルした場合は、まず間違いなく同じ結果が得られる。 >・ただし、その順序はコンパイラ毎に違う可能性がある。 この世に存在するほぼすべての実装はこうなっているでしょう。 ただし、それに頼った書き方をするのは間違いです。

FBL
質問者

お礼

ありがとうございます。 では、具体的にはどういうのがまずくて どういうのがいいのでしょうか? 例えば *a++=*b++; などと言った表記は本やネットで何度も見かけたことがありました。 つまりこのように、式中に一つだけしかなければOKで a[i] = ++i; や Text = i++ +""+ i++; などのように 式中に同一の変数が、一度でもインクリメント、デクリメントされている形で複数回あるとNG、ということでしょうか?

関連するQ&A