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

[复制链接]
6410|5
 楼主| gdutxzy 发表于 2011-10-11 12:18 | 显示全部楼层 |阅读模式
本帖最后由 gdutxzy 于 2011-10-11 12:22 编辑

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




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

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

反汇编结果为:


  1. 9:                 char abc;

  2. 10:                abc=3;

  3.    1D4     C03     MOVLW 0x3

  4.    1D5     03D     MOVWF 0x1d

  5. 11:                char m = 5;

  6.    1D6     C05     MOVLW 0x5

  7.    1D7     03C     MOVWF 0x1c

  8. 12:                if(m++>5)

  9.    1D8     C07     MOVLW 0x7

  10.    1D9     2BC     INCF 0x1c, F

  11.    1DA     09C     SUBWF 0x1c, W

  12.    1DB     703     BTFSS 0x3, 0

  13.    1DC     BDF     GOTO 0x1df

  14. 13:                  abc=0x34;

  15.    1DD     C34     MOVLW 0x34

  16.    1DE     BE0     GOTO 0x1e0

  17. 14:                 else  abc=0x56;

  18.    1DF     C56     MOVLW 0x56

  19.    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  反编译这东西不算准  这是我的想法  不一定对 ,但是优先级问题应该是主要问题。
ayb_ice 发表于 2011-10-12 21:11 | 显示全部楼层
最好不要写类似歧义代码
mcu9999 发表于 2011-10-12 22:11 | 显示全部楼层
简单又奇怪的问题

最好不要写类似歧义代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

153

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部