以下是引用TonyDeng在2013-2-17 15:18:42的发言:
你留意一下编译器给出的出错信息,那就是它的理解。
d = a=1?b=2:c=3;
一般地,编译器从左到右分析语句字符串,它可能先看到d=a=1这个赋值语句,然后把这个作为三目的第一项条件,发现了?是合法的,但第二项只会结合到b,被红色的=号拦断了,它会视这个等号为赋值语句,但这里的左边不是左值,无法赋值。也就是说,它理解的是这样:
((d=a=1)?b)=2:c=3;
这肯定不合法。
三目运算符,只是作三个表达式变换,不是什么严谨的语法。A ? B : C,编译器的处理是把这个表达式展开为if(A) { B } else { C },它要求A、B、C三项是完整的、合法的表达式。所以合适的写法是把三项均用圆括号括起来,让编译器能够轻松找到三目进行替换,否则由着它自己判断,往往出错。
代码与运行结果如下:#include <stdio.h>
int main(int argc, int **argv)
{
int a=0;
int b=0;
int c=0;
int d=0;
d=a=1?b=2:(c=3);
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
return 0;
}
[root@localhost yyDigital]# ./sanmu
a=2,b=2,c=0,d=2