黑马程序员技术交流社区

标题: 关于宏定义 [打印本页]

作者: 2014571245    时间: 2014-4-26 16:27
标题: 关于宏定义
本帖最后由 2014571245 于 2014-4-27 10:44 编辑
  1. #include <stdio.h>
  2. #define SQUARE(a)((a)*(a))
  3. int main()
  4. {

  5.     int a=5;
  6.     int b;
  7.     b=SQUARE(a++);
  8.     printf("%d,%d\n",a,b);
  9. }
复制代码

为什么结果是7,30  ?


作者: 董月峰    时间: 2014-4-26 16:30
本帖最后由 董月峰 于 2014-4-26 17:42 编辑

首先楼主问的知识跟宏定义关系不大。b=那一行等价于下面
b=(a++)*(a++); //   a自增运算2次,  a++ 是先运算再 自增,所以就是 5* 6, 然后a 从6变7
作者: 执着的土豆    时间: 2014-4-26 16:35
本帖最后由 执着的土豆 于 2014-4-26 16:36 编辑

  当#define SQUARE(a)((a)*(a))调用a时,前面的乘数a  ,调过来时5,调取之后a变成6,后面的乘数调用时,a已经是6,所以5*6=30。调用完之后,a的值变为7。因此输出 b的值为7。  有不明白的请追问。
作者: 王雪冬    时间: 2014-4-26 16:48
请看下面代码:
  1. #include <stdio.h>
  2. #define SQUARE(a)((a)*(a))
  3. int main()
  4. {

  5.     int a=5;
  6.     int b;
  7.     b=SQUARE(a++);
  8.     printf("%d,%d\n",a,b);
  9. }
复制代码

其中
  1. b=SQUARE(a++);
复制代码

会将a计算自加两次,并且是分别两次传递给
  1. ((a)*(a))
复制代码

之后,因为++ 符号在a的后面,先操作a再自加

  1. b=SQUARE(a++);
复制代码

等价与
  1. b=5 * 6;
复制代码

即当a等于6后,又会自加一次,即 a=7;
作者: gaoxinglei123    时间: 2014-4-26 17:33
执行(a++)*(a++)以后a总共自增两次 所以为a为7
再说b 因为(a++)*(a++)的执行过程从左到右是先执行左括号内(a++)执行完时a已经是6但是(a++)值是7 再执行右括号(a++)
同样a的值增为7但是(a++)的值是6 所以b=5*6=30;
作者: liulinjie    时间: 2014-4-26 22:22
是不是不对啊,  b = (a++) * (a++);  应该是整个表达式运算完之后a再自加,  所以应该是 b = 5 * 5 = 25;  之后 a 才自加两次, a = 7.   这个的结果不应该是 7,25 吗?

作者: stevenzhao1977    时间: 2014-4-26 23:34
SQUARE(a)((a)*(a))
SQUARE(a++)-> (a++)*(a++)
因为是加前取值, 第一个 a++ 中 (a++ )取值5, 第二个a++中 (a++)就取值6 了
而运行完第二关a++ ,a 就等于7了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2