回 帖 发 新 帖 刷新版面

主题:关于define的一个问题

#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个回复)

沙发

5*5=25

板凳

(a++)*(a++)是一个未定义行为,计算结果由编译器决定。不要被某个人写的书误导

3 楼

++后置的话,是在表达式运算完了再++的!我们老师是这么说的!我也是这么认为的!

4 楼

[quote]++后置的话,是在表达式运算完了再++的!我们老师是这么说的!我也是这么认为的![/quote]
这里是运算顺序的问题
(a++)*(a++)
如果两个a++同时取值再算相乘,那么是25
如果先取一个再取一个,就是30了
问题并不在后置++上,而在于同一运算顺序上出了两个东西

5 楼

[quote][quote]++后置的话,是在表达式运算完了再++的!我们老师是这么说的!我也是这么认为的![/quote]
这里是运算顺序的问题
(a++)*(a++)
如果两个a++同时取值再算相乘,那么是25
如果先取一个再取一个,就是30了
问题并不在后置++上,而在于同一运算顺序上出了两个东西[/quote]

那就是说define在替换的时候是一次性把要替换的都替换了  而不是先做一个a++再做一个a++
这是他内部的机制了?

6 楼

当然不是,DEFINE只是机械替换,不做任何计算和处理

7 楼

b = SQUARE(a++);
-----b = (a++)*(a++)
这个是多少是不确定的,由编译器决定

我来回复

您尚未登录,请登录后再回复。点此登录或注册