打印

问一个C的问题

[复制链接]
2285|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++后,在执行判断?

使用特权

评论回复
5
lilihua0721| | 2011-9-29 20:07 | 只看该作者
先判断m>5,然后再加1,因为不符合if语句,所以执行else语句,执行else语句时,--m以后,m又等于5了,所以不能执行if语句

使用特权

评论回复
6
searover79| | 2011-9-30 11:00 | 只看该作者
2# tianm  
为什么不是先执行m++后,在执行判断?
此生不再 发表于 2011-9-29 20:03

还是先看看书吧

使用特权

评论回复
7
lcq07| | 2011-10-10 16:07 | 只看该作者
2# tianm  
不是我写的,只是看到了,然后在编译器上运行了一下,感觉怪怪的,为什么不是先执行m++后,在执行判断?
此生不再 发表于 2011-9-29 20:03

去看书,看看++m和m++的区别

使用特权

评论回复
8
baifang20| | 2011-10-10 17:02 | 只看该作者
M++是后执行的,如果是++M,才是你想的那样

使用特权

评论回复
9
lilihua0721| | 2011-10-10 21:01 | 只看该作者
为什么?哪有那么多为什么,只要知道就是那样的就可以了

使用特权

评论回复
10
lfzhou1006| | 2011-10-10 22:07 | 只看该作者
C语言语法就是这样的,记住就好了,没有太多为什么

使用特权

评论回复
11
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;

效果是一样的,经过编译后把反汇编文件拿出来看,
具体如下:

 
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
0X1C就是m了。

使用特权

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

本版积分规则

0

主题

26

帖子

1

粉丝