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

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

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

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页

打赏

pan_pen

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者