printf是如何工作的?

时间:2014-07-04 11:24:49

标签: c printf

int main()
{
    int c=5;
    printf("%d\n%d\n%d", c, c<<=2, c>>=2);
    return 0;
}

我没有得到如何在printf函数中进行赋值。输出结果是4,4,4但据我说它应该是4,4,1。

2 个答案:

答案 0 :(得分:3)

c的修改之间没有序列点,因此行为未定义。

您需要明确强制执行序列。例如:

int main(void)
{
     int c = 5;
     int d = c >> 2;
     int e = d << 2;
     printf("%d\n%d\n%d", c, e, d);
     return 0;
}

当然,您应该要求编译器报告警告。如果你这样做,并假设你的编译器是胜任的,那么它会警告你这个问题。例如,当我被要求使用-Wall选项报告编译您的程序时,我的GCC报告:

main.c: In function 'main':
main.c:6:37: warning: operation on 'c' may be undefined [-Wsequence-point]
     printf("%d\n%d\n%d", c, c<<=2, c>>=2);
                                     ^
main.c:6:37: warning: operation on 'c' may be undefined [-Wsequence-point]

答案 1 :(得分:1)

编译时应使用-Wall标志。

我得到了:

../main.c:6:37: warning: operation on ‘c’ may be undefined [-Wsequence-point]
../main.c:6:37: warning: operation on ‘c’ may be undefined [-Wsequence-point]

这个代码例如被打破了:

c<<=2

因为c的修改之间没有序列点。

它应该是这样的:

int a = c << 2;

因此,您的代码会导致未定义的行为。