一道简单但易错的C语言面试题

题目:分析以下代码,它的运行结果是?

#include <stdio.h> 

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)

此时,如果==号误写为=号的话,则编译器会报错的,虽然这么写可能看起来会有些别扭,但是这样却利于我们查错。

以上就是本次的分享,如有错误,欢迎指出!


我的个人博客:https://zhengnianli.github.io/

我的微信公众号:嵌入式大杂烩

我的CSDN博客:https://blog.csdn.net/zhengnianli


 上一篇
常见的几种AD滤波算法 常见的几种AD滤波算法
在进行AD采样时,常常都会对采样数据进行滤波,以达到更好一点的效果。下面分享几种较简单而常用的滤波算法: 限幅滤波法限幅滤波法又称程序判断滤波法 。该方法根据经验判断,确定两次采样允许的最大偏差值(设为 A)每次检测到新值时判断:如果本次值
2019-10-07
下一篇 
【STM32笔记】复用时钟何时开启呢? 【STM32笔记】复用时钟何时开启呢?
STM32的AFIO时钟真的是在开启引脚复用功能的时候开启吗?其实并不是~ 什么是复用?我们知道,STM32有很多外设,这些外设的外部引脚都是与GPIO共用的。我们可以通过软件来配置引脚作为GPIO引脚还是作为外设引脚。当引脚配置为外设引脚
2019-09-26
  目录