问两个C语言问题,求大虾帮忙

来源:百度知道 编辑:UC知道 时间:2024/06/07 01:46:22
#include"stdio.h"
int main()
{
printf("%d\n",NULL);
}
为什么输出的是0呢
今天被老师问到,竟然说了NULL,真糗大了

还有题
#include<stdio.h>
#define PLUS 4+5
int main(void)
{
int b,c;
b=2;
c=PLUS*b;
printf("%d",c);
return 0;
}
我想问的是#define PLUS 4+5是什么意思 难道是PLUS=4+5吗
如果是的话c=PLUS*b不是即是c=(4+5)*b吗
为什么是c=4+5*b
求大虾帮忙

这两个问题都是理解的问题:
1)NULL是一个宏,它的定义是:#define 0 NULL,所以它就是0,至于显示什么,那就要看以什么方式显示了,%d表示以整型方式显示,故显示0
2)这一点你要理解宏定义的机制,宏定义的作用是为了用户理解或者方便修改,就你的这个程序而言,在编译的时候编译器会自动把PLUS原封不动的换成4+5,不在任何东西,即把PLUS*b换成4+5*b,不存在加括号的事,那是你自己的错误理解。比如第一个程序中的NULL,在编译的时候编译器会自动原封不动的换成0,道理是一样的。
怎样,现在理解了吧!

第一. NULL是个宏,这是stdio.h头文件里包含了的.C语言中,凡是宏都默认规定用大写.NULL是个宏,他就是 0 你可以看到NULL的定义是 #define NULL 0
另,EOF也是个宏,文件结束标志,其实也是0

pringf("%d\n",NULL); 把NULL以%d的形式输出,当然是输出他的数字,也就是0.
如果是
printf("%c\n",NULL) 那就是把NULL以字符的形式输出,但是,并不是'0'数字0的字符,而是ASCII码的第一个,ASCII码=0的那个字符 ,就是\0 字符串结束标志.

2.要清楚的认识宏的定义.宏仅仅是字符替换,并不会额外加一些东西或者自行判断.

所以为什么NULL可以=数字0 也可以等于ASCII码的\0 因为程序什么地方见到了NULL,就可以直接替换成 0 ,这个0到底是什么,会根据当时的环境而定.

这里同样 PLUS被定义成 4+5 那么 凡是PLUS出现的地方,一律可以换成4+5 不能加其他任何符号了.

所以 c=PLUS*b 和 c=4+5*b 没有任何区别.当然,这里很明显,和你想要的答案不一样,因为先乘除后加减.为了避免这种情况,严格的宏定义,一律要在关键地方添加括号.

比如 你要做2个数的平方差的宏
#define PFC(a,b) a*a-b*b
如果你这样定