【问题标题】:Why is (n = 0) == 0?为什么(n = 0)== 0?
【发布时间】:2020-03-19 00:35:01
【问题描述】:

有人能解释一下这段代码的原因是什么,为什么会打印出来

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    n = 0;
    if (n = 0)
        printf("a \n");
    else
        printf("b \n");
    return 0;
}

【问题讨论】:

  • if (n = 0)将0赋给变量n并返回0,所以条件为假
  • 改用if (n == 0)
  • 这是一个有趣的故事,讲述了有人试图使用它在 Linux 内核中插入后门:freedom-to-tinker.com/2013/10/09/…

标签: c if-statement variable-assignment


【解决方案1】:

这条指令

if (n = 0) printf("a \n");

会做两件事:

  1. 将 0 分配给 n

  2. 'return' 0 从赋值(这就是像a = b = c 这样的多个内联赋值背后的原因:b = c 将首先将 c 的值分配给 b,然后返回 c 的值,这也将分配给 a)

由于第二点,该指令与

相同
if (0) printf("a \n");

在 C 中,0 被评估为假,所以这就是打印 b 而不是 a 的原因。

请记住,C 和大多数语言中的 equal operator==,而 = 是分配运算符,所以如果你想检查 n 是 0 你应该做这个:

if (n == 0)
    printf("a \n");
else
    printf("b \n");

【讨论】:

    【解决方案2】:

    这不是相等检查,而是赋值。

    表达式n = 0 的计算结果为右侧表达式(或0)的值。由于0 被认为是假的,所以会跳过第一个条件并打印b

    你真正想做的是:

    #include <stdio.h>
    
    int main(void)
    {
        int n = 0;
    
        if (n == 0) /* notice: == */
            printf("a \n");
        else
            printf("b \n");
        return 0;
    }
    

    这里使用了相等运算符==

    【讨论】:

      【解决方案3】:

      因为:

      (n = 0) == 0
      

      = 是 C 中的赋值运算符,它将 0 分配给 nevaluates to the value being attributed。在这种情况下0

      【讨论】:

        【解决方案4】:

        由于n = 0 是一个执行赋值的表达式,所以会发生两件事,

        • n 被赋值为 0
        • 表达式 n = 0 计算结果为 0

        这就是为什么有些人建议将比较写成,

        if( 0 == n ) print("a\n");
        

        这样= 就不会在打算使用== 时意外使用。

        以及为什么有些编译器会警告将赋值(你想要两种行为的地方)写成,

        if( (n = 0) ) print("a\n");
        

        【讨论】:

          【解决方案5】:

          因为那一行:

          if (n = 0)
          

          单个= 用于分配变量。 == 是您在 c 中比较平等的方式。 所以如果你替换

          if (n = 0)
          

          if (n == 0)
          

          那么你应该得到“a”作为你的输出

          【讨论】:

          • 部分:replace n = 0 with n == 0 then you should get b 不正确。
          • 只是语言更正,= 用于分配变量,您可以定义变量而不分配它们。
          • 我很抱歉你的正确@Bwebb 我自己仍然是初学者,为反馈而欢呼!现在不更新了
          猜你喜欢
          • 2020-03-06
          • 2015-05-04
          • 1970-01-01
          • 2018-05-01
          • 2011-01-19
          • 2018-04-14
          • 2011-05-01
          • 1970-01-01
          • 2022-01-23
          相关资源
          最近更新 更多