C语言在使用三元运算符?:时出现的问题

本文记录了在C语言中使用三元运算符时遇到的问题,即在宏定义中尝试通过三元运算符进行赋值导致的编译错误。错误分析指出,由于运算符优先级问题,编译器将`id`作为赋值的左操作数,而实际上应是`id`的值被赋。解决方案是通过增加括号来明确运算优先级。博客强调了注意运算符优先级的重要性,并给出了修正后的宏定义。
摘要由CSDN通过智能技术生成

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))
// 第二个表达式可以不用额外加括号

总结教训:注意运算符的优先级,如果不确定那个优先级高,又懒得查,那就用括号括起来优先级高的表达式

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值