在 C++(和其他一些语言)中,&& 和 || 是条件中的逻辑运算符。 && 是逻辑 AND 运算符,|| 是逻辑 OR 运算符。
当在条件中使用这些时,条件的结果取决于这些运算符两边的内容,并且就像您只是在说单词一样被阅读。
示例:
if(thisNum > 0 && thisNum < 10) 读作“如果 thisNum 大于零且小于 10,则条件为真”。因此,0 到 10 之间的任何数字都将使条件成立。
if(thisNum > 0 || thisNum < 10) 读作“如果 thisNum 大于零或小于 10,则条件为真。”因此,任何数字都可以使该陈述成立,因为该陈述只有一部分必须为真才能评估为 TRUE。
有关这些工作原理的更详细说明如下:
OR (||) - 如果运算符的任何一方或双方都为真,则结果将为真。
AND (&&) - 如果运算符的 BOTH 和 ONLY 双方都为真,则结果为真。否则为假。
如果您通过 Google 搜索来帮助理解这些解释,包括互联网上的真值表,还有很多解释。
至于你的例子。
if(x++ && y++)
cout<<x<<y;
您正在执行一个if 语句,它比较x 和y 的值。要记住的重要一点是,您没有将这些值一起比较。在 C++ 中,非零值将评估为 TRUE,而零值将导致 FALSE。因此,您在这里检查x 和y 是否为TRUE,然后在比较后将它们的值增加一。由于 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 的原因是变量后面的++ 运算符。当++ 运算符位于变量之后时,它将在该行的其余部分发生并完成所需的操作后添加一个。所以它确实评估条件 THEN 将值增加一。
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。)因此这意味着如果第一部分为 FALSE,那么程序也必须评估第二部分,因为它确定结果是 TRUE 还是 FALSE。
使用 AND 操作,它会做相反的事情。如果第一部分为 FALSE,则程序知道结果必须为 FALSE,并将跳过其余部分。但是,如果第一部分为 TRUE,则程序必须评估其余部分以确定结果是 TRUE 还是 FALSE。
就您的示例而言,这意味着第二个必须评估双方,因为第一部分的结果为 FALSE。
在第三个示例中,第二部分被跳过,因为第一部分为 TRUE,这意味着整个条件为 TRUE。