web-dev-qa-db-ja.com

プレフィックス++演算子の繰り返し使用における未定義の動作

私はこれを読みました answer 未定義の振る舞いについて、次のステートメントを見ました:

++++++i;     // UB, parsed as (++(++(++i)))

未定義の振る舞いではないと思います。私は疑問を持っています、それは本当にC++のUBですか?はいの場合、どのように?

また、プログラムを作成し、g++ prog.cpp -Wall -Wextra -std=gnu++1z -pedanticコマンドを使用してコンパイルしましたが、警告なしで正常に動作しています。期待どおりの出力が得られます。

#include <iostream>
using namespace std;

int main()
{
    int i = 0;
    cout<<++++++i<<endl;
}
23
msc

どのように誤って扱われるか想像するのは難しいですが、動作が定義されていない場合があります。しかし、C++ 11より前では、同じオブジェクトが、介在するシーケンスを指定せずに複数回変更されるため、これは未定義でした。

iへのすべての変更を統合することにより、コードを「最適化」したコンパイラーを想像することができます。したがって、各増分は元の値を増分することになります。しかし、それは重要ではありません。標準でそう言われている場合、UBはUBです。それが失敗する可能性がある方法を想像できるかどうかは関係ありません。

9
David Schwartz