繁体   English   中英

与后递增和逻辑运算符混淆?

[英]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 : 0x || 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

请注意,如果ijk以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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM