c语言 宏去除括号,C宏和括号中的参数使用

本文揭示了宏定义中#define Echo(a) a 和 #define Echo(a) (a) 的差异,重点讲解了运算符优先级在实际编程中的影响,通过实例展示了宏定义可能导致的意外计算结果,以及如何避免此类数学错误。
摘要由CSDN通过智能技术生成

仅仅为了记录,我从这里登陆如何在使用宏时修复数学错误,我将尝试在此处扩展此答案以适应其他人。

你在询问有关的区别:#define Echo( a )  a#define Echo( a ) ( a )

只要你不了解自己的宏(我也不是专家:)这是好的。

首先,您已经(可能)知道存在运算符优先级,因此这两个程序存在巨大差异:

1):#include #define ADD( a , b ) a + bint main( void ){

auto const int a = 5;

auto const int b = 10;

auto const int c = ADD (  2 + a ,  2 + b );

printf( "%d", c );

return 0;}

输出:19

和:#include #define ADD( a , b ) ( a ) + ( b )int main( void ){

auto const int a = 5;

auto const int b = 10;

auto const int c = ADD ( a , b );

printf( "%d", c );

return 0;}

输出:

15

现在,让我们preplace +有*:#define ADD( a, b ) a * b

编译器对待a * b例如a == 5,b == 10哪个做5 * 10。

但是,当你说: ADD ( 2 + a * 5 + b ) 喜欢这里:#include #define ADD( a , b ) ( a ) * ( b )int main( void ){

auto const int a = 5;

auto const int b = 10;

auto const int c = ADD ( 2 + a , 5 + b );

printf( "%d", c );

return 0;}

你得到105,因为涉及运营商优先权并对待

2 + b * 5 + a

( 2 + 5 ) * ( 5 + 10 )

是的

( 7 ) *  ( 15 ) == 105

但是当你这样做时:#include #define ADD( a, b ) a * bint main( void ){

auto const int a = 5;

auto const int b = 10;

auto const int c = ADD ( 2 + a , 5 + b );

printf( "%d", c );

return 0;}

你得到的37是因为2 + 5 * 5 + 10

意思是:2 + ( 5 * 5 ) + 10

意思是:2 + 25 + 10

简短的回答,有一个很大的区别:#define ADD( a , b ) a * b

和#define ADD( a , b ) ( a ) * ( a )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值