菜鸟C语言几个小问题

2024-12-12 18:28:29
推荐回答(6个)
回答1:

呵呵
===================================================
针对你所提出的第一个问题:

首先阐明一个名词哈---
“不带参数的宏定义”:
用一个指定的标识符(即名字)来代表一个字符串,正如你上面定义的一样,它的一般形式为
#define 标识符 字符串

在预编译时将所定义的标识符替换成指定字符串的过程称为“宏展开”。

好啦,接下来就来回答你所提出的第一个问题。
对宏的展开只是将程序中的那个标识符直接换为你所指定的内容,而不会进行其他任何处理。具体的说,你在程序中定义了#define b a+40
在进行预处理的时候,直接将语句"c=b*20;"中的b替换为了a+40,请注意,不是(a+40)。所以替换后的语句就变为了:c=a+40*20;
由于乘法运算符的优先级高于加法运算符,所以先计算40*20,为800,再计算a+800,所以c的值为880。
如果你想使计算120*20的话,你需要在这样定义:#define b (a+40)

你的第二个程序是类似的情况,在预处理后NN为3+1*3+1/2
有一点需要注意:在C程序中两个整型变量运算,结果还是整型变量,故1/2=0,所以NN=3+3+0=6。
=======================================================
针对你所提出的第二个问题:
switch(w++)
{
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
如果是switch(0)或者是switch(1)或者是switch(2)或者是switch(3),则共同执行一条语句printf("%d",w++);且只执行一次。
否则什么也不执行。

接下来分析此程序是如何运行的:
for(i=0;i<3;i++)
switch(w++)
{
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
w初值为0

i=0,判断i<3?成立,故进入for的第一次循环
进入switch语句,因为w++的值为0(此时w已自加1,即w=1),
故寻找case 0,故执行printf("%d",w++);输出1,并且w再自加1,w=2。

i++;i=1

此时i=1,判断i<3?成立,故进入第二次for循环,进入switch语句,w++的值为1(此时w已自加1,即w=3),
故寻找case 1,故执行printf("%d",w++);输出3,并且w再自加1,w=4。

i++;

此时i=2,判断i<3?成立,故进入第三次for循环,进入switch语句,w++的值为4(此时w已自加1,即w=5),寻找不到相应的case(),从而退出switch语句。

i++;

此时i=3,判断i<3?不成立,故退出for循环,从而结束整个程序。
综上所述,输出结果为13
=====================================================
针对你所提出的第三个问题:
后来我想了一下,结果在TC中是2,在VC中是4,我用的是VC,运行结果为4。其实输出的是一个整型变量在该编译系统下所分配的存储空间的大小。一个int型变量在TC中占两个字节,在VC中占四个字节。
呵呵 好久没看了。
分析如下:
字符数据在内存中的存储形式是以该字符相应的ASCII码存放的,例如字符'a'的ASCII码是97,在内存中实际上是以该字符的ASCII码(也就是97)的二进制形式存放的,程序在读取的时候认为它是一个整型变量,其值为97。
【所以可以对字符型变量作算术运算,其实就是对它们的ASCII码进行算术运算】

直接用 sizeof'A',sizeof函数就把后面的看作是一个整型变量,计算其所占的字节数。

【呵呵 考点啊 这个题目相当的二级啊 呵呵】

=======================================
希望我的回答能帮助你。

回答2:

#define a 80
#define b a+40
main()
{
int c;
c=b*20; //c=a+40*20=880,要注意宏的使用带括号
printf("%d",c);
}
结果怎么试880?不是计算120*20吗?

#define M 3
#define N M+1
#define NN N*N/2
main()
{
printf("%d\n",NN);
}
类似问题结果怎么是6? //同理,注意宏的使用

#include
main()
{
int w=0,i;
for(i=0;i<3;i++)
switch(w++){
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
}
结果怎么是13,
switch(w++){
case 0:
case 1:
case 2:
case 3:printf("%d",w++);怎么个运行法
//case:后面如果不带break;会一直运行下面的分支,就是运行完了case 0,继续执行case 1,...

main()
{
printf("%d",sizeof'A'); //sizeof统计内存大小,我运行的结果就是1,谢谢}

回答3:

1.第一题,请注意c=b*20转为c=a+40*20,宏定义没有括号
2. NN转为N*N/2,然后又转为M+1*M+1/2,问题同第一题,加括号
3+3+0=6
3.case不加break就会顺序执行下去,第一次运行w为0,进入case0,但此时w自加成为1了,顺序执行下去打印1,w又自加一次,变成2,第二次循环,w为2进入case2 但此时w自加变成3了,顺序执行下去打印3,W自加变成4,第三次循环CASE没有匹配的,所以打印了1和3,即13.
4.printf打印的是%d,字符是1,整形是2

回答4:

第一个是c=b*20 等于c=a+20*40也就是80+40*20=880
第二个M+1*M+1/2 等于6.5 你输出的是整型,浮点部分就没有了
第三个switch后w进行自加,变成1,输出1然后自加变成2,再次循环后switch后变成3,输出3后变成4,再次循环运行switch运行default,无输出,所以是13
第四个字符串自带一个结束符占一字节

回答5:

第一个 宏就是单纯的替换 没有计算功能 c=b*20; 就被替换成c=a+40*20;这个应该是880
第二个 3+1*3+1/2就是6.5 %d是输出整数 输出6
第3个 其实是先输出1又输出3
switch(w++){
case 0:
case 1:
case 2:
case 3:printf("%d",w++);}意思是 先把w加1 然后判断 若是0-3就运行printf("%d",w++);(这个意思是先打印出w 然后w加1)
下面分析过程 i=0时候 w=0 然后加1判断是1 就运行printf("%d",w++);显示1 w加1为2
i=1时候w=2 然后加1判断是3 就运行printf("%d",w++);显示3 w加1为4
i=2时候 w=4 然后加1判断是5 没case 5或者default就运行结束switch
i=3时候 for退出 不运行switch 函数退出
第4题 应该是1 也许是编译器问题 你加个括号sizeof('A')

回答6:

见注释:

#define a 80
#define b a+40
main()
{
int c;
c=b*20; // 宏b展开后为:c = 80 + 40 * 20 = 880,如果这样定义宏:
// #define b (a+40)
// 那么就会得到你预期的结果
printf("%d",c);
}
结果怎么试880?不是计算120*20吗?

#define M 3
#define N M+1
#define NN N*N/2
main()
{
printf("%d\n",NN); // 与上题一样,你把宏展开看
// NN = 3+1*3+1/2 = 6.5
// 而输出格式"%d"为整型输出,所以就截断了小数部分输出,因此为6
}
类似问题结果怎么是6?

#include
main()
{
int w=0,i;
for(i=0;i<3;i++)
switch(w++){
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
}
结果怎么是13?

解释:
由于case语句没有使用break跳出,则进入switch都会依次进入每个case语句,我们来看看运行过程:

i = 0时, w为0, 进入switch(w++)先判断(由于是后置版本++),则进入case 0,此时w已经累加为1,依次进入case 1,2, 真正有意义的是进入case 3:printf("%d",w++);同样由于是后置版本++,则先【输出1】,此时w为2;

下一次循环:
i = 1,同理,到case 2, w增加到3,然后到case 3:printf("%d",w++); 【输出3,此时屏幕上显示为13】,此时w增加到4;

i = 2, 由于此时w值为4,switch(w++)已经找不到对应的case了,所有不产生输出;

i = 3, for循环条件不满足,结束循环。

所以最终屏幕输出为: 13

main()
{
printf("%d",sizeof'A'); //若非数组,则sizeof获取类型所占的内存大小,所以此时应该输出为1(char类型所占内存大小为1),你说在你的系统下,输出2,这不太可能(你忽悠我,呵呵)。
}