C++ 与其他编译器相比,相同的代码在MicrosoftStudio上提供不同的输出 inta=10; a=a++; cout

C++ 与其他编译器相比,相同的代码在MicrosoftStudio上提供不同的输出 inta=10; a=a++; cout,c++,algorithm,C++,Algorithm,a=a++不是正确的语句 未定义的行为-对程序的行为没有限制。未定义行为的示例包括数组边界外的内存访问、有符号整数溢出、空指针取消引用、表达式中相同标量的多个修改,这些修改没有任何中间序列点(直到C++11),且未排序(自C++11起),通过不同类型的指针等访问对象。编译器不需要诊断未定义的行为(尽管许多简单的情况都会被诊断),编译的程序也不需要做任何有意义的事情 如果您使用了正确的警告选项,则代码@Ayxan That error message是一个误报警告,被视为错误。由于C++17(您在

a=a++不是正确的语句

未定义的行为-对程序的行为没有限制。未定义行为的示例包括数组边界外的内存访问、有符号整数溢出、空指针取消引用、表达式中相同标量的多个修改,这些修改没有任何中间序列点(直到C++11),且未排序(自C++11起),通过不同类型的指针等访问对象。编译器不需要诊断未定义的行为(尽管许多简单的情况都会被诊断),编译的程序也不需要做任何有意义的事情


如果您使用了正确的警告选项,则代码@Ayxan That error message是一个误报警告,被视为错误。由于C++17(您在链接中使用了C++2a),该行具有定义良好的行为。
-std=c++2a
选项的警告错误。(另请注意:我不建议在默认情况下使用
-Ofast
。它可能会破坏标准一致性。)@walnut这与
-std=c++17
@Ayxan是相同的,在这两种情况下都是假阳性。只有使用
-std=c++14
及更低版本时,该行实际上才具有未定义的行为。请注意,自c++17以来,它已定义了行为。而且,自C++11以来,序列点实际上不再存在。相反,正确的术语是,作业是不排序的,带有递增的副作用。Hi@walnut,已排序的部分包含在引文的突出显示部分,它是在C++17之后定义的行为,这一事实对我来说是新闻,总是在学习。谢谢
int a = 10;

a = a++;

cout << a<<" ";

a++;

cout << a;
a = a++;
++a;
cout<<a;