一道简单但易错的C语言面试题
点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记!
大家的小长假过得还好吗,再过两天假期就结束啦,该上班的上班,该上学的上学。
这几天,我做了一件特别不靠谱的事情,感觉很惭愧。前两天一位公众号朋友在本公众号回复了关键字想要获取学习资料,由于链接已经失效了,他联系了我,我用手机更新了一次链接,还是无效(现在公众号里的一些资料链接可能也是无效的,正在想办法解决),于是跟他说晚点我在用电脑试一试看行不行。这几天玩得太浪了,忘了回复他了,等到再联系他时,发现他已经把我给删了。在这里,对这位朋友说一声抱歉
趁着假期还剩下最后两天,尽快调整回之前的状态,多学习多分享。今天我们分享一道简单但易错的C语言的面试题。
题目:分析以下代码,它的运行结果是?
int main(void)
{
int i = -1;
if (i = 0)
printf("i = %d\n", i);
else if (i = 1)
printf("i = %d\n", i);
else
printf("i = %d\n", i);
return 0;
}
备选答案:
A i = 0
B i = 1
C i = -1
D 使用不同的编译器编译运行,结果可能不一样
你选的答案是什么呢?
下面看一下实际运行结果:
正确答案是B选项。首先,要注意的一点是这里的if判断条件里用的是=
号,而不是==
号,这个小陷阱可能会迷惑一些初学C语言的朋友。如果这里用的是==
号的话,正确答案自然就是C选项了。
接下来我们来简单看一下本题答案为什么是B选项。if语句的通用形式为:
if (expression)
statement
可以明确的是:如果对expression为真(非0),则执行statement。本题中,如if (i = 0)
其实就等价于
i = 0;
if (i)
显然这里的if语句的expression为假,不会执行statement。
类似的if (i = 1)
等价于
i = 1;
if (i)
显然这里的if语句的expression为真,执行statement,所以答案为B选项。
总结一下,如果if语句里面是赋值语句的话,则先执行赋值语句,再将赋值语句的结果作为判断条件。在实际应用中,这样的写法其实很常用。比如我们常会对一些带返回值的函数做判断,如:
使用malloc函数申请100个char类型内存单元的空间:
if ((ptr = (char*)malloc(100)) == NULL)
{
printf("malloc error!\n");
exit(EXIT_FAILURE);
}
打开一个文件:
if ((fp = fopen("test", "a+")) == NULL)
{
printf("open file error!\n");
exit(EXIT_FAILURE);
}
类似这样的例子很多,所以我们在使用if语句时,应当多注意使用=
号还是==
号,以免误用符号导致代码产生逻辑错误,毕竟在if判断中使用=
号还是==
号都不会产生编译错误,如果在这里误用了符号而产生bug,则这个bug可能会很隐蔽。
我们建议在使用if语句时,若明确要判断两个值是否相等时,可以把常量放在==
号的左边,变量放在==
号的右边,例如:
if (6 == a)
此时,如果==
号误写为=
号的话,则编译器会报错的,虽然这么写可能看起来会有些别扭,但是这样却利于我们查错。
End:以上就是本次的分享,如有错误,欢迎指出。
猜你喜欢:
我的个人博客:
https://zhengnianli.github.io