我在Stack Overflow上搜索这个问题的答案,但我还没有找到确切的答案。我想出了这段代码。我知道操作符应该如何工作但我不理解它们在这类问题中。例如,在第一种情况下,如果我使用z
和y
,++y
和++z
如何仍为1?
#include <stdio.h>
int main(void) {
int x, y, z;
x = y = z = 1;
++x || ++y && ++z;
printf("x = %d y = %d z = %d\n", x, y, z);
x = y = z = 1;
++x && ++y || ++z;
printf("x = %d y = %d z = %d\n", x, y, z);
x = y = z = 1;
++x && ++y && ++z;
printf("x = %d y = %d z = %d\n", x, y, z);
x = y = z = -1;
++x && ++y || ++z;
printf("x = %d y = %d z = %d\n", x, y, z);
x = y = z = -1;
++x || ++y && ++z;
printf("x = %d y = %d z = %d\n", x, y, z);
x = y = z = -1;
++x && ++y && ++z;
printf("x = %d y = %d z = %d\n", x, y, z);
return 0;
}
结果我得到了:
x = 2 y = 1 z = 1
x = 2 y = 2 z = 1
x = 2 y = 2 z = 2
x = 0 y = -1 z = 0
x = 0 y = 0 z = -1
x = 0 y = -1 z = -1
答案 0 :(得分:3)
这是对逻辑表达式求值的结果:一旦确定表达式为假(或为真),就不再评估剩余的运算符。 E.g:
++x || ++y && ++z;
由于x
为1,表达式将为true,与z
或y
无关,因此++y
和++z
不再执行。
答案 1 :(得分:2)
由于优先级规则,第一个示例中的表达式与(&amp;&amp;&amp;&quot;的优先级高于||)相同:
++x || ( ++y && ++z ) ;
因此,我们选择了运营商||
及其两个操作数++x
和( ++y && ++z )
。从左到右对此运算符进行求值,因此首先计算++x
。
但是这个运算符也会短路,这意味着如果第一个操作数的计算结果为true,就像++x
那样,则第二个操作数( ++y && ++z )
不会被评估。
答案 2 :(得分:0)
原因是你使用了||和&amp;&amp;。
&安培;&安培;和||运营商的短路评估,即&amp;&amp; amp;如果第一个操作数的计算结果为false,则永远不会计算第二个操作数,因为结果始终为false。同样,对于||如果第一个操作数的结果为真,则永远不会操作第二个操作数。
单&符号&#34;&amp;&#34;可以说是&#34; bit-wise AND&#34;操作员和双&符&#34;&amp;&amp;&#34;可以被称为&#34;逻辑和&#34;操作
例如,在这一行: ++ x || ++ y&amp;&amp; ++ Z者除外; x为1,因此++ x的布尔值为true。因为你用了||陈述&#34; ++ y&amp;&amp; ++ž&#34;根本不运行,y和z的值为1.
如果您将使用&amp;和|该值将增加到2。