&& 和 ||有什么区别?
What is the difference between && and ||?
我很难理解以下程序的工作原理,请帮助我理解。
int x=2,y=0;
(一)
if(x++ && y++)
cout<<x<<y;
输出:
(二)
if(y++ || x++)
cout<<x<<" "<<y;
输出: 3 1
(三)
if(x++||y++)
cout<<x<<" "<<y;
输出: 3 0
请解释一下该程序是如何工作的,以及 (ii) 和 (iii) 之间的区别是什么。
您正在查看一个使用两种语言技巧的"C++谜题"。
首先是后增量首先使用变量的值,然后递增变量。
所以 x++ 在表达式中具有值 2,然后 x 变为 3y++ 在表达式中的值为 0,然后 y 变为 1
&&是和||是或
两个运营商都在短路。
先看&&。
为了 for 和 true,双方都必须为真(非零)
由于它是 x++ && y++,首先发生 x++,并且因为它是非零(真)y++必须发生才能确定结果是否为真。因此 x 为 3,y 为 1。
第二种情况是一样的。 y 为零,但为了确定 OR 是否为真,if 语句执行表达式的后半部分。
第三种情况,因为它的顺序相反,从不执行 y++,因为
x++ || y++
前半部分是 X++,它已经是正确的,所以编译器不会费心去执行测试的后半部分。
int x=2,y=0;
if()
中的条件根据以下规则进行评估:
operator &&
首先计算左操作数,如果该值在逻辑上false
则避免计算右操作数。典型的用途是例如避免除以零问题的if (x > 0 && k/x < limit) ...
。operator ||
首先计算左操作数,如果该值在逻辑上true
则避免计算右操作数。例如,if (overwrite_files || confirm("File existing, overwrite?")) ...
不会在设置标志overwrite_files
时询问确认。
要理解以下内容,还必须注意,x++
是后递增,这意味着在if( x++)
x
中具有旧值,但只是在下一行(甚至同一行,但在 if() 测试之后)x
递增。
(i)
if(x++ && y++) // x=2,y=0;
// 2 so y++ is evaluated
cout<<x<<y; // skipped, but now x=3,y=1;
Output:
(ii)
if(y++ || x++) // x=2,y=0;
//0 so x++ is evaluated
cout<<x<<" "<<y; // x=3,y=1;
Output: 3 1
(iii)
if(x++||y++) // x=2,y=0;
//2 so y++ is not evaluated
cout<<x<<" "<<y; // x= 3,y=0;
"如果"参数评估顺序?
在C++(和其他一些语言)中,&&
和||
是条件中的逻辑运算符。 &&
是逻辑 AND 运算符,||
是逻辑 OR 运算符。
在条件中使用这些运算符时,条件的结果取决于这些运算符两侧的内容,并且读起来就好像您只是在说这些话一样。
例:
if(thisNum > 0 && thisNum < 10)
被解读为"如果 thisNum 大于零且小于 10,则条件将为真。因此,0 到 10 之间的任何数字都将使条件为真。
if(thisNum > 0 || thisNum < 10)
被解读为"如果 thisNum 大于零或小于 10,则条件将为真。因此,任何数字都将使此语句为真,因为此语句只有一部分必须为真才能计算为 TRUE。
关于这些工作原理的更详细说明如下:
OR ( ||
) - 如果运算符的任一或双方都为真,则结果将为真。
AND ( &&
) - 如果运算符的两边都为真且只有两边都为真,则结果将为真。否则,它将是错误的。
还有更多的解释,包括互联网上的真值表,如果你做谷歌搜索来帮助理解这些。
至于你的例子。
if(x++ && y++)
cout<<x<<y;
您正在执行一个比较x
和y
值的if
语句。要记住的重要一点是,您没有将值进行比较。在 C++ 中,非零值的计算结果为 TRUE,而零值将导致 FALSE。因此,在这里您检查x
和y
是否为真,然后在比较后将它们的值增加一个。由于 x = 2
和 y = 0
,我们有一个 TRUE 值和一个 FALSE 值,并且由于它们之间有一个 &&
(AND) 运算符,我们知道条件的结果是 FALSE(因为两者都不是 TRUE)并且输出被跳过。
if(y++ || x++)
cout<<x<<" "<<y;
在这个例子中,我们正在做同样的事情,除了我们正在做一个逻辑 OR 操作而不是 AND(因为我们有 ||
而不是 &&
)。这意味着,正如我上面所说,只有条件的一部分必须为 TRUE 才能产生 TRUE。由于我们的值仍然是x = 2
和y = 0
,我们有一个 TRUE 值和一个 FALSE 值。由于部分为 TRUE,因此整个条件为 TRUE,并且输出发生。
结果3 1
而不是2 0
的原因是变量后面的++
运算符。当++
运算符在变量之后时,它将在行的其余部分发生并完成所需的操作后添加一个 U。因此,它确实会评估条件,然后将值增加 1。
if(x++||y++)
cout<<x<<" "<<y;
这个例子是完全相同的,唯一的区别是值已被交换。由于它是OR(||
)操作,只有一个部分必须是TRUE。和以前一样,我们有一个 TRUE 值(因为x
不为零)和一个 FALSE 值(因为y
为零)。因此,我们有一个 TRUE 结果,这意味着不会跳过输出,我们再次3 1
得到答案(因为++
运算符出现在变量之后)。
现在,说到++
运算符。如果在第一个示例中它是:
if(++x && ++y)
cout<<x<<y;
在这种情况下,我们会得到不同的结果。由于++
运算符位于变量之前,因此发生的第一件事是将值增加一个,然后评估条件。由于我们的新值将是x = 3
(TRUE)和y = 1
(也是TRUE),我们可以得出结论,我们将得到与其他两个示例相同的结果,因为两个值都是TRUE(因为我们有一个AND(&&
)运算符,两个变量都必须为TRUE才能产生TRUE)。
希望这有帮助。
编辑:
另一个答案对第二个和第三个例子提出了一个很好的观点。结果方面,没有区别。但是,就如何评估而言,存在差异。
C++会自动执行称为"短路评估"的操作。这意味着,如果它知道结果已经是 TRUE 或 FALSE,它将跳过任何评估。这意味着对于 OR 操作,如果第一部分为 TRUE,它将跳过第二部分,因为它已经知道结果必须为 TRUE。(请记住,对于OR,只有比较的一部分必须是TRUE。所以这意味着如果第一部分是假的,那么程序也必须评估第二部分,因为它决定了结果是真还是假。
使用 AND 操作,它将执行相反的操作。如果第一部分为 FALSE,则程序知道结果必须是 FALSE,并将跳过其余部分。但是,如果第一部分为 TRUE,则程序必须评估其余部分以确定结果是 TRUE 还是 FALSE。
就您的示例而言,这意味着第二个必须评估双方,因为第一部分导致 FALSE。
在第三个示例中,跳过第二部分,因为第一部分为 TRUE,这意味着整个条件为 TRUE。
对于 or(||) 运算符,如果左侧的表达式为真,它将忽略右侧的表达式。
对于 and(&&) 运算符,如果左侧的表达式为假,它将忽略右侧的表达式。
这是您的问题的答案,是什么使(ii)和(iii)之间的区别。
在输出 (ii) 中,它是:
作为编译器计算y
的时间,y
等于0
,因此语句false
它正在计算另一个成员x
等于2
,因此语句true
。然后它操作增量运算符。
在输出 (iii) 中,它是:
由于编译器计算x
的时间,x
等于2
,因此语句true
条件的运算符||
它不会计算另一个表达式,因此忽略y++
。只有x
会递增。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::vector和llvm::SmallVector之间有什么区别?什么时候用哪一个