评估c中if语句中的表达式

时间:2015-12-13 08:36:49

标签: c

假设我将代码编写为:

int main()
{
    int i,a=2147483647;

    if((2*a)<0)
        printf("hello");
    else
    printf("world");
}

输出是世界的。 但是对于:

int main()
{
    int i,a=2147483647;
    if((a+a)<0)
        printf("hello");
    else
        printf("world");
}

输出为hello

这是怎么回事?
2,存储在内存中的2 * a和a + a的值在哪里(内存位置的数据类型是什么?)

1 个答案:

答案 0 :(得分:6)

如果您的freopenINT_MAX2147483647),pow(2, 31) - 12*a确实会导致溢出,并且有符号整数aritimetic溢出 undefined C中的行为

引自{{3}} 6.5表达式:

  

5如果在评估表达式期间发生异常情况(即,如果是   结果不是数学定义的,也不是在其可表示值的范围内   类型),行为未定义。

未定义的行为可能会导致所有内容。请参阅编译器的输出以了解此特定结果的原因。

要知道a+a2*a的值存储位置,请参阅编译器的输出。我想如果编译器足够智能,它们应该存储在寄存器中,而不是存储在内存中。一些糟糕的编译器可能会将它们的值存储在内存中的堆栈上。