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

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

本文关键字:未定义 调用 是否 C++ 代码 以下      更新时间:2023-10-16
int a = 2, b = 3, c = 4, d = 5;
a > 1 ? b : c = d;

我的一位朋友告诉我,这引发了未定义的行为,我觉得恰恰相反。谁能帮我?

如果写运算符像

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

(因为以这种方式在 C 中解析(那么它在 C++ 中有效,但不会在 C 中编译,因为在 C 中运算符返回 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++ 中的运算符返回 lvalue。

这是 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将导致右值不能是赋值运算符 = 的左操作数。

相关文章: