请解释给定程序的输出。

时间:2016-09-30 16:41:41

标签: c

代码如下: 它给出了输出true2。

    #include<stdio.h>
    int main()
    {
    int a=10;
    if(a==a--)
    printf("true 1\t");
    a=10;
    if(a==--a)
    printf("true2 \t");
    return 0;
    }

2 个答案:

答案 0 :(得分:2)

两个if语句中的比较结果为undefined behaviour。所以,任何事都可能发生。因为a被读取和修改而没有插入序列点。比较运算符==不会引入序列点。您可能需要了解未定义的行为和sequence points等,以便更好地理解问题。

现代编译器也可能对您有所帮助。例如,Clang发布:

warning: unsequenced modification and access to 'a' [-Wunsequenced]
    if(a==a--)
       ~   ^
warning: unsequenced modification and access to 'a' [-Wunsequenced]
    if(a==--a)
       ~  ^

用于两个if语句(GCC也会使用gcc -Wall -Wextra生成类似的警告)。

答案 1 :(得分:0)

一般来说,在一个条件中做一个 - (或--a)并不是一个好习惯,因为它不清楚。 要了解a - 和 - a之间的区别,请参阅答案:Incrementing in C++ - When to use x++ or ++x?