4

C/C++ 三元运算符实际上是否具有与赋值运算符相同的优先级?

Luchian Grigore 的回答说这样的情况

a ? b : c = d

将始终被推断为

a ? b : ( c = d )

因为 = 和 ?: 从右到左关联所以

在 C++ 中

k =  21 > 3 ? j = 12 : j = 10;

k = 1 > 3 ? j = 12 : j = 10;

两者都很好。

在 C 中

k = 21 > 3 ? 12 : j = 10

返回错误

invalid lvalue in assignment.

上面不应该被推断为(并且不返回错误)

k=  21 > 3 ? 12 : ( j = 10 )

我认为现在它被分组为

k = ( 21 > 3 ? 12 : j ) = 10

这给出了错误,因为在 C(不是在 C++ 中)三元运算符不能返回左值。谁能告诉我在这种情况下如何对运算符进行分组。

4

2 回答 2

2

您的链接问题(C/C++ 三元运算符是否实际上与赋值运算符具有相同的优先级?)@hvd 的回答显示了答案。

C++ 和 C 的语法?:是不同的。

在 C++ 中,允许最右边的操作数是赋值表达式(因此编译器 [贪婪地] 将=are 视为 的一部分?:),而在 C 中,最右边的操作数是 a conditional-expression。因此,在 C 中,一旦编译器点击 ,=分析?:就完成了,并将其视为k = ( 21 > 3 ? 12 : j ) = 10.

于 2013-07-01T14:54:24.517 回答
-1

k=21>3?12:(j=10)被评估为

if ( 21 > 3 )
    k = 12;
else
    k = ( j = 10 );

由于21>3is true, else 条件不会被评估并且j具有未定义的值(或它在此语句之前具有的任何值)。

于 2013-07-01T14:20:59.657 回答