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

C++ 是否执行以下C/C++;代码调用未定义的行为?,c++,c,variable-assignment,ternary-operator,undefined-behavior,C++,C,Variable Assignment,Ternary Operator,Undefined Behavior,我的一个朋友告诉我,这引发了未定义的行为,我感觉正好相反。有人能帮我吗?如果要写这样的运算符 int a = 2, b = 3, c = 4, d = 5; a > 1 ? b : c = d; (因为这样在C中被解析),那么它在C++中是有效的,但不会在C中编译,因为在C中,操作符返回rVal.< /P> 如果删除括号,则在C++中,它将等同于 ( a > 1 ? b : c ) = d; a > 1 ? b : c = d; P>操作符在C和C++中的行为不同。在C

我的一个朋友告诉我,这引发了未定义的行为,我感觉正好相反。有人能帮我吗?

如果要写这样的运算符

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

(因为这样在C中被解析),那么它在C++中是有效的,但不会在C中编译,因为在C中,操作符返回rVal.< /P>

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

( a > 1 ? b : c ) = d;
a > 1 ? b : c = d;
<> P>操作符在C和C++中的行为不同。在C记录中

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

( 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中运算符的定义

( a > 1 ? b : c ) = d;
这是C中运算符的定义++

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

正如您所看到的,除了语义差异之外,运算符的语法相对于第三个表达式也存在差异。

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

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

a>1?b:c
将导致一个不能作为赋值运算符左操作数的右值
=

在我看来很好。为什么他认为它会给出未定义的行为?选择一种语言。C/C++不是一种语言,因为它在C和C++中可能会有不同的行为,所以我很高兴听到两种语言之间的细节/差异。区别在于C!=C++。不进行比较。使用术语“C/C++”调用未定义的答案。注意:上述错误仅适用于(代码有效)。