即使给定的l值在三元运算符中很好,赋值语句中的错误

时间:2018-06-21 05:13:01

标签: c operator-precedence conditional-operator

请考虑以下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));

请解释。

2 个答案:

答案 0 :(得分:2)

您可能缺少括号,并且编译器认为您的意思是:

(test ? a = 200 : b) = 300

当您真正要表达的意思时:

test ? (a = 200) : (b = 300)

答案 1 :(得分:2)

与赋值(contramap相比,三元运算符(?:)具有更高的优先级(不是严格)。因此,将赋值语句放在圆括号中可以具有更高的优先级,如下所示:

=

严格来说,这不是运算符优先级的问题,而是语言语法的问题。

根据C Operator Precedence

  

C语言标准未指定运算符优先级。它指定语言语法,并从中派生优先级表以简化理解。语法的一部分不能用优先级表来表示:赋值表达式不能作为条件运算符的右手操作数,因此 e = a 是无法解析的表达式,因此条件和赋值运算符的相对优先级难以描述。

     

但是,许多C编译器使用非标准的表达式语法,其中?:被指定为优先于=的优先级,后者将表达式解析为e =((((a