[英]Why does the value of c not change?
#include <stdio.h>
void main()
{
int a = 5, b = -7, c = 0, d;
d = ++a && ++b || ++c;
printf("\n %d,%d,%d,%d", a, b, c, d);
}
在上面的代码中,输出为6,-6、0、1。 为什么c的值和d 1的值? d是如何得到1的值的?
那是因为||
首先检查左侧部分,如果为true,则返回true,而不评估右侧部分。
在C中,任何非零均被视为True,零被视为False
int a = 5, b = -7, c = 0, d;
d = ++a && ++b || ++c;
这里++ a和++ b非零,并且都被视为True,因此++a&&++b
变为True,并且表达式在那儿停止求值。
已经有很好的答案,解释为什么行后c
为0
d = ++a && ++b || ++c;
被执行。
该行等效于:
d = (++a && ++b || ++c);
这就解释了为什么d
是1
。
int a = 5, b = -7, c = 0, d;
d = ++a && ++b || ++c;
让我们逐一分析语句
++ a:a = 6
++ a && ++ b:b变为-6,然后它变为:6 && -6,等于1
现在有一个|| (或符号),但这不会影响d的值,因为
1||"value2" =1
,因此编译器不评估“ ++ c”。
因此c保持为0,d变为6 && -6 = 1
&&的优先级高于|| 因此,首先对++ a && ++ b进行评估,然后它才成立。 表达式为true || ++c
true || ++c
和|| 因为||
,所以从左到右求值 遇到true,它将返回1到d,而不评估++ c。 所以c值不会增加
创建评估树以进行评估。 || 一部分是父级,而其侧面的两个部分是父级。 当它评估一个孩子时,如果它为真,则不会评估另一个孩子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.