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。
答案 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;
因此,您的代码会导致未定义的行为。