永发信息网

unsigned a=16; printf(“%d,%d,%d\n”,a>>2,a=a>>2,a); 以上程序片段的输出结果是( ).

答案:4  悬赏:20  手机版
解决时间 2021-11-20 01:12
  • 提问者网友:酱爆肉
  • 2021-11-19 08:44
unsigned a=16; printf(“%d,%d,%d\n”,a>>2,a=a>>2,a); 以上程序片段的输出结果是( ).
最佳答案
  • 五星知识达人网友:未来江山和你
  • 2021-11-19 09:38
qwreasdasf追问char s[20]=”abcd”;
char *ssp=s;
sp++;
puts(strcat(sp,”ABCD”));
全部回答
  • 1楼网友:摆渡翁
  • 2021-11-19 12:07
输出:2
因为=运算符的优先级低于,(逗号)运算符,所以printf("%d\n",a=a+1,a+6,b+2);等效于:printf("%d\n",(a=a+1),(a+6),(b+2));也就是printf多提供了2个无用的参数
注意:不能把a=a+1,a+6,b+2当做是一个,(逗号)表达式
  • 2楼网友:天凉才是好个秋
  • 2021-11-19 10:33
最后 a的值是 4,因为第3次计算并没有进行赋值运算)
  • 3楼网友:duile
  • 2021-11-19 10:24
a=16 二进制 0001 0000 只写8位,前面更多位都是0,在此例中不影响结果
函数参数入栈的顺序是从右往左,
所以,最早计算的值是 第3个参数,16
第2个计算的是 第2个参数,也就是 a=a>>2, 将a右移2位赋值给a, 即0000 0100 值为 4
第3个计算的是 第一个参数 a>>2 右移2位,即 0000 0001 为 1
输出结果是 1, 4, 16
(最后 a的值是 4,因为第3次计算并没有进行赋值运算)

发现的一个问题,在VC编译器下,输出结果是 1,4,4, 看反汇编的代码发现是先算了第2个参数的,在另外一个编译器下输出是 1,4,16,由此可以肯定VC编译器出现错误,因为函数参数从右往左入栈这一点是毫无疑问的,即使是在VC下,int i=1; printf("%d,%d,%d",i++,i++,i++);这样的语句也是显示3,2,1 (由此证明从右往左计算),此例在VC下从第2项开始计算是错误的
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯