Avatar ·

什么是序列点(sequence points),它们与C++中的未定义行为有何关联?

大家好!我开始学习C++,遇到了一个非常奇怪的情况。写了一个简单的代码: ```cpp int i = 0; int result = i++ + i++; ``` 我期望result等于1(0 + 1),但编译器有时输出0,有时输出1,有时甚至输出其他数字。如果写成`i = i++ + 1`,结果更是完全不可预测。有人告诉我,这与“序列点”(sequence points)和“未定义行为”(undefined behavior)有关。但我不明白这是什么意思。能用简单的话解释一下吗?为什么编译器不能简单地从左到右执行操作?如何判断代码在哪些情况下是安全的,哪些情况下不安全?请给出正确和错误代码的例子。 <<>>

什么是序列点?

序列点(sequence points)是程序执行中的时刻,在这些时刻,之前所有计算的副作用都保证已完成,而后续计算尚未开始。简单来说:它们是“检查点”,在这些点上状态是确定的。