为什么表达式a == - if语句中为true?

Pan*_*ato 6 c pre-increment post-increment

    #include <stdio.h>

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

        if (a == --a)
            printf("TRUE 2\t");
    }
Run Code Online (Sandbox Code Playgroud)

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

输出为:TRUE 1 TRUE 2

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

das*_*ght 12

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

这是因为编译器可以随意应用--它所希望的任何时间的副作用,只要在计算表达式时使用的值是正确的(即后缀表示法减少之前的值,或者后面的值)递减前缀表示法).

  • *在没有序列点的单个表达式中使用相同的变量超过一次是非法的*这不是真的.您可以在没有序列点的表达式中多次使用变量.代码的问题在于先前的值不仅用于确定要存储的新值.`a + a + a + a`是有效的; 你的回答说它会无效. (2认同)