i++和i--例题遇到的困扰,求解答。
本帖最后由 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--);
}
以上是代码,输出后的结果依次是:8878-7-8 。
例题说不同的编译系统不一定相同,可以从左到右,也可以从右到左。这道题如果按从右到左的顺序的话,第二个--i的值不应该等于8啊?如果从左到右更不对了,真的很头疼。不知道问题出在哪,希望有大虾能够详细的解答下,:cry 顶起来,没有解决啊,手残点错了。、。 好像的确如此!搞不明白呀~{:7_138:}
本帖最后由 xiawiner 于 2015-11-10 07:43 编辑
~风介~ 发表于 2015-11-9 20:03
好像的确如此!搞不明白呀~
管理大大,问题到底出在哪啊,我看你的答案是正确的,到底怎么回事啊。我的推断没有错,但是怎么调试就不一样了,编译器的问题还是有哪些细节没有掌握啊?不能悬赏,不好意思。谁会谁教我,悬赏+此例题。 已测试,换了编译器,还是错误的结果。 //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
010113E8 F7 D8 neg eax
010113EA 89 85 30 FF FF FF mov dword ptr ,eax
010113F0 8B 4D F8 mov ecx,dword ptr
010113F3 83 E9 01 sub ecx,1
010113F6 89 4D F8 mov dword ptr ,ecx
010113F9 8B 55 F8 mov edx,dword ptr
010113FC F7 DA neg edx
010113FE 89 95 2C FF FF FF mov dword ptr ,edx
01011404 8B 45 F8 mov eax,dword ptr
01011407 83 C0 01 add eax,1
0101140A 89 45 F8 mov dword ptr ,eax
0101140D 8B 4D F8 mov ecx,dword ptr
01011410 89 8D 28 FF FF FF mov dword ptr ,ecx
01011416 8B 55 F8 mov edx,dword ptr
01011419 83 EA 01 sub edx,1
0101141C 89 55 F8 mov dword ptr ,edx
0101141F 8B 45 F8 mov eax,dword ptr
01011422 89 85 24 FF FF FF mov dword ptr ,eax
01011428 8B 4D F8 mov ecx,dword ptr
0101142B 83 C1 01 add ecx,1
0101142E 89 4D F8 mov dword ptr ,ecx
01011431 8B 55 F8 mov edx,dword ptr
01011434 83 EA 01 sub edx,1
01011437 89 55 F8 mov dword ptr ,edx
0101143A 8B 45 F8 mov eax,dword ptr
0101143D 83 C0 01 add eax,1
01011440 89 45 F8 mov dword ptr ,eax
01011443 8B F4 mov esi,esp
01011445 8B 8D 30 FF FF FF mov ecx,dword ptr
0101144B 51 push ecx
0101144C 8B 95 2C FF FF FF mov edx,dword ptr
01011452 52 push edx
01011453 8B 85 28 FF FF FF mov eax,dword ptr
01011459 50 push eax
0101145A 8B 8D 24 FF FF FF mov ecx,dword ptr
01011460 51 push ecx
01011461 8B 55 F8 mov edx,dword ptr
01011464 52 push edx
01011465 8B 45 F8 mov eax,dword ptr
01011468 50 push eax
01011469 68 CC 59 01 01 push 10159CCh
0101146E FF 15 14 91 01 01 call dword ptr ds:
01011474 83 C4 1C add esp,1Ch
01011477 3B F4 cmp esi,esp
01011479 E8 B8 FC FF FF call __RTC_CheckEsp (01011136h) 编译器的问题,不用纠结这种问题,我的gcc和你的输出一样,C99 不同编译器对语句的具体实现有差别,进而可能得出匪夷所思的结果。
想了解其中的缘由,需要你自己去看代码的反汇编。(原谅我看不懂以上反汇编~{:7_138:})@阴影中的曙光 @仰望天上的光 如果想要防止该问题,可以参考以下写法~
#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;
} ~风介~ 发表于 2015-11-10 09:47
如果想要防止该问题,可以参考以下写法~
谢谢管理大大。昨天我也试了看反汇编,无奈看不懂。才来求助。。谢谢。 淡雅夏伤 发表于 2015-11-10 09:43
编译器的问题,不用纠结这种问题,我的gcc和你的输出一样,C99
好的,谢谢你 --i,和++i当行生效,i--和i++次行生效,理解好这个就行,当然这种题最蛋疼,反汇编给跪了 看过一眼裘宗燕老师的书,说避免这种用法,要不就用括号。 小驾驭说过 ,不要纠结这个问题,不同的编译器,算出来的都不一样.再说了 ,你做程序时根本用不到这么长 .
不要在这上面消耗精力了 纠结这些没个卵用的问题干嘛。
页:
[1]