为啥(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
计算结果为 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?的主要内容,如果未能解决你的问题,请参考以下文章
在这篇 Kmett CRC 文章中,为啥 ab = a0^n + 0^m b?这个符号是啥意思?