以下 C/C++ 代码是否调用未定义的行为?

Does the following C/C++ code invoke undefined behavior?

int a = 2, b = 3, c = 4, d = 5;
a > 1 ? b : c = d;

我的一个朋友告诉我,这会调用未定义的行为,而我的感觉恰恰相反。谁能帮帮我?

如果把运算符写成这样

( a > 1 ? b : c ) = d;

(因为这样它在 C 中被解析)然后它在 C++ 中有效但不会在 C 中编译,因为在 C 中运算符 returns rvalue.

如果删除括号,那么在 C++ 中它将等同于

a > 1 ? b : ( c = d );

因此运算符在 C 和 C++ 中的行为不同。在 C 记录中

a > 1 ? b : c = d;

相当于

( a > 1 ? b : c ) = d;

并且不会被编译。

在 C++ 中记录

a > 1 ? b : c = d;

相当于tp

a > 1 ? b : ( c = d );

并将被编译。

此外,如果用C++重写它,就像在C中解析一样

( a > 1 ? b : c ) = d;

那么它将再次被编译,因为 C++ 中的运算符 returns 左值。

这里是C中运算符的定义

conditional-expression:
       logical-OR-expression
       logical-OR-expression ? expression : conditional-expression

这里是运算符在 C++ 中的定义

conditional-expression:
       logical-or-expression
       logical-or-expression ? expression : assignment-expression

如您所见,除了语义差异之外,与第三个表达式相关的运算符的语法也存在差异。

此代码不会调用未定义的行为,但会在 C 中产生一些错误,因为 a > 1 ? b : c = d; 将被评估为

(a > 1 ? b : c) = d;  

a > 1 ? b : c 将导致右值不能作为赋值运算符 =.

的左操作数