&& 和 ||有什么区别?

What is the difference between && and ||?

本文关键字:区别 什么      更新时间:2023-10-16

我很难理解以下程序的工作原理,请帮助我理解。

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;

您正在执行一个比较xy值的if语句。要记住的重要一点是,您没有将值进行比较。在 C++ 中,非零值的计算结果为 TRUE,而零值将导致 FALSE。因此,在这里您检查xy是否为真,然后在比较后将它们的值增加一个。由于 x = 2y = 0 ,我们有一个 TRUE 值和一个 FALSE 值,并且由于它们之间有一个 && (AND) 运算符,我们知道条件的结果是 FALSE(因为两者都不是 TRUE)并且输出被跳过。


if(y++ || x++)
    cout<<x<<" "<<y;

在这个例子中,我们正在做同样的事情,除了我们正在做一个逻辑 OR 操作而不是 AND(因为我们有 || 而不是 && )。这意味着,正如我上面所说,只有条件的一部分必须为 TRUE 才能产生 TRUE。由于我们的值仍然是x = 2y = 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会递增。