6
    #include <stdio.h>

    int main()
    {
        int a = 10;
        if (a == a--)
            printf("TRUE 1\t");
        a = 10;

        if (a == --a)
            printf("TRUE 2\t");
    }

为什么第二个 if 语句为真?

输出为:真 1 真 2

这是由于未定义的行为而发生的,因为我将相同的变量与其递减值进行比较?

4

3 回答 3

12

正确,条件计算结果为,true因为您看到未定义的行为:如果在表达式中使用具有副作用的运算符的变量,则在没有序列点的表达式中再次使用相同的变量是非法的(==没有序列点)。

这是因为编译器可以在任何时候自由应用它希望的副作用--,只要在评估表达式时使用的值是正确的(即后缀表示法的减量之前的值,或之后的值)前缀符号的减量)。

于 2014-01-25T12:23:36.807 回答
-3

这是因为==运算符的关联性是从左到右的

a==a--

在这个表达式中,首先将两边进行比较(10==10),然后将a减少到9

a==--a 

在这个表达式中,首先 a 的值减少到 9,然后与a(已经变成 9)进行比较

所以,两者都是真的。

于 2014-01-25T12:33:24.570 回答
-3

a--表达式计算后递减a,实际上意味着何时a == a计算,它是10 == 10,这是真的。

--a在表达式计算之前递减a,实际上意味着当a == a实际计算时, a 已经递减,所以它是9 == 9,这又是真的。

前后减量不能发生在表达式中间。它们发生在它们之前或之后。

于 2014-01-25T12:28:32.277 回答