我正在进行练习编程测验,我不确定为什么这个程序打印出-1:
#include <stdio.h>
int main()
{
int x = 1;
if (x-- && x-- && x--)
{
printf("%d\n", x);
} else
{
printf("%d\n", x);
}
return 0;
}
答案 0 :(得分:7)
在C中,使用short-circuit evaluation评估&&
和||
等逻辑运算符,这实际上意味着当一个语句保证为true或false时,任何后续表达式都在声明未被评估。
在您的程序中,只需要评估前两个条件以确定整个语句是错误的。第三个表达式未被评估。
if (x-- && /* evaluates true, and then x is decremented */
x-- && /* evaluates false, and then x is decremented */
x--) /* this is not executed */
因为这是一系列AND
语句,从逻辑上讲,只有一个表达式需要为false才能使整个语句为false。当第二个表达式被确定为false时,不需要通过评估语句的其余部分来浪费资源,因此执行else
块。
这会导致x
的最终值为-1
,而不是-2
。
答案 1 :(得分:2)
首先从x = 1
开始,然后x-- && x-- && x--
的序列如下所示,其中每个x--
代表条件的相应部分..(请注意&&
行为作为序列点)。
x = 1 -> x = 1
x-- -> 1, x = 0
结果为1(1 && x-- && x--
),因此评估了第一个&&
的右手表达。
x-- -> 0, x = -1
结果为0(1 && 0 && x--
)和&amp;&amp;短路评估开始,右手表达第二&amp;&amp;是不评估。
x--
都能跟得上;如上所述,没有评估。
由于条件为假(1 && 0 && dont_care_not_evaluated)
,它会在else
情况下打印出值,而仅减少x两次。
答案 2 :(得分:2)
在C语言中,只要可以确定结果,测试语句就会结束其操作。在这种情况下,第一个<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Change html font-size
<input id="html" type='number' value="20" min="18" max="30" />
</label>
<div class="rem rem1">rem</div>
<div class="rem rem2">rem</div>
<label>Change div font-size
<input id="div" type='number' value="20" min="18" max="30" />
</label>
<div class="em em1">em</div>
<div class="em em2">em</div>
返回1并设置x = 0,第二个x--
返回0并设置x = -1。
1&amp;&amp; 0可以将结果确定为0,因此忽略最后一个x--
。
使用FALSE语句,x--
选择第二个if-else
作为输出并打印printf
的值:-1;
答案 3 :(得分:0)
所以最终值为-1(不是0,所以-1被解释为true)