int a=8, b=10,c=2,d;
d= ++a && ++b || ++b;
在上面的代码中,如何知道(++a)
,(++b)
是true还是false。我知道true为1,false为0。但是我无法理解如何确定这些表达式是true还是false。
请帮忙。
答案 0 :(得分:4)
0
为false,任何非零值为true。因此,您只需要确定++a
和++b
是否为零。
由于a
最初是8
,所以++a
是9
,它不为零,所以是真的。
由于b
最初是10
,所以++b
是11
,它不为零,所以是真的。
9 && 11
为真,因为两个操作数都为真。
||
仅在第一个操作数为false时才评估第二个操作数。因此第二个++b
即从未执行。 true || anything
的值为true
。
因此,d
将设置为true,即1
。
答案 1 :(得分:3)
在C中,逻辑运算符(&&
,||
,!
等)假定零为false
,所有其他值均为true
。
基于运算符的优先级(运算符&&
的优先级高于||
运算符),该表达式的计算结果为:
d = (++a && ++b) || ++b;
请注意,逻辑AND
操作expr1 && expr2
采用短路行为。如果发生逻辑短路,则只有当第一个操作数expr2
不能完全确定结果时,才评估第二个操作数expr1
。
也就是说,如果expr2
是逻辑expr1
(否),则不会评估0
。
++a
将导致9
(非零值),因此将导致true
,因此&&
运算符的右侧操作数为{{1 }},将被评估。
++b
将得出++b
(非零值),因此将得出11
。
true
将产生true && true
。
逻辑true
操作OR
采用短路行为。也就是说,如果expr1 || expr2
是逻辑expr2
(正确),则不评估expr1
。
因此,在给定的表达式中,1
的左侧被评估为||
,因此true
运算符的右侧操作数为||
,将不会被求值,整个表达式的结果将为++b
。因此,true
的值为d
。
答案 2 :(得分:1)
在C,C ++和许多其他编程语言中,对于整数,0被认为是错误的,而其他整数(包括负数)则为true。所以这里d将被评估为真
答案 3 :(得分:0)
在'C'中,我们知道true为'1'而false为'0',因此上述表达式将为true,因为两个表达式都不为零。并且如果您想打印诸如true和false的实际值,我想您应该尝试一下printf(“%s”,x?“ true”:“ false”);