プロが教える店舗&オフィスのセキュリティ対策術

式中にインクリメント、デクリメントがある場合、制御の順番はちゃんと定義されていないようですが

・これは、一度コンパイルされてしまったら、もう動作はその時置き換えられた形で固定される。

・同じコンパイラ、同じ環境で、同条件でコンパイルした場合は、まず間違いなく同じ結果が得られる。

・ただし、その順序はコンパイラ毎に違う可能性がある。

という事で正しいですか?

A 回答 (4件)

インクリメントした変数はその文中で1回しか使用したらいけないと言うことでいいと思いますよ。


正確には文ではなくて副作用完了点ですが
例えば
#include <stdio.h>
int main(void)
{
int i = 1;
if (i++ == 1 && i == 2) {
printf("OK");
}
return 0;
}
の場合は && で副作用完了点なのでOKになります
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/20 10:04

>*a++=*b++;



これは全く問題ありません。
1)*a = *b;
2)a++;
3)b++;

2)と3)は逆かもしれませんが、どちらが先でも問題ないですね。

>a[i] = ++i;

これは未定義です。a[i]にアクセスするときのiが、
インクリメントする前なのかした後なのか、
処理系によって異なります。どちらかに決めつけることはできません。
    • good
    • 0
この回答へのお礼

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

a[i] = i++;

の場合はどうなのでしょうか?

お礼日時:2009/01/20 09:58

>式中にインクリメント、デクリメントがある場合、制御の順番はちゃんと定義されていないようですが



ちゃんと定義できる場合もあります。
具体的にどういうコードを想定されていますか?

この回答への補足

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

補足日時:2009/01/20 09:52
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/20 09:45

規格上は、実行するたびに異なるということもありえます。


というか、実行順が結果に影響を与えるようなケースは「未定義」とされていますので、鼻から悪魔が出てきてもかまいません。

ということを踏まえたうえで、
>・これは、一度コンパイルされてしまったら、もう動作はその時置き換えられた形で固定される。

>・同じコンパイラ、同じ環境で、同条件でコンパイルした場合は、まず間違いなく同じ結果が得られる。

>・ただし、その順序はコンパイラ毎に違う可能性がある。

この世に存在するほぼすべての実装はこうなっているでしょう。
ただし、それに頼った書き方をするのは間違いです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

では、具体的にはどういうのがまずくて
どういうのがいいのでしょうか?

例えば

*a++=*b++;

などと言った表記は本やネットで何度も見かけたことがありました。
つまりこのように、式中に一つだけしかなければOKで

a[i] = ++i;



Text = i++ +""+ i++;

などのように
式中に同一の変数が、一度でもインクリメント、デクリメントされている形で複数回あるとNG、ということでしょうか?

お礼日時:2009/01/20 09:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!