我一直在想一些初学者的错误,最后我犯了if
语句中的错误。我对代码进行了一些扩展:
int i = 0;
if (i = 1 && i == 0) {
std::cout << i;
}
我已经看到if
语句返回true,它不能
I
为1
。如果在If语句中分配了i
,为什么i==0
返回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位的非零整数值)。那是因为
假设您的代码实际上是这样的:
#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
。
这与运算符优先级有关。
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中关于“添加赋值表达式”的类似想法之前遭到拒绝的情况下,引入了这个新的(似乎相当激进的概念)?