一行代码中的多个逻辑运算符
Multiple logical operators in one line of code
我在 Stack Overflow 上搜索这个问题的答案,但没有找到确切答案。我想出了这段代码。我知道操作员应该如何工作,但在这类问题中我不理解他们。例如,在第一种情况下,如果我使用 ++y
和 ++z
,z
和 y
怎么仍然是 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
这是对逻辑表达式求值的结果:一旦确定表达式为假(或真),就不再对其余运算符求值。例如:
++x || ++y && ++z;
由于 x
是一个,表达式将独立于 z
或 y
是 true,因此不执行 ++y
和 ++z
没有了。
由于优先级规则,第一个示例中的表达式等同于( && 的优先级高于 || ):
++x || ( ++y && ++z ) ;
所以我们只剩下运算符 ||
及其两个操作数 ++x
和 ( ++y && ++z )
。此运算符是从左到右求值的,因此 ++x
首先求值。
但是这个运算符也会短路,这意味着如果第一个操作数的计算结果为真,就像在本例中 ++x
所做的那样,第二个操作数 ( ++y && ++z )
将不会被计算。
原因是你用了||和&&.
&& 和 ||运算符短路求值,即对于 && 如果第一个操作数求值为假,则永远不会求值第二个操作数,因为结果始终为假。同样,对于 ||如果第一个操作数的结果为真,则永远不会操作第二个操作数。
单符号“&”可以表示为"bit-wise AND"运算符,双符号“&&”可以表示为"Logical AND"运算符。
例如,在这一行中:
++x || ++y && ++z;
x 为 1,因此 ++x 的布尔值为真。因为你用了||语句“++y && ++z”根本不是 运行 并且 y 和 z 的值为 1.
如果您将使用 & 和 |该值将增加到 2.
我在 Stack Overflow 上搜索这个问题的答案,但没有找到确切答案。我想出了这段代码。我知道操作员应该如何工作,但在这类问题中我不理解他们。例如,在第一种情况下,如果我使用 ++y
和 ++z
,z
和 y
怎么仍然是 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
这是对逻辑表达式求值的结果:一旦确定表达式为假(或真),就不再对其余运算符求值。例如:
++x || ++y && ++z;
由于 x
是一个,表达式将独立于 z
或 y
是 true,因此不执行 ++y
和 ++z
没有了。
由于优先级规则,第一个示例中的表达式等同于( && 的优先级高于 || ):
++x || ( ++y && ++z ) ;
所以我们只剩下运算符 ||
及其两个操作数 ++x
和 ( ++y && ++z )
。此运算符是从左到右求值的,因此 ++x
首先求值。
但是这个运算符也会短路,这意味着如果第一个操作数的计算结果为真,就像在本例中 ++x
所做的那样,第二个操作数 ( ++y && ++z )
将不会被计算。
原因是你用了||和&&.
&& 和 ||运算符短路求值,即对于 && 如果第一个操作数求值为假,则永远不会求值第二个操作数,因为结果始终为假。同样,对于 ||如果第一个操作数的结果为真,则永远不会操作第二个操作数。
单符号“&”可以表示为"bit-wise AND"运算符,双符号“&&”可以表示为"Logical AND"运算符。
例如,在这一行中: ++x || ++y && ++z; x 为 1,因此 ++x 的布尔值为真。因为你用了||语句“++y && ++z”根本不是 运行 并且 y 和 z 的值为 1.
如果您将使用 & 和 |该值将增加到 2.