[英]Regarding logical AND operator
int a=8, b=10,c=2,d;
d= ++a && ++b || ++b;
在上面的代码中,我怎么知道(++a)
, (++b)
是真还是假。 我知道真为 1,假为 0。但我不明白如何确定这些表达式是真还是假。 请帮忙。
0
为假,任何非零值都为真。 所以你只需要确定++a
和++b
是否为零。
由于a
最初是8
, ++a
是9
,它是非零的,所以它是真的。
由于b
最初是10
, ++b
是11
,它是非零的,所以它是真的。
9 && 11
为真,因为两个操作数都为真。
||
仅当第一个操作数为假时才计算第二个操作数。 所以第二个++b
即从未执行过。 true || anything
的值 true || anything
都是true
。
因此, d
将设置为 true,即1
。
在 C 中,逻辑运算符( &&
、 ||
、 !
等)假定零为false
,所有其他值为true
。
基于运算符优先级(运算符&&
优先级高于||
运算符),表达式将被计算为:
d = (++a && ++b) || ++b;
请注意,逻辑AND
运算expr1 && expr2
采用短路行为。 使用逻辑短路,仅当结果未完全由第一个操作数expr1
确定时,才计算第二个操作数expr2
。 也就是说,如果expr1
为逻辑0
(假),则不计算expr2
。
++a
将导致9
,一个非零值,因此,导致true
,因此&&
运算符的右侧操作数,即++b
,将被评估。
++b
将导致11
,一个非零值,因此,导致true
。
true && true
将导致true
。
逻辑OR
运算expr1 || expr2
expr1 || expr2
采用短路行为。 也就是说,如果expr1
为逻辑1
(真),则不计算expr2
。
因此,在给定的表达式中, ||
的左侧被评估为true
,因此||
的右侧操作数运算符,即++b
,不会被评估,整个表达式的结果将为true
。 因此, d
的值为1
。
在 C、C++ 和许多其他编程语言中,对于整数,0 被认为是假的,而任何其他 integer(包括负数)都是真。 所以这里 d 将被评估为 true
在“C”中,我们知道真为“1”,假为“0”,因此上述表达式将为真,因为两个表达式都不为零。 如果你想打印像 true 和 false 这样的实际值,我认为你应该试试 printf("%s", x?"true":"false");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.