我通读了几个关于未定义行为和序列点(例如未定义行为和序列点)的非常好的答案,我明白了,
int i = 1;
a = i + i++; //this is undefined behaviour
根据 C++ 标准,是未定义的代码。但是,未定义行为背后的更深层原因是什么?使它成为未指定的行为还不够吗?通常的论点是,通过很少的序列点,C++ 编译器可以针对不同的体系结构进行更好的优化,但是不指定它是否也允许这些优化?在
a = foo(bar(1), bar(2)); //this is unspecified behaviour
编译器也可以优化,它不是未定义的行为。在第一个示例中,a 是 2 或 3 似乎很清楚,所以语义对我来说似乎很清楚。我希望有一个推理,为什么有些事情是未指定的,而另一些是未定义的。