今天有同学问了这道题目,感觉挺有意思的,跟大家细讲一下。
不少同学看到这个题目会觉得,这不很简单吗,三个if判断都不成立,数值不变,选D呗。当然这个题目没这么简单,只考一个if判断整这么复杂干嘛。
我们之前讲过的C语言带参数的宏定义:#define f(X) ((X)*(X)),不知道你收获了多少?根据宏定义,上面的程序应该替换为:
#include<stdio.h>
#define SWAT(t,a,b) t=a;a=b;b=t;
main()
{ int x=6,y=4,z=3,s=0;
if(x<y) s=x;x=y;y=s; //SWAT(s,x,y);
if(x<z) s=x;x=z;z=s; //SWAT(s,x,z);
if(y<z) s=y;y=z;z=s; //SWAT(s,y,z);
printf ("%d,%d,%d\n",x,y,z);
}
其实这样写还不够明了,我们再来改一下:
#include<stdio.h>
#define SWAT(t,a,b) t=a;a=b;b=t;
main()
{ int x=6,y=4,z=3,s=0;
if(x<y) s=x; //条件不成立
x=y; // x=4
y=s; // y=0
if(x<z) s=x; //条件不成立
x=z; // x=3
z=s; // z=0
if(y<z) s=y; //条件不成立
y=z; // y=0
z=s; // z=0
printf ("%d,%d,%d\n",x,y,z);
}
有同学说:唉,老师你这意思不对了?
老师:那里不对了呢,这修改前后意思不是一样的吗?
同学:那一开始就不对了,if后面3个赋值语句应该用个大括号括起来。应该是这样
if(x<y) {s=x;x=y;y=s;} //SWAT(s,x,y);
老师:你说的少一对大括号确实是不少同学写程序时候犯的错误。但是这个题目意思跟你们想的不一样。宏定义只是简单、机械字符替换,定义没有括号,替换也没有括号。之前讲过的C语言带参数的宏定义:#define f(X) ((X)*(X))还要再复习一遍。
接下来就是按照步骤,一步步把数值的变化写出来了。我们写在上面注释里了。
注意:这里不要偷懒,一定要一步步的写出来。有同学说我口算一下就好了,没几步。中间很容易哪一步没仔细就使用了之前的值。结果没算对就打脸了。
这个题目如果我们放在C语言带参数的宏定义:#define f(X) ((X)*(X))里面讲解,估计多数同学都能想到作对。考试就是这样,问这个知识点你可能是记得的,但是看到题目却不一定想到它。多刷题练练感觉也是很重要的。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有