为了账号安全,请及时绑定邮箱和手机立即绑定

C宏和括号中的参数使用

C宏和括号中的参数使用

C
牧羊人nacy 2019-07-31 10:13:43
C宏和括号中的参数使用例#define Echo(a)  a #define Echo(a) (a)我意识到这里可能没有显着差异,但为什么你想要a在宏体内包括括号内?它是如何改变它的?
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

假设你有

#define mul(x, y)  x * y

如果我说:

mul(a + 5, 6); /* a + 5 * 6 */

现在,如果我轻松改变宏:

#define mul(x, y)  ((x) * (y))mul(a + 5, 6); /* ((a + 5) * (6)) */

请记住,不会评估参数或任何内容,只会执行文本替换。

编辑

有关在括号中包含整个宏的说明,请参阅Nate CK发布的链接


查看完整回答
反对 回复 2019-07-31
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

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

你在询问有关的区别:

#define Echo( a )  a#define Echo( a ) ( a )

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

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

1):

#include <stdio.h>#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 <stdio.h>#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 == 5b == 10哪个做5 * 10

但是,当你说: ADD ( 2 + a * 5 + b ) 喜欢这里:

#include <stdio.h>#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 <stdio.h>#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 )


查看完整回答
反对 回复 2019-07-31
  • 2 回答
  • 0 关注
  • 504 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信