预计变量没有变化,但一元运算符即使在 false if 语句中也能工作为什么这样?

问题描述

#include<stdio.h>
int main(){
    int y=15;
    if(y++>19 && y++!=21 && y++>21)
    printf("%d",y);
    else
    printf("%d",y);
    return 0;
}

我预计输出为 15 甚至 18,但它给出了 16,我不知道为什么。

解决方法

这里 y++>19 ==> y 与 19 进行比较,然后由于后缀 ++ 增加。 因此,y++>19 实际上被计算为 15>19,然后 y 递增并变为 16。

由于 15>19 为假,其余的条件 y++!=21 && y++>21 不会被评估,控制转到 else 条件并打印 y。由于上面的 y 已经变成了 16,所以打印出 16。

请注意,在短路评估中,A && B && C,如果 A 被评估为真,则只有 B 被评估。 如果 A 和 B 都被评估为真,则只有 C 被评估。

因此,在您的情况下,由于 A 为假,因此没有对 B 和 C 进行进一步评估,控件只是输入其中的其他部分并打印 y。

,

我建议阅读运算符优先级(以及结合性)。通常每种语言都有一个解释功能的规范,C 也是如此。在线资源比比皆是,学习 C 的一本好书是 K&R,解释得很好,而且练习很有趣。

我将引导您完成此示例:

int y=15; // y is assigned the value 15,the return of the assignment is discarded (you will encounter that fact sooner or later surely)

if 语句可以用 (y++>19) && (y++!=21) && (y++>21) 来表示清楚。 && 运算符是短路的:即一旦可以确定最终结果,其余的将不会被评估。具体来说,在这种情况下,一旦看到 false0,它就会停止评估并返回 false

y++>19 有两个运算符,后缀增量(更高的优先级)和大于(更低的优先级)。后缀增量首先返回值,然后对其进行增量,因此有效地计算 15>19 并且 y 增加到 16。现在记住短路。程序停止计算该表达式,因为最终结果不会改变。程序进入 else 部分并打印分配给 y 的值,即 16

,

有几件事情正在发生

if(y++>19 && y++!=21 && y++>21)

&& 运算符(连同 ||?: 和逗号运算符)强制从左到右求值,这意味着 y++ > 19 在 {{ 之前求值1}},它将在 y++ != 21 之前进行评估。它还引入了一个序列点,因此 y++ > 21 的所有副作用都将在 y++ > 19 被评估之前应用。

y++ != 21 运算符 short-circuits - && 仅在 y++ != 21 评估为非零 (y++ > 19) 时才会评估,并且true 仅在两个先前表达式的计算结果都为非零时才会计算。

后缀 y++ > 21 运算符产生操作数的当前值(因此 ++ 的计算结果为 y++);作为副作用,它会增加操作数,因此在计算 15 后,y++ > 19 会增加到 y,即使整个表达式的计算结果为 {{ 1}} (16)。

,

这是你写的,但只是一点点shorter and faster

#include<stdio.h>
int main(){
    int y = 15;
    y++;    // y = y + 1; means value of variable y equals 16 at this point
    if(y != 21 && y > 19)  // now you check this 16 != 21 && 16 > 19 which is false 
    printf("%d",y);
    else   // continue here directly 
    printf("%d",y);  // print value of variable y
    return 0;   // exit success
}

是的,结果总是16。如果这不是您所期望的,请确保更正您的第一条语句 if(y != 21 && y > 19)

我希望,这会帮助您更正您的 IF 语句(我的建议)。

我可以向您推荐以下两个视频,以便在编写此类语句之前正确理解赋值、逻辑和比较运算符,因为:

false AND true -> false
true AND false -> false

(1) ArithmeticOperator 程序 https://www.youtube.com/watch?v=oaO2eT46Mm8

(2) 比较运算符程序 https://www.youtube.com/watch?v=ovKVOj3xNsA

(3) LogicalOperator 程序 https://www.youtube.com/watch?v=kclf0PQnxrI

赞成更正后的答案。