黑马程序员技术交流社区
标题:
关于宏定义
[打印本页]
作者:
2014571245
时间:
2014-4-26 16:27
标题:
关于宏定义
本帖最后由 2014571245 于 2014-4-27 10:44 编辑
#include <stdio.h>
#define SQUARE(a)((a)*(a))
int main()
{
int a=5;
int b;
b=SQUARE(a++);
printf("%d,%d\n",a,b);
}
复制代码
为什么结果是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
请看下面代码:
#include <stdio.h>
#define SQUARE(a)((a)*(a))
int main()
{
int a=5;
int b;
b=SQUARE(a++);
printf("%d,%d\n",a,b);
}
复制代码
其中
b=SQUARE(a++);
复制代码
会将a计算自加两次,并且是分别两次传递给
((a)*(a))
复制代码
之后,因为++ 符号在a的后面,先操作a再自加
即
b=SQUARE(a++);
复制代码
等价与
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