还有一个与序列点有关的问题

AMS*_*AMS 7 c++

是的我读了关于序列点的文章.但是我无法理解为什么++i = 2会调用未定义的行为?i不管是什么,最终的值都是2,那么为什么表达式是ub?

代码段

int main()
{
  int i =0;
  ++i=2;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

对不起,我的英语不是很好.

Bin*_*ier 11

它看起来很明显的话,因为显然 i首先被分配i+1,然后第二个被分配的值2.

但是,这两个赋值都发生在同一个序列点中,因此它由编译器发生,并且发生在第二个,因此不同的编译器实现可以生成将给出不同结果的代码,因此它是UB.

  • Yeap,并且编译器也不需要在不同的编译中生成相同的程序.在编译时打印0,在另一个上擦除磁盘. (4认同)

sha*_*oth 9

观察它的值将是你要求什么,这是UB如何可以在其他可能的方案中体现出来.该程序可能会输出您的预期,输出一些不相关的数据,崩溃,损坏数据或花费您所有的钱订购披萨.一旦C++标准说某些构造是UB,你就不应该指望任何特定的行为.观察到的结果可能因程序运行而异.