C言語関係掲示板

過去ログ

No.567.副作用完了点について

[戻る] [ホームページ]
No.5180

副作用完了点について
投稿者---BlueGreen(2003/02/15 02:33:24)


処理系によって

i=i++;

の結果が異なるかもしれないのは理解できました。
では、グローバル変数gを変更する関数fooがあるとき、

g=foo();

はどうでしょうか?
この式文のどこに副作用完了点があるかという問題になるかと思うのですが。


No.5186

Re:副作用完了点について
投稿者---かずま(2003/02/15 15:55:44)


> i=i++;

この式文を評価する前に副作用完了点があり、
この式文のセミコロンのところに副作用完了点がありますが、
その 2 つの副作用完了点の間で、i が 2回変更されているので、
i の値が処理系によって異なってしまうということですね。

> では、グローバル変数gを変更する関数fooがあるとき、
> g=foo();
> はどうでしょうか?
> この式文のどこに副作用完了点があるかという問題になるかと思うのですが。

この式文を評価する前に副作用完了点があり、
関数 foo() の中にも副作用完了点がたくさんあり、
この式文のセミコロンのところに副作用完了点があります。

実行順序に従って、隣り合う 2 つの副作用完了点の間で、
g が 2回変更されているのでなければ、何の問題もありません。

No.5197

Re:副作用完了点について
投稿者---BlueGreen(2003/02/16 00:03:25)


回答ありがとうございます。

>実行順序に従って、隣り合う 2 つの副作用完了点の間で、
>g が 2回変更されているのでなければ、何の問題もありません。

関数fooの中には副作用完了点がありますが、
それも含めて実行順序的に隣り合う2つの副作用完了点を
考えれば良いということですね?

関数fooの中身や実行順序を考えず、g=foo();だけを見た場合、
最後のセミコロンのところにしか副作用完了点がないように
思えるので、気になったんです。

ということは、例えば、関数fooの中身が

return ++g;

だけであったとしても、このreturn文で一区切りあるので
「問題なし」なんですね。

もし、この関数が実は(++g)に展開されるマクロだったら
「問題あり」ということですね?