我很难理解以下程序是如何工作的,请帮助我理解。
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)之间的区别。
答案 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;
答案 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
语句,该语句正在比较x
和y
的值。要记住的重要一点是,您不是要将这些值进行比较。在C ++中,非零值将评估为TRUE,而零值将导致FALSE。因此,您需要检查x
和y
是否为TRUE,然后在比较后将其值增加1。从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值。由于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。