请考虑以下C代码。
#include <stdio.h>
int main(void)
{
int test = 0;
int a= 10,b = 20;
test ? a*2 : b*3;
printf("a = %d, b = %d\n",(test ? a = 200 : b = 300),(test ? a =2 : b = 3));
return 0;
}
尝试编译时会引发以下错误。
file1.c:11:50: error: lvalue required as left operand of assignment
printf("a = %d, b = %d\n",(test ? a = 200 : b = 300),(test ? a =2 : b = 3));
^
file1.c:11:74: error: lvalue required as left operand of assignment
printf("a = %d, b = %d\n",(test ? a = 200 : b = 300),(test ? a =2 : b = 3));
^
我已经提供了一个l值作为赋值操作的左操作数,此外为什么它不会在行中抛出错误
test ? a*2 : b*3;
并且仅在行
中产生错误printf("a = %d, b = %d\n",(test ? a = 200 : b = 300),(test ? a =2 : b = 3));
请解释。
答案 0 :(得分:2)
您可能缺少括号,并且编译器认为您的意思是:
(test ? a = 200 : b) = 300
当您真正要表达的意思时:
test ? (a = 200) : (b = 300)
答案 1 :(得分:2)
与赋值(contramap
相比,三元运算符(?:
)具有更高的优先级(不是严格)。因此,将赋值语句放在圆括号中可以具有更高的优先级,如下所示:
=
严格来说,这不是运算符优先级的问题,而是语言语法的问题。
C语言标准未指定运算符优先级。它指定语言语法,并从中派生优先级表以简化理解。语法的一部分不能用优先级表来表示:赋值表达式不能作为条件运算符的右手操作数,因此 e = a
是无法解析的表达式,因此条件和赋值运算符的相对优先级难以描述。 但是,许多C编译器使用非标准的表达式语法,其中?:被指定为优先于=的优先级,后者将表达式解析为e =((((a