C语言,int a=2,表达式(a<<=2/a)>>1的值是?

怎么算呀,一步步解释下好吗?... 怎么算呀,一步步解释下好吗? 展开
 我来答
seamaswong
推荐于2018-03-14 · TA获得超过1122个赞
知道小有建树答主
回答量:483
采纳率:0%
帮助的人:378万
展开全部
这里考查的是运算符的优先级
括号优先级最高,所以先看括号内部
/ 除法运算符的优先级比<<= 左移赋值优先级要高,所以先看2/a 结果为1,
a<<=1 就是 a=a<<1左移一位,因为初始 a是2,那么赋值后a是4
最后 4>>1 的值是 2

移位运算是根据2进制移的
比如 a =2 的时候,那么在计算机内存中,a就是(为了方便以8位来算,实际上现在的机器大部分是32位的,还有些是64位的,如果写成32位或者64位就太长了)
0000 0010 ,那么左移一位相当于
0000 0100 ,换算成 10进制就是4

移位这一块如果想了解的话可以自己去看一下书,相关的内容也是比较多的
比如数字在内存中是以补码的形式存在的,而不是正码或者反码,而且移位运算可以让一些计算变得很有趣,只不过理解这一块内容需要有一定的数学基础,比如你要计算 2^n ,也就是2的n次方,只需要 将1左移n就可以了 1<<n ——当然这个前提是不能够让数值超过机器所能表示的上限,比如在32位机下,1<<32那肯定会溢出的
追问
问题1:这个移位是根据int的字节进行把,比如移1位就是1*2,对吗?
问题2:为什么左移是加而不是减呢,应该和数轴的方向一样吧?
追答
在没溢出的情况下,左移1位确定是 *2
二进制数字的表示方法其实跟十进制差不多,越往左的位数也就越大
比如十进制数字 12345,
1 2 3 4 5
万 千 百 十 个
所以,当 1往左移的时候,它所能代表的数值当然会越来越大
sun_siliang
2012-06-26 · TA获得超过2.6万个赞
知道大有可为答主
回答量:9913
采纳率:100%
帮助的人:4617万
展开全部
(a<<=2/a)>>1
//先算2/a,表达式为:
(a<<=1)>>1
//再算a<<=1,即a=a<<1,a的值为1,表达式为:
1>>2
其值为2。
因此,最后a的值为1,表达式的值为2。
更多追问追答
追问
a=a>2为什么值是2呢?
追答
我写错了,改正如下:
(a>1
//先算2/a,表达式为:
(a>1
//再算a>1
其值为2。
因此,最后a的值为4,表达式的值为2。

a=a>2表示1左移2位,其值为0。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
NE_Z
2012-06-26 · TA获得超过1737个赞
知道小有建树答主
回答量:1687
采纳率:55%
帮助的人:584万
展开全部
肢解
a<<=2/a 就是a=a<<(2/a) a被赋值为a乘以2的2/a次方,计算完a为4
在>>1 就是a除以2的1次方,计算完整个表达式为2
自己编译了一下结果还是2
#include <stdio.h>
int main(void)
{
int a=2,b;
b=(a<<=2/a)>>1;
printf("%d",b);
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2017-12-30
展开全部
/ 除法运算符的优先级比<<= 左移赋值优先级要高,所以先看2/a 结果为1,
a<<=1 就是 a=a<<1左移一位,因为初始 a是2,那么赋值后a是4,
最后 4>>1 的值是 2
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
asfu520
2012-06-26
知道答主
回答量:53
采纳率:0%
帮助的人:18.5万
展开全部
好像是2.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式