首页 > 解决方案 > 使用逻辑运算符和前/后增量未从此代码获得预期输出

问题描述

我在以下 C 代码中没有得到预期的输出

main(){
    int i=0,j=-2,k=0,m;

    if((!i||--j&&k++)&&(i++||j++&&!k++))
    {
        printf("i=%d j=%d k=%d",i,j,k);

    }
    return 0;
}

我在编译器中得到了输出:

i=1 j=-1 k=1

但我不明白这里到底发生了什么。

我认为 if 语句不应该运行,因为它的论点是错误的

注意第一个括号 (!i||--j&&k++)

在这里,!i=1因此这个括号是真的,因为在 OR 运算符下带有 1 的任何东西都是真的。

输出值变为: i=0, j=-3, k=1

现在注意第二个括号: (i++||j++&&!k++)

在这里我们有( 0 || -3 && !1) = 0, false

由于括号由 分隔&&,if 语句的整个参数变为false

请解释我的论点在哪里是错误的。我是 C 新手

标签: clogical-operatorspost-incrementpre-increment

解决方案


逻辑 AND 运算符&&和逻辑 OR 运算符||是短路运算符,这意味着如果可以从左侧确定表达式的结果,则不会计算右侧。

所以当这个子表达式运行时:

(!i||--j&&k++) 

解析为:

(!i||(--j&&k++)) 

左侧的||评估结果为真,因此--j&&k++不评估,这意味着 的值j保持 -2, 的值k保持 0。

所以最外面的左边&&是真的,所以现在我们评估右边:

(i++||j++&&!k++)

解析为:

(i++||(j++&&!k++))

i递增到 1,然后在 中使用旧值||。旧值 0 评估为 false,因此评估右侧。 j递增到 -1 并且 -2 的旧值评估为 true,因此评估 的右侧&&k递增到 1 并将旧值 0 应用于!计算结果为 true 的运算符。这使得整个表达式为真并打印语句,此时i为 1,j为 -1,k为 1。


推荐阅读