Fen*_*ang 7 c++ undefined-behavior
朋友告诉我,之后:
int C = anything;
Run Code Online (Sandbox Code Playgroud)
C == C++会有价值true.这是一个笑话,对经常声称"C与C++不同"的反驳.
但是,由于==不是序列点,我认为这实际上是未定义的行为.程序可能首先进行评估C++,因此C > C++并且C == C++都是未定义的.但是,C >= C++始终会评估为真.当然,当操作数被翻转时也是如此(C++ <= C总是如此,其他一切都是未定义的).
这个分析是否正确?
Sha*_*our 12
所有案例都会导致未定义的行为和不可预测的结果.
该草案C++ 11的标准告诉我们,除非另有说明操作数的评价的顺序是未测序,如果同一个标对象由unseqeucend副作用比我们不确定的行为修改多于一次.如果我们需要修改对象并且必须为另一个操作数计算对象的值,那么它也是未定义的.这在C++ 11标准草案部分中有所介绍1.9
除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的评估是不确定的.[注意:在程序执行期间不止一次评估的表达式中,不需要在不同的评估中一致地执行对其子表达式的未序列和不确定顺序的评估.-end note]运算符操作数的值计算在运算符结果的值计算之前排序.如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义.
关系运算5.9 符和5.10 等式运算符中的相等运算符或关系运算符都不 指定操作数的排序.
clang还为这种情况提供了一个警告,它看起来像默认情况下,它应该类似于以下内容(见它直播):
warning: unsequenced modification and access to 'C' [-Wunsequenced]
if( C == C++ )
~ ^
Run Code Online (Sandbox Code Playgroud)
这也是C++ 03中未定义的行为,没有使用排序关系的概念而只是序列点.在C++ 03标准草案中,相关部分将是Chapter 5 表达式,其中说:
除非另有说明,否则单个运算符的操作数和各个表达式的子表达式的评估顺序以及副作用的发生顺序是未指定的.57)在前一个和下一个序列点之间,标量对象的存储值应该被修改最多一次通过表达式的评价.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.
由于在相同序列点内对标量值进行多次修改或修改和使用是不确定的行为而不必弄清楚操作的顺序,因此更容易推理.