C 中包含递增的逻辑表达式的求值

Mat*_*mmm 2 c evaluation increment logical-operators

我刚刚写了一个小程序来帮助我熟悉 C 中的逻辑表达式,我期望结果是:

1 
1 1 1
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>

int main(void) 

{

    int I = 1, J = 1, K = 1;
    printf("%d\n", ++I || ++J && ++K);
    printf("%d %d %d", I, J ,K);

    return 0;
}

Run Code Online (Sandbox Code Playgroud)

相反,我得到了:

1 
2 1 1
Run Code Online (Sandbox Code Playgroud)

的价值 I增加了 1,我不知道为什么。

据我所知,我的程序中I没有分配(=)任何新值,那么它的值是如何改变的?

Rob*_*rtS 5

您的问题涉及两个不同的问题。

第一个:为什么自I增?

第二个:如果输出是2 1 1并且I被增加了JK那么为什么不和增加呢?


1.

为什么是I递增的?

++是增量运算符。它按1计数递增操作数,类似于表达式i = i + 1or i += 1,其中i代表操作数。

设置++在 ( ++i)前面或后面 ( i++) 操作数之间是有区别的。以下链接问题下的答案最好地解决了差异,因此我不会在这里详细讨论这个主题,因为差异在您提供的代码中并不重要,我只是想为您注释这种情况在您以后的程序中正确使用增量运算符并避免进一步混淆。

C:++i 和 i++ 有什么区别?

回到你的代码。

由于您使用:

printf("%d\n", ++I || ++J && ++K);
Run Code Online (Sandbox Code Playgroud)

I1在表达式内部立即递增,因此它的值实际上是2,尽管这不会影响逻辑评估,因为任何非零值都将被评估为1/true作为逻辑条件测试的结果。

这就是为什么

printf("%d %d %d", I, J ,K);
Run Code Online (Sandbox Code Playgroud)

打印2为 的值I


2.

为什么不JK递增呢?

逻辑测试从左到右进行评估。&&具有比 更高的优先级||&&组合表达式/子条件需要一起满足才能作为true条件进行评估。一旦条件变为true,就是这种情况++I,其余条件的评估将被省略,因为它是多余的。

这就是为什么J并且K不会增加1

printf("%d\n", ++I || ++J && ++K);
Run Code Online (Sandbox Code Playgroud)

但是I是。

因此,正确的输出

printf("%d %d %d", I, J ,K);
Run Code Online (Sandbox Code Playgroud)

是:

2 1 1
Run Code Online (Sandbox Code Playgroud)