问一个C的问题

[复制链接]
3127|10
 楼主| 此生不再 发表于 2011-9-29 00:19 | 显示全部楼层 |阅读模式
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语句那就是如何判断的
tianm 发表于 2011-9-29 01:25 | 显示全部楼层
因为 m不大于5 这个代码是你写的吗
searover79 发表于 2011-9-29 08:24 | 显示全部楼层
先判断m>5,再++,因为不符合if语句,所以执行else语句,执行else语句时,--m以后,m又等于5了,所以始终不能执行if语句
再一个应该加一个死循环或者在return前加一个while(1);防止程序跑飞。
 楼主| 此生不再 发表于 2011-9-29 20:03 | 显示全部楼层
2# tianm
不是我写的,只是看到了,然后在编译器上运行了一下,感觉怪怪的,为什么不是先执行m++后,在执行判断?
lilihua0721 发表于 2011-9-29 20:07 | 显示全部楼层
先判断m>5,然后再加1,因为不符合if语句,所以执行else语句,执行else语句时,--m以后,m又等于5了,所以不能执行if语句
searover79 发表于 2011-9-30 11:00 | 显示全部楼层
2# tianm  
为什么不是先执行m++后,在执行判断?
此生不再 发表于 2011-9-29 20:03

还是先看看书吧
lcq07 发表于 2011-10-10 16:07 | 显示全部楼层
2# tianm  
不是我写的,只是看到了,然后在编译器上运行了一下,感觉怪怪的,为什么不是先执行m++后,在执行判断?
此生不再 发表于 2011-9-29 20:03

去看书,看看++m和m++的区别
baifang20 发表于 2011-10-10 17:02 | 显示全部楼层
M++是后执行的,如果是++M,才是你想的那样
lilihua0721 发表于 2011-10-10 21:01 | 显示全部楼层
为什么?哪有那么多为什么,只要知道就是那样的就可以了
lfzhou1006 发表于 2011-10-10 22:07 | 显示全部楼层
C语言语法就是这样的,记住就好了,没有太多为什么
gdutxzy 发表于 2011-10-10 23:22 | 显示全部楼层
1# 此生不再

我用的是MPLAB 8.5运行的,也就是PIC单片机的集成环境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
0X1C就是m了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

26

帖子

1

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