A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 2014571245 中级黑马   /  2014-4-26 16:27  /  1298 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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  ?

6 个回复

倒序浏览
本帖最后由 董月峰 于 2014-4-26 17:42 编辑

首先楼主问的知识跟宏定义关系不大。b=那一行等价于下面
b=(a++)*(a++); //   a自增运算2次,  a++ 是先运算再 自增,所以就是 5* 6, 然后a 从6变7

评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 执着的土豆 于 2014-4-26 16:36 编辑

  当#define SQUARE(a)((a)*(a))调用a时,前面的乘数a  ,调过来时5,调取之后a变成6,后面的乘数调用时,a已经是6,所以5*6=30。调用完之后,a的值变为7。因此输出 b的值为7。  有不明白的请追问。
回复 使用道具 举报
请看下面代码:
  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;

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
执行(a++)*(a++)以后a总共自增两次 所以为a为7
再说b 因为(a++)*(a++)的执行过程从左到右是先执行左括号内(a++)执行完时a已经是6但是(a++)值是7 再执行右括号(a++)
同样a的值增为7但是(a++)的值是6 所以b=5*6=30;
回复 使用道具 举报
是不是不对啊,  b = (a++) * (a++);  应该是整个表达式运算完之后a再自加,  所以应该是 b = 5 * 5 = 25;  之后 a 才自加两次, a = 7.   这个的结果不应该是 7,25 吗?
回复 使用道具 举报
SQUARE(a)((a)*(a))
SQUARE(a++)-> (a++)*(a++)
因为是加前取值, 第一个 a++ 中 (a++ )取值5, 第二个a++中 (a++)就取值6 了
而运行完第二关a++ ,a 就等于7了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马