当前位置: 首页 > 知识库问答 >
问题:

为什么组合赋值和相等检查的if语句返回true?

程俊力
2023-03-14

我一直在想一些初学者的错误,最后我犯了if语句中的错误。我对代码进行了一些扩展:

int i = 0;
if (i = 1 && i == 0) {
    std::cout << i;
}

我已经看到if语句返回true,它不能I1。如果在If语句中分配了i,为什么i==0返回true


共有3个答案

狄凯
2023-03-14

实际的答案是:

  1. 编译器优先考虑i==0,它的计算结果为true。
  2. 然后它将i=1求值为TRUE或FALSE,并且由于编译的赋值操作符永远不会失败(否则它们不会编译),它也求值为true。
  3. 因为两个语句都评估为true和TRUE

作为证明,只要看看你输入的代码的编译器的ASM输出(所有注释都是我自己的):

mov     dword ptr [rbp - 8], 0    ; i = 0;
cmp     dword ptr [rbp - 8], 0    ; i == 0?
sete    al                        ; TRUE (=1)
mov     cl, al
and     cl, 1                     ; = operator always TRUE
movzx   edx, cl
mov     dword ptr [rbp - 8], edx  ; set i=TRUE;
test    al, 1                     ; al never changed,
                                  ; so final ans is TRUE

上面的asm输出来自于CLANG,但我看到的所有其他编译器都给出了类似的输出。这适用于该站点上的所有编译器,无论它们是纯C编译器还是C编译器,都不需要任何杂注来更改编译器的模式(对于C编译器,默认情况下是C)

请注意,编译器实际上并没有设置i=1,而是i=TRUE(这意味着任何32位的非零整数值)。那是因为

郭建华
2023-03-14

假设您的代码实际上是这样的:

#include <iostream>
using namespace std;

int main()  {
    int i = 0;
    if (i = 1 && i == 0) {
        cout << i;
    }
}

然后这个:

if (i = 1 && i == 0) {

评估为

 if (i = (1 && i == 0)) {

因此i被设置为1

陶星波
2023-03-14

这与运算符优先级有关。

if (i = 1 && i == 0)

不是

if ((i = 1) && (i == 0))

因为两者都

if (i = (1 && (i == 0)))

指定1的结果

 类似资料:
  • 当Java if语句同时具有赋值和相等性检查

  • 我的程序中有一个变量,它可以从值集中取任何值 我的目标是只在不是、、或时执行一些语句。 我试过了, > 对于类C语言(等式运算符比较实际字符串值;例如C#、javascript、php) 对于类Pascal语言(如plsql) 条件中的语句总是被执行。我做错什么了吗?

  • 问题内容: 我开始于: 然后尝试: 最终: 从那以后我发现: 因此,我已经解决了最初的问题(有点),但是为什么数组不能互相匹配? 问题答案: Javascript数组是对象,您不能简单地使用相等运算符来了解那些对象的 内容 是否相同。如果两个物体实际上是完全一样的情况下(如平等运营商将只测试,作品和太)。 如果您需要检查两个数组是否相等,我建议只遍历两个数组并验证所有元素具有相同的值(并且两个数组

  • 问题内容: 目前,我正在努力学习Python,而在递归函数方面却陷入了停滞。在Think Python中 ,练习之一是编写一个函数,该函数使用以下定义来确定 a 是否为 b 的幂: “如果a被b整除,则a是b的幂,而a / b是b的幂。编写一个名为is_power的函数,该函数接受参数a和b,如果a是b的幂,则返回True。” 我函数的当前状态是: 实际上,这产生了我期望的结果。但是,本章着重于编

  • 有可能做如下事情吗: 或者: 我知道用很多if-else语句也可以实现同样的目标,但如果它像上面那样工作,看起来会更干净。

  • PEP 572引入了为Python 3.8实现的赋值表达式(俗称Walrus操作符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值。 赋值表达式的语法、语义学和语法规范到底是什么? 为什么在PEP 379中关于“添加赋值表达式”的类似想法之前遭到拒绝的情况下,引入了这个新的(似乎相当激进的概念)?