标题: 没搞懂这两句代码结果为啥不一样 [打印本页]

作者: glinfei    时间: 2021-1-29 11:40
标题: 没搞懂这两句代码结果为啥不一样
Time_h=(i/16)*10+i%16;
Time_h=(i>>4)*10+i&0x0f;
前一句就可以,后一句十位不对,但把i&0x0f放前边就行了,难到时编译器的问题?
作者: munuc_w    时间: 2021-1-29 12:49
抛开物理意义,单看数值,这两条语句功能等同。
作者: 名字不是重点    时间: 2021-1-29 13:21
从左到右:i>>4之后,i的值变了。到了i&0x0f,这时的i已不 原来的i,
而前一句i至始至终没改过
作者: glinfei    时间: 2021-1-29 13:22
本来习惯用第一种写法,昨天脑抽写了第二种的,显示的就总出错,刚刚突然琢磨出来,Keil居然是先加后与。
作者: 名字不是重点    时间: 2021-1-29 13:27
glinfei 发表于 2021-1-29 13:22
本来习惯用第一种写法,昨天脑抽写了第二种的,显示的就总出错,刚刚突然琢磨出来,Keil居然是先加后与。

Time_h=(i>>4)*10+(i&0x0f);试试
作者: sync763    时间: 2021-1-29 13:46
C语言中+ - 的运算优先级要高于&(位与),&(取地址)运算要高于+ - 运算。
作者: wulin    时间: 2021-1-29 14:00
优先级和结合性
C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。 而在一个运算量两侧的运算符优先级相同时, 则按运算符的结合性所规定的结合方向处理。 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合, 执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。

作者: glinfei    时间: 2021-1-29 15:00
名字不是重点 发表于 2021-1-29 13:27
Time_h=(i>>4)*10+(i&0x0f);试试

试过了,就是忘记优先顺序了,还以为发现编译器的bug呢
作者: 心有浮生    时间: 2021-1-29 16:23
我从来不记优先级,都是用括号
作者: fj51hei    时间: 2021-1-29 19:58
名字不是重点 发表于 2021-1-29 13:21
从左到右:i>>4之后,i的值变了。到了i&0x0f,这时的i已不 原来的i,
而前一句i至始至终没改过

对的,是这样!
作者: jizhongbiao    时间: 2023-2-22 11:23
运算符结合的问题,基础不扎实。去看看C语言基础教程。
作者: wufa1986    时间: 2023-2-22 11:44
写程序要多加括号,不要想当然




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1