C语言在使用三元运算符?:
时出现的问题
这是一个基础问题,很简单,但是也容易被忽视,所以记录下来以便查看。
今天在写一个宏定义的时候出现了这样一个问题:
#define test(id, able) ((able) ? (id) = 5 : (id) = 7)
在主程序中使用这个宏定义时会报错,例如
void main(void)
{
int x = 1;
test(x, 1);
printf("x = %d\n");
}
此时程序报错
test.c: In function 'main':
test.c:23:50: error: lvalue required as left operand of assignment
翻译:左值需要作为赋值的左操作数
#define test(id, able) ((able) ? (id) = 5 : (id) = 7)
错误分析:这里本人想要程序表达的意思是:如果able
为真,则令id = 5
,否则id = 7
。
但是,由于? :
运算符的优先级比=
(赋值符号)的优先级高,所以编译器将id
作为第三个表达式了,然后将数字7
赋值给? :
运算后的结果,因此出现这样的错误。
修改方法:改为如下方式
#define test(id, able) ((able) ? ((id) = 5) : ((id) = 7))
// 第二个表达式可以不用额外加括号
总结教训:注意运算符的优先级,如果不确定那个优先级高,又懒得查,那就用括号括起来优先级高的表达式