鱼C论坛

 找回密码
 立即注册
查看: 2255|回复: 14

[已解决]i++和i--例题遇到的困扰,求解答。

[复制链接]
发表于 2015-11-9 19:02:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 xiawiner 于 2015-11-9 19:26 编辑

#include <stdio.h>

void main()
{
        int i = 8;

        printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i,--i , i++, i--, -i++, -i--);

}


以上是代码,输出后的结果依次是:8  8  7  8  -7  -8 。

例题说不同的编译系统不一定相同,可以从左到右,也可以从右到左。这道题如果按从右到左的顺序的话,第二个--i的值不应该等于8啊?如果从左到右更不对了,真的很头疼。不知道问题出在哪,希望有大虾能够详细的解答下,:cry
最佳答案
2015-11-10 13:08:12
--i,和++i当行生效,i--和i++次行生效,理解好这个就行,当然这种题最蛋疼,反汇编给跪了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-9 19:25:40 | 显示全部楼层
顶起来,没有解决啊,手残点错了。、。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-9 20:03:54 | 显示全部楼层
好像的确如此!搞不明白呀~
QQ拼音截图未命名.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-10 07:23:01 | 显示全部楼层
本帖最后由 xiawiner 于 2015-11-10 07:43 编辑
~风介~ 发表于 2015-11-9 20:03
好像的确如此!搞不明白呀~


管理大大,问题到底出在哪啊,我看你的答案是正确的,到底怎么回事啊。我的推断没有错,但是怎么调试就不一样了,编译器的问题还是有哪些细节没有掌握啊?不能悬赏,不好意思。谁会谁教我,悬赏+此例题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-10 08:16:56 | 显示全部楼层
已测试,换了编译器,还是错误的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-10 09:40:58 | 显示全部楼层
//VS2013下反汇编         
printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i,--i , i++, i--, -i++, -i--);
010113E5 8B 45 F8             mov         eax,dword ptr [i]  
010113E8 F7 D8                neg         eax  
010113EA 89 85 30 FF FF FF    mov         dword ptr [ebp-0D0h],eax  
010113F0 8B 4D F8             mov         ecx,dword ptr [i]  
010113F3 83 E9 01             sub         ecx,1  
010113F6 89 4D F8             mov         dword ptr [i],ecx  
010113F9 8B 55 F8             mov         edx,dword ptr [i]  
010113FC F7 DA                neg         edx  
010113FE 89 95 2C FF FF FF    mov         dword ptr [ebp-0D4h],edx  
01011404 8B 45 F8             mov         eax,dword ptr [i]  
01011407 83 C0 01             add         eax,1  
0101140A 89 45 F8             mov         dword ptr [i],eax  
0101140D 8B 4D F8             mov         ecx,dword ptr [i]  
01011410 89 8D 28 FF FF FF    mov         dword ptr [ebp-0D8h],ecx  
01011416 8B 55 F8             mov         edx,dword ptr [i]  
01011419 83 EA 01             sub         edx,1  
0101141C 89 55 F8             mov         dword ptr [i],edx  
0101141F 8B 45 F8             mov         eax,dword ptr [i]  
01011422 89 85 24 FF FF FF    mov         dword ptr [ebp-0DCh],eax  
01011428 8B 4D F8             mov         ecx,dword ptr [i]  
0101142B 83 C1 01             add         ecx,1  
0101142E 89 4D F8             mov         dword ptr [i],ecx  
01011431 8B 55 F8             mov         edx,dword ptr [i]  
01011434 83 EA 01             sub         edx,1  
01011437 89 55 F8             mov         dword ptr [i],edx  
0101143A 8B 45 F8             mov         eax,dword ptr [i]  
0101143D 83 C0 01             add         eax,1  
01011440 89 45 F8             mov         dword ptr [i],eax  
01011443 8B F4                mov         esi,esp  
01011445 8B 8D 30 FF FF FF    mov         ecx,dword ptr [ebp-0D0h]  
0101144B 51                   push        ecx  
0101144C 8B 95 2C FF FF FF    mov         edx,dword ptr [ebp-0D4h]  
01011452 52                   push        edx  
01011453 8B 85 28 FF FF FF    mov         eax,dword ptr [ebp-0D8h]  
01011459 50                   push        eax  
0101145A 8B 8D 24 FF FF FF    mov         ecx,dword ptr [ebp-0DCh]  
01011460 51                   push        ecx  
01011461 8B 55 F8             mov         edx,dword ptr [i]  
01011464 52                   push        edx  
01011465 8B 45 F8             mov         eax,dword ptr [i]  
01011468 50                   push        eax  
01011469 68 CC 59 01 01       push        10159CCh  
0101146E FF 15 14 91 01 01    call        dword ptr ds:[1019114h]  
01011474 83 C4 1C             add         esp,1Ch  
01011477 3B F4                cmp         esi,esp  
01011479 E8 B8 FC FF FF       call        __RTC_CheckEsp (01011136h) 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-10 09:43:45 | 显示全部楼层
编译器的问题,不用纠结这种问题,我的gcc和你的输出一样,C99
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-10 09:43:55 | 显示全部楼层
不同编译器对语句的具体实现有差别,进而可能得出匪夷所思的结果。
想了解其中的缘由,需要你自己去看代码的反汇编。(原谅我看不懂以上反汇编~@阴影中的曙光 @仰望天上的光
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-10 09:47:43 | 显示全部楼层
如果想要防止该问题,可以参考以下写法~
#include <stdio.h>

int main()
{
        int i = 8;

        printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i,--i , i++, i--, -i++, -i--);

        /*
        printf("%d\n", i);
        ++i;
        printf("%d\n", i);
        i = 8;
        --i;
        printf("%d\n", i);
        i = 8;
        i++;
        printf("%d\n", i);
        i = 8;
        i--;
        printf("%d\n", i);
        */

        /*
        printf("%d\n", ++i);
        i = 8;
        printf("%d\n", --i);
        i = 8;
        printf("%d\n", i++);
        i = 8;
        printf("%d\n", i--);

        getchar();
        */

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-10 11:12:11 | 显示全部楼层
~风介~ 发表于 2015-11-10 09:47
如果想要防止该问题,可以参考以下写法~

谢谢管理大大。昨天我也试了看反汇编,无奈看不懂。才来求助。。谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-10 11:14:45 | 显示全部楼层
淡雅夏伤 发表于 2015-11-10 09:43
编译器的问题,不用纠结这种问题,我的gcc和你的输出一样,C99

好的,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-10 13:08:12 | 显示全部楼层    本楼为最佳答案   
--i,和++i当行生效,i--和i++次行生效,理解好这个就行,当然这种题最蛋疼,反汇编给跪了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-10 22:20:24 | 显示全部楼层
看过一眼裘宗燕老师的书,说避免这种用法,要不就用括号。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-13 18:27:54 | 显示全部楼层
小驾驭说过 ,不要纠结这个问题,不同的编译器,算出来的都不一样.再说了 ,你做程序时根本用不到这么长 .

不要在这上面消耗精力了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-13 20:35:17 | 显示全部楼层
纠结这些没个卵用的问题干嘛。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表