专栏首页嵌入式大杂烩一道简单但易错的C语言面试题

一道简单但易错的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)

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C语言代码优化的一些经验及小技巧(三)

    简单的循环可以展开以获取更好的性能,但需要付出代码体积增加的代价。循环展开后,循环计数应该越来越小从而执行更少的代码分支。如果循环迭代次数只有几次,那么可以完全...

    正念君
  • 【STM32笔记】使用STM32内部Flash额外的空间来存储数据

    STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码。如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来,存储一...

    正念君
  • 【DSP笔记】TI官方例程中切换RAM、FLASH工程版本的方法

    我们用Visual Studio来开发程序时,可以选择编译Debug版本,也可以选择编译Release版本。Debug版本为调试版本,Release版本为对外发...

    正念君
  • R语言写2048游戏

           2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结...

    用户1680321
  • R条件语句

    但如果你有一长串 if 语句,那么就要考虑重写了。重写的一种方法是使用 switch() 函数, 它先对第一个参数求值,然后按照名称或位置在后面的参数列表中匹...

    生信编程日常
  • 为什么用 if(0 == x) 而不是 if(x == 0) ?

    大家好,今天跟大伙分享一个编程小技巧方面的知识:标题已经给出了,为什么有的人更愿意用 if ( 0 == x)而不是 if(x == 0)?

    7089bAt@PowerLi
  • LeetCode Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume th...

  • LeetCode 125 Valid Palindrome

    题目:https://leetcode.com/problems/valid-palindrome/description/

    ShenduCC
  • python自学第三节课(笔记)

    被缩进的内容(print()函数)和if条件语句组成了一个代码块(一个整体),成为了if条件下的内部命令。

    小老鼠
  • MyBatis <set>标签的使用

    MyBatis在生成update语句时若使用if标签,如果前面的if没有执行,则可能导致有多余逗号的错误。 使用set标签可以将动态的配置SET 关键字,和剔...

    唐怀瑟

扫码关注云+社区

领取腾讯云代金券