3

繰り返しになりますが、私たちの最も愛されている「i=i--」のような問題です。C99には次のものがあります。

6.5式#2:前のシーケンスポイントと次のシーケンスポイントの間で、オブジェクトは保存された値を最大で1回変更する必要があります

70)この段落は!!未定義!!をレンダリングします 次のようなステートメント式

i = ++i + 1;

しかし、未発見の振る舞いについては、ランダムな出力から「文書化された方法でのプログラムの実行」(c99 3.4.3)までのバリエーションが存在する可能性があります。

だから、質問:

gccは、i = i ++、i = i--などのステートメントの動作を文書化していますか?

実際のコードは

int main(){int i=2;i=i--;return i;}
4

4 に答える 4

5

GCCはこの動作を文書化していません。警告オプションページでは、のシーケンスポイントの問題について言及していますが-Wsequence-point、違反について明確に定義されたセマティックを示唆していません。

GCCにはC実装で定義された動作の優れたリストがありますが、ここでもこの問題への参照は見つかりませんでした。

于 2010-08-25T15:24:17.093 に答える
1

それが何をするかを決めるのはバックエンドの実装に任されています。生成されたコードを使用-Sおよび検査して、イベントの正確なシーケンスを判別できます。

于 2010-08-25T15:16:45.007 に答える
1

文書化されていませんが、文書化されていたとしても、読みたくありません。未定義の動作に遭遇したときに、特定の実装が行うことを決して信頼してはなりません。

于 2010-08-25T15:27:51.970 に答える
0

一体なぜあなたはそれをしたいのですか?真剣に。私は興味がある。

于 2010-08-25T15:54:36.100 に答える