本帖最后由 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了,真是神奇的编译。++被两个地方都用了。 |