打印

无聊,转发个问题,if(m++>5) 是什么意思

[复制链接]
5166|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gdutxzy|  楼主 | 2011-10-11 12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gdutxzy 于 2011-10-11 12:22 编辑

if(m++>5) 编译后的结果为什么会是
if(m>6,m++)




最初是看这个贴子看到的,
楼主: [讨论] 问一个C的问题
int main( void )
{
int m = 5;
if ( m++ > 5)
printf(“%d\n”, m);
else
printf(“%d\n”, --m);
return 0;
}
为什么结果是执行“printf(“%d\n”, --m);“这句, if语句那就是如何判断的

这里是修改程序后编译的反汇编结果
使用PICC编译器,把程序作了如下修改
char abc;
abc=3;
char m = 5;
if(m++>5)
  abc=0x34;
else  abc=0x56;

反汇编结果为:


9:                 char abc;

10:                abc=3;

   1D4     C03     MOVLW 0x3

   1D5     03D     MOVWF 0x1d

11:                char m = 5;

   1D6     C05     MOVLW 0x5

   1D7     03C     MOVWF 0x1c

12:                if(m++>5)

   1D8     C07     MOVLW 0x7

   1D9     2BC     INCF 0x1c, F

   1DA     09C     SUBWF 0x1c, W

   1DB     703     BTFSS 0x3, 0

   1DC     BDF     GOTO 0x1df

13:                  abc=0x34;

   1DD     C34     MOVLW 0x34

   1DE     BE0     GOTO 0x1e0

14:                 else  abc=0x56;

   1DF     C56     MOVLW 0x56

   1E0     03E     MOVWF 0x1e
可以看见
12:                if(m++>5)
   1D8     C07     MOVLW 0x7
也就是if(m++>5)
编译后成为了if(m>6)或者说if(m>=7)。

我估计是因为++是右结合的符号,所以先计算右边的,也就是++5.
也许是这样吧。

但奇怪的是m得确又自加了,
12:                if(m++>5)
   1D8     C07     MOVLW 0x7
   1D9     2BC     INCF 0x1c, F

INCF 0x1c, F     指令就是m自加1了,真是神奇的编译。++被两个地方都用了。

相关帖子

沙发
xhtxzxw| | 2011-10-11 12:58 | 只看该作者
0x07是地址,不是值吧?

使用特权

评论回复
板凳
gdutxzy|  楼主 | 2011-10-11 16:15 | 只看该作者
本帖最后由 gdutxzy 于 2011-10-11 16:37 编辑

2# xhtxzxw


这个是MICRO CHIP 的PIC 单片机的汇编语言,没有错的,我就是写汇编的。

使用特权

评论回复
地板
孟德志0630| | 2011-10-12 15:03 | 只看该作者
优先级问题   算术运算符高于关系运算符高于赋值运算符  ++属于算数运算符所以最优先  m++  之后
m++>5类似于a+=1之类的写法,也就是a = a+1 推出m>++5  反编译这东西不算准  这是我的想法  不一定对 ,但是优先级问题应该是主要问题。

使用特权

评论回复
5
ayb_ice| | 2011-10-12 21:11 | 只看该作者
最好不要写类似歧义代码

使用特权

评论回复
6
mcu9999| | 2011-10-12 22:11 | 只看该作者
简单又奇怪的问题

最好不要写类似歧义代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

154

帖子

1

粉丝