C左移位运算符

C左移位运算符,c,bitwise-operators,C,Bitwise Operators,我有以下计划: #include <stdio.h> int main () { int x = 8; printf("%d %d %d ", x++, x << 2, x >> 1); } 我觉得应该是这样的: 第一个数字应该是8。然后它会增加到9。9 1等于4 然而,当我把它放入编译器时,我得到的是'8324',而不是'8364' 有人能解释一下为什么吗 谢谢大家! 此操作调用未定义的行为 gcc以您观察

我有以下计划:

#include <stdio.h>
int main ()
{
    
    int x = 8;
    printf("%d %d %d ", x++, x << 2, x >> 1);
 
}
我觉得应该是这样的: 第一个数字应该是8。然后它会增加到9。9 1等于4

然而,当我把它放入编译器时,我得到的是'8324',而不是'8364'

有人能解释一下为什么吗


谢谢大家!

此操作调用未定义的行为

gcc以您观察到的方式执行,而clang则以另一种方式执行,因为此程序的结果未定义

叮当声还发出警告

使程序结果定义为:

int main ()
{    
    int x = 8;
    x++;
    printf("%d %d %d ", x, x << 2, x >> 1);
}

C和C++中的参数求值顺序是未定义的。增量还是移位首先发生取决于实现和编译器优化。这样写代码是不可取的

int a() { printf("A"); return 0; }
int b() { printf("B"); return 0; }
int c() { printf("C"); return 0; }
如果您这样做:

printf("%d%d%d", a(), b(), c());

这并不一定意味着你会在你的主机上看到ABC。忽略0。

函数参数可以按任意顺序求值。所以副作用的顺序也不能保证。@P_u_uj_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_。更好的是:虽然这是C++,而不是C,虽然在这种情况下,它是相同的。