在以下代码中,XCode输出和gcc输出之间存在如此大的差异的原因是什么?

时间:2017-09-07 14:43:26

标签: c xcode gcc

#include <stdio.h>
void main()
{
    int x= 1;
    printf("%d %d %d ", x, (x = x + 2), (x << 2));
    x << 2;
    printf("%d %d %d \n", x++, ++x, ++x);
}

在XCode和gcc中都试过这个:
XCode输出:1 3 12 3 5 6 gcc输出:3 3 4 5 6 6(正确输出)
为什么XCode输出出错?

1 个答案:

答案 0 :(得分:2)

评估函数参数的顺序是C语言中的unspecified behavior。两个输出都是正确的,因为它是特定编译器决定实现它的方式。你的节目是&#34;错误&#34;因为它不能通过使用中间值来保证订单来正确处理这种未指明的行为。

此程序与两个编译器产生相同的结果(3 3 4 4 5 5

#include <stdio.h>

int main() {

    int x = 1;
    int y = x;

    x = x + 2;
    printf("%d %d %d ", x, x, (y << 2));

    int value1 = x++;
    int value2 = ++value1;
    int value3 = ++value2;
    printf("%d %d %d \n", value1, value2, value3);

    return 0;
}

Clang实际上默认提供一个有用的警告,以避免这种情况:

warning: unsequenced modification and access to 'x' [-Wunsequenced]
printf("%d %d %d ", x, (x = x + 2), (x << 2));
                    ~     ^