为啥(n = 0)== 0?

Posted

技术标签:

【中文标题】为啥(n = 0)== 0?【英文标题】: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/… 【参考方案1】:

这条指令

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

会做两件事:

    将 0 分配给 n

    '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 分配给 n 和 evaluates 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 我自己仍然是初学者,为反馈而欢呼!现在不更新了

以上是关于为啥(n = 0)== 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 5/7 打印 0?

在这篇 Kmett CRC 文章中,为啥 ab = a0^n + 0^m b?这个符号是啥意思?

为啥 np.dot 不精确? (n 维数组)

getItem 为啥返回 'Promise "_U": 0, "_V": 0, "_W": null, "_X": n

为啥进不了for循环,得到的结果总是0? 求大神指教啊!!

c语言问题 int short 转换问题 求解下面short时候为啥i+k《0