&&和和||?

时间:2014-04-04 12:29:46

标签: c++ operators

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

int x=2,y=0;

(i)

if(x++ && y++)
cout<<x<<y;

输出:

(ⅱ)

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

输出:3 1

(III)

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

输出:3 0

请向我解释该计划的运作方式,以及(ii)和(iii)之间的区别。

5 个答案:

答案 0 :(得分:4)

你正在寻找一个&#34; C ++难题&#34;这是使用两种语言的技巧。

第一个是postincrement首先使用变量的值,然后递增变量。

因此x ++在表达式中的值为2,然后x变为3 y ++在表达式中的值为0,然后y变为1

&安培;&安培;是和 ||是或

两个运营商都在短路。

看看&amp;&amp;第一

为了和为真,双方必须是真的(非零)

因为它是x ++&amp;&amp; y ++,首先发生x ++,因为它不为零(true) 必须使用y ++来确定结果是否为真。 因此x为3,y为1。

第二种情况是一样的。 y为零,但为了确定OR是否为真, if语句执行表达式的后半部分。

第三种情况,因为它的顺序相反,所以从不执行y ++,因为

x ++ || ÿ++

前半部分是x ++,它已经是真的,因此编译器无需执行测试的后半部分。

答案 1 :(得分:2)

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++ postincrementation 这意味着if( x++) x 具有旧值< / strong>但只是在下一行(甚至是同一行但在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;

"IF" argument evaluation order?

答案 2 :(得分:0)

对于或( || )运算符,如果左侧的表达式为 true ,则会忽略右侧的表达式。

对于和(&amp;&amp; )运算符,如果左侧的表达式为 false ,则会忽略右侧的表达式。

这是你的问题的答案,它决定了(ii)和(iii)之间的区别。

答案 3 :(得分:0)

在输出(ii)中,它是:

作为编译器评估y的时间,y等于0所以语句为false它正在评估其他成员x等于2,因此语句为true。然后它操作增量运算符。

在输出(iii)中,它是:

作为编译器评估x的时间,x等于2,因此语句为true,因为条件的运算符为||它不会评估另一个表达式,因此忽略y++。只会增加x

答案 4 :(得分:0)

在C ++(以及其他一些语言)中,&&||是条件中的逻辑运算符。 &&是逻辑AND运算符,||是逻辑OR运算符。

在条件中使用这些条件时,条件的结果取决于这些运算符两侧的内容,并且就像您只是说出这些单词一样。

例:
if(thisNum > 0 && thisNum < 10)被读作“如果thisNum大于零且小于10,则条件为真。”因此,0到10之间的任何数字都将使条件成立。

if(thisNum > 0 || thisNum < 10)被读为“如果thisNum大于零或小于10,则条件为真。”因此,任何数字都会使该陈述成立,因为只有该陈述的一部分必须为真,才能评估为真。

关于这些如何工作的更详细解释:
OR(||) - 如果运算符的EITHER或BOTH两边都为真,则结果为真。

AND(&&) - 如果运算符的两个边和两个边都为真,则结果为真。否则,它将是错误的。

还有更多解释,包括互联网上的真相表,如果你进行谷歌搜索以帮助理解这些。

至于你的例子。

if(x++ && y++)
    cout<<x<<y;

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


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

在这个例子中,我们正在做同样的事情,除了我们正在做逻辑OR操作而不是AND(因为我们有||而不是&&)。这意味着,正如我上面所说,只有条件的一部分必须为TRUE才能得到TRUE。由于我们的值仍为x = 2y = 0,因此我们有一个TRUE值和一个FALSE值。由于part为TRUE,因此整个条件为TRUE并且输出发生。

结果为3 1而不是2 0的原因是因为变量之后的++运算符。当++运算符在变量之后时,它将在该行的其余部分发生后添加一个并完成所需的操作。因此它会评估条件,然后将值增加一个。


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

此示例完全相同,唯一的区别是值已被交换。由于它是OR(||)操作,因此只有一个部分必须为TRUE。和以前一样,我们有一个TRUE值(因为x非零)和一个FALSE值(因为y为零)。因此,我们得到一个TRUE结果,意味着不跳过输出,我们再次得到答案3 1(因为++运算符来自变量之后)。

现在,谈到++运算符。如果在第一个例子中它是:

if(++x && ++y)
    cout<<x<<y;

在这种情况下,我们会得到不同的结果。由于++运算符出现在变量之前,所以首先发生的是值增加1,然后计算条件。由于我们的新值将是x = 3(TRUE)和y = 1(也是TRUE),我们可以得出结论,我们将获得与其他两个示例相同的结果,因为BOTH值为TRUE(因为我们有一个AND(&&)运算符,BOTH变量必须为TRUE才能得到TRUE)。

希望这有帮助。

编辑:
其中一个答案对第二和第三个例子提出了一个很好的观点。结果明智,没有区别。但是,就如何评估而言,存在差异。

C ++自动执行称为“短路评估”的操作。这意味着,如果它知道结果已经为TRUE或FALSE,它将跳过任何评估。这意味着使用OR运算,如果第一部分为TRUE,它将跳过第二部分,因为它已经知道结果是正确的。 (请记住,OR只有一部分比较必须为TRUE。)所以这意味着如果第一部分为FALSE,则程序也要评估第二部分,因为它确定结果是TRUE还是FALSE。
使用AND操作,它将执行相反的操作。如果第一部分为FALSE,则程序知道结果必须为FALSE并将跳过其余部分。但是,如果第一部分为TRUE,则程序必须评估其余部分以确定结果是TRUE还是FALSE。

就您的示例而言,这意味着第二部分已经评估双方,因为第一部分导致FALSE。
在第三个示例中,跳过第二部分,因为第一部分为TRUE,表示整个条件为TRUE。