[英]Confusion with post increment and logical operator?
#include <stdio.h>
#include <string.h>
main()
{
int i=-1, j=-1, k=0, l=2,m;
m = i++&&j++&&k++||l++;
printf("%d%d%d%d%d", i, j, k, l, m);
}
输出:
00131
我很困惑表达式如何被求值。
这里真正重要的是||
。 由于l++
计算结果为布尔值1
(true),因此整个语句为true。 所以m
为1,其余的只是它们的原始值加上一个值,它们在求值后就增加了。
您正在评估布尔表达式:
((-1 && -1) && 0) || 2
顺便说一句,您对main
的定义应为:
int main(void)
我想您的问题是实际上将发生哪些增量。
&&和|| (逻辑和与逻辑或)是“短路”操作。 他们仅评估他们足够多的论据来确定它们是对还是错。 有效地,可以将x && y
视为x ? y : 0
x ? y : 0
和x || y
x || y
可以视为x ? 1 : y
x ? 1 : y
&&优先于||,因此从i++ && j++ && k++
。 首先评估i++
,返回-1
并将i
设置为0
。 由于返回的值是true(非零),因此我们继续评估j++
,它再次返回-1
(true)并将j
递增为0。我们仍然没有证明&&
的值,因此我们评估k++
,它返回0
(假),将k
递增为1。该假给出了最终的和假值。
现在我们进入||。 实际上,您现在有false || l++
false || l++
。 false不足以确定or的结果,因此我们评估l++
。 在将l
设置为3
返回2
(true)。 真实值迫使||
的值 以及表达式的最终值是true
。
请注意,如果i
, j
或k
以0(假)开始,则以后的增量将不会发生,因为短路评估会确定不需要它们来产生结果。 通常,混合&&
或||
正是由于这个原因,带有副作用的想法是一个坏主意 -它产生了不必要理解的逻辑。 ?:
版本-或真实的if/then/else
语句-将使这种交互更加清晰。 您应该了解如何阅读这种混乱的情况,因为您将在其他程序员的C代码中遇到它-但几乎永远不要编写它。 而且,如果必须,则应将其记录在案。 您节省的理智可能是您自己的。
使用以下规则:
i ++ =后增加i的值,k ++ =后增加k的值,l ++ =后增加l的值,j ++ =后增加j的值
&&-如果比较的值均非零,则为true(1),否则为false(0)
|| -如果比较的值均为零,则为false(0),否则为true(1)
然后应用于表达式m(也可以在c中读取运算符优先级)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.