以下 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
将导致右值不能作为赋值运算符 =
.
的左操作数
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
将导致右值不能作为赋值运算符 =
.