#define ABC 100跟#define ABC 10*10有何区别

如题 6666666666666666666666666666666666666666666666666666666666666666666666666

区别是有的,但因为*的优先级还是比较高的,所以大部分情况下是一样的。
下面举出一个反例(在按位取反的时候):

 #include<stdio.h>

#define ABC1 100
#define ABC2 10 * 10

void main()
{
    int a = ~ABC1;   //结果是-101
    int b = ~ABC2;  //结果是-110
    printf("%d %d\n", a, b);
}

结论:这个主要和运算符的优先级有关,当优先级大于*的时候很有可能出现不一样的结果。
http://baike.baidu.com/link?url=v424B39zkRxkAB4gnfw7nMeZsL_aN7O0nC9yHjDeJ8Q9pm6YKI1H73sznRbQNW9I6Xf4ITOjKILfFUZPlwu-Epo7YuxXvGL2BcR8epQGUBP6a9fTMzLt1D7yPdw5BRX6zLAgotUq9PfokCwEvOIpra

在你遇到的算术中,10*10可能不是一百,按照算式优先级来判断

在复杂表达式中,ABC宏展开后,整个算式的运算优先级可能不符合原来ABC定义的预期。

加个括号就一模一样了图片说明

用define定义的变量都是直接带入的,因此在比较复杂的计算式中,可能由于符号优先级的关系,10*10不是直接运算的,因此会在某些情况下有差异


 #include <stdio.h>

#define ABD 100
#define DEF 10*10

int main()
{
    int x = 200;
    int y,z ;
    y = x * ABD;
    z = x / DEF;

    printf("y = %d x = %d\n",y,z);

    return 0;
}


就像这样一样 你想要的结果是2 可是展开之后变成了200/10 在 *10了 还是看你用在那种情况下

表示:10×10两个问题:1:这样宏定义不打括号会因为优先级出各种玄学错误(查错好难~)
2:这样宏定义每次调用都要计算一次10×10(虽然单就10×10来说浪费的时间不算什么)

那么多解释后,
解决办法:
#define 按照自己计算的方向打上括号
#define ABC (100 100(100+100))
不要想当然。

#define ABC 100#define ABC (10*10)(注意此处加了括号)应该没有区别

宏的本质就是按字面读取解析

还是要记住宏定义其实只是方便人进行程序编辑,编译器在做编译前,会进行关键字匹配,这时候对程序中的宏进行字符替换(ABC换成100、或10*10),
所以就会有运算符优先级的问题出现。

宏定义的本质是文本替换,在程序预编译的时候,编译器会把宏进行文本替换,比如你说的这个 #define ABC 10*10, 所以ABC会被替换成 10*10,注意这里,被替换的10*10并没有被添加(),所以一旦ABC和其他运算符结合起来,很有可能这个运算就被拆开了,例如:
10/ABC 等价于 10/10*10=10,这应该和作者定义的想法不一致了,所以定义宏时最好加上(),这样可以保证不会发声运算顺序的改变。

优先级吧,你可以将代码转换成汇编语言,就可以看到具体的实现了。

在宏展开时不一样,就是简单的文本替换,所以一般加上括号