4

コンパイラの最適化は、結果をもたらさない特定のステートメントの評価をスキップすることがあります。しかし、これはコンマ演算子にも当てはまりますか?

次のコードはideoneでエラーなしで実行されますが、クラッシュすると予想していました。

#include <iostream>

int main() {
    int x = (1/0, 2);
    std::cout << x << std::endl;
}

ステートメントを次のように変更すると、プログラムがクラッシュしますint x = 1/0;

4

1 に答える 1

8

コンパイラの最適化では、As-if ルールが使用されます。

仮定のルール

プログラムの観察可能な動作を変更しないすべてのコード変換を許可します

はい、コンパイラはこれを最適化できます。次の変更されたサンプルを確認してください。

#include <iostream>

int main() 
{
    int y = 1;
    int x = (y=1/0, 2);
    std::cout << x << std::endl;
    //std::cout << y << std::endl;
} 

最後の行にコメントを付けると、このコードが正しくコンパイルおよび実行されますが、コメントを外すと、予想される未定義の動作が発生します。

@jogojapan が正しく指摘しているように
、コンパイラの最適化は標準では保証されておらず、ゼロ除算は未定義の動作であることに注意することが重要です。したがって、このコードには未定義の動作があります。観察可能な動作が、ゼロ除算を最適化するコンパイラによるものなのか、未定義の動作によるものなのかはわかりません。技術的には、未定義の動作です。

于 2013-02-21T06:14:35.350 に答える