一位 friend 告诉我之后:

int C = anything;
C == C++的值为true。这只是一个玩笑,是对经常被称为“C与C++不同”的一种反驳。

但是,由于==不是序列点,因此我认为这实际上是未定义的行为。程序可以首先评估C++,以便C > C++C == C++都未定义。但是,C >= C++将始终评估为true。当翻转操作数时,当然也是如此(C++ <= C始终为true,其他所有内容均未定义)。

这种分析正确吗?

最佳答案

所有情况都会导致undefined behavior和不可预测的结果。

draft C++11 standard告诉我们,除非另有说明,否则操作数的求值顺序是无序列的,并且同一标量对象是否因不连续的副作用而被修改的次数超过了我们未定义的行为的次数。如果我们需要修改对象并必须为另一个操作数计算对象的值,则它也是未定义的。 C++ 11标准草案1.9中对此进行了介绍


5.9关系运算符和5.10相等运算符部分中的相等运算符或关系运算符均未指定操作数的顺序。
clang也针对这种情况提供警告,默认情况下,它看起来类似于以下内容(see it live):

 warning: unsequenced modification and access to 'C' [-Wunsequenced]
  if( C == C++ )
      ~     ^

这在C++ 03中也是未定义的行为,它没有使用顺序关系的概念,而只是使用sequence points。在C++ 03标准草案中,相关部分为Chapter 5 Expressions,其中说:



由于在相同序列点内进行多次修改或对标量值的修改和使用是未定义的行为,而无需弄清楚操作的顺序,因此,这很容易推理。

关于c++ - `C == C++`是不确定的行为吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25965372/

10-13 08:10