论坛: 编程破解 标题: C语言的郁闷 复制本贴地址    
作者: sunwu [sunwu]    论坛用户   登录

真是郁闷呀
#include<stdio.h>
#define  MA(x) x*(x-1)
main()
    {
      int a=3,b=4;
      printf("begin:\na=%d b=%d\n",a,b);
      printf("MA1=%d\n",MA(1+a+b));
      printf("MA2=%d\n",(1+a+b)*((1+a+b)-1));
      getchar();
      printf("end!\n");
    }

满以为MA1与MA2的结果应该是一样的。
可是输出的结果就是不一样。

哪位大侠给帮忙看一下?
先谢了。

地主 发表时间: 06-03-28 15:53

回复: sunwu [sunwu]   论坛用户   登录
#include<stdio.h>
#define MIN(x,y)  (x)<(y)? (x):(y)
main()
{ int i,j,k;
i=10; j=15;
k=10*MIN(i,j);
printf("%d\n",k);
}

本以为会在屏幕打印出100,可是结果却是15。



B1层 发表时间: 06-03-28 16:45

回复: sunwu [sunwu]   论坛用户   登录
#include<stdio.h>
main( )
{ int a=3,b=3,k;
k=(++a<0)&&(b--<0);
printf("%d%d%d\n",k,a,b);
}

你认为输出是多少?
042吗?

可输出是:043

这又是为什么呢?


B2层 发表时间: 06-03-28 17:41

回复: frostmoon [frostmoon]   论坛用户   登录
printf("MA1=%d\n",MA(1+a+b));宏展开后就是printf("MA1=%d\n",1+a+b*(1+a+b-1));当然就出错了。。。

B3层 发表时间: 06-03-28 18:13

回复: kert_t8 [kert_t8]   论坛用户   登录
宏这个东西是在预编译的时候展开的,所谓预编译就是直没有编译
因此实际编译的东西就是楼上的朋友说的那样的

方法
#define  MA(x) (x)*((x)-1)

第二个问题与第一个问题是相同的
比较实际上比较的是 10*x 与 y的大小,10*x = 100, y = 15, 因此条件为假,取后者,也就是(y),就是15

地三个问题在于与运算
这个问题有些意思,就是在&&前面那个条件为假的时候,自动的忽略后面的那条语句,因为条件是与,其中一个为假,整体不可能为真,所以后面的(b--<0)根本就没有执行

good luck & have fun




[此贴被 月之御者(kert_t8) 在 03月28日18时56分 编辑过]

B4层 发表时间: 06-03-28 18:55

回复: kert_t8 [kert_t8]   论坛用户   登录
哎呀第一个问题就是加括好啦,想要字体加粗怎么试也不成功,真是的

B5层 发表时间: 06-03-28 18:57

回复: sunwu [sunwu]   论坛用户   登录
感谢frostmoon,感谢月之御者。

你们这样一解释,我才明白过来。

谢谢两位网友的帮忙。

B6层 发表时间: 06-04-01 14:11

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号