unsigned a=16;
printf("%d,%d,%d\n",a>>2,a=a>>2,a);
从右向左执行,最右侧a=16,然后a=a>>2,相当于a=a/4=4,然后再 a>>2,等于啊再除以4 ,等于1
明白C语言的函数参数入栈顺序就不难了,默认是从右向左,也就是说参数列表中的最后一个在栈底,而第一个参数在栈顶,所以第一个printf其实执行顺序是:
(1)a 所以输出的是16,此时a=16;
(2)a=(a>>2)相当于a = a/4 = 16 / 4=4所以输出的是4 ,此时a=4;
(3)a>>2 相当于a=a/4 = 4 / 4 =1所以输出的是1,此时a=1;
补充一点儿:右移一位相当于除以2,左移一位相当于乘以2,这里是a>>2,右移两位,因此相当于除以4。