私はこれを読みました 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;
}
どのように誤って扱われるか想像するのは難しいですが、動作が定義されていない場合があります。しかし、C++ 11より前では、同じオブジェクトが、介在するシーケンスを指定せずに複数回変更されるため、これは未定義でした。
i
へのすべての変更を統合することにより、コードを「最適化」したコンパイラーを想像することができます。したがって、各増分は元の値を増分することになります。しかし、それは重要ではありません。標準でそう言われている場合、UBはUBです。それが失敗する可能性がある方法を想像できるかどうかは関係ありません。