主题:关于define的一个问题
keepspring
[专家分:0] 发布于 2010-04-23 17:18:00
#include <stdlib.h>
#include <stdio.h>
#define SQUARE(a) ((a)*(a))
int main()
{
int a = 5;
int b;
b = SQUARE(a++);
printf("b = %d\n", b);
}
请大家解释一下为什么输出结果是25?
我开始以为是30。。。。
回复列表 (共7个回复)
沙发
roader [专家分:0] 发布于 2010-04-23 18:31:00
5*5=25
板凳
雪光风剑 [专家分:27190] 发布于 2010-04-24 01:48:00
(a++)*(a++)是一个未定义行为,计算结果由编译器决定。不要被某个人写的书误导
3 楼
yansheng [专家分:1530] 发布于 2010-04-24 09:06:00
++后置的话,是在表达式运算完了再++的!我们老师是这么说的!我也是这么认为的!
4 楼
雪光风剑 [专家分:27190] 发布于 2010-04-24 10:52:00
[quote]++后置的话,是在表达式运算完了再++的!我们老师是这么说的!我也是这么认为的![/quote]
这里是运算顺序的问题
(a++)*(a++)
如果两个a++同时取值再算相乘,那么是25
如果先取一个再取一个,就是30了
问题并不在后置++上,而在于同一运算顺序上出了两个东西
5 楼
keepspring [专家分:0] 发布于 2010-04-27 10:18:00
[quote][quote]++后置的话,是在表达式运算完了再++的!我们老师是这么说的!我也是这么认为的![/quote]
这里是运算顺序的问题
(a++)*(a++)
如果两个a++同时取值再算相乘,那么是25
如果先取一个再取一个,就是30了
问题并不在后置++上,而在于同一运算顺序上出了两个东西[/quote]
那就是说define在替换的时候是一次性把要替换的都替换了 而不是先做一个a++再做一个a++
这是他内部的机制了?
6 楼
雪光风剑 [专家分:27190] 发布于 2010-04-27 20:45:00
当然不是,DEFINE只是机械替换,不做任何计算和处理
7 楼
FlowingCloud [专家分:370] 发布于 2010-04-28 00:06:00
b = SQUARE(a++);
-----b = (a++)*(a++)
这个是多少是不确定的,由编译器决定
我来回复