| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2537 人关注过本帖
标题:我预期的结果是30 ,为什么程序运行的结果是25?
只看楼主 加入收藏
hackzbst
Rank: 2
等 级:论坛游民
帖 子:27
专家分:54
注 册:2009-6-10
收藏
得分:0 
25  3楼正解。

别迷恋哥,哥只是一个传说......
2009-09-04 14:13
cexofj
Rank: 1
等 级:新手上路
帖 子:7
专家分:7
注 册:2009-9-4
收藏
得分:0 
哈哈.有意思.这就是C语言用++和--的副作用..
2009-09-04 19:15
248698530
Rank: 2
等 级:论坛游民
帖 子:46
专家分:22
注 册:2008-1-10
收藏
得分:0 
支持六楼的!!
2009-09-04 20:44
ic06123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:57
注 册:2009-9-2
收藏
得分:0 
与编译器有关,编译后的运算顺序应该是,--a,++a,然后再取运算结果,然而运算结果就存在a中,所以a值不变,结果为25.......
2009-09-04 21:08
ic06123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:57
注 册:2009-9-2
收藏
得分:0 
立场太不坚定了呵,都变好几次了,受教了。。。。
2009-09-04 21:12
chao1573
Rank: 2
等 级:论坛游民
帖 子:23
专家分:28
注 册:2007-6-28
收藏
得分:0 
比较支持20楼
2009-09-04 21:47
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:15 
首先,这个与具体的编译器无关,任何C编译器运算的结果都应当为25。
                                                                         .
我写了一段测试代码,环境为VC6 + Debug方式:
程序代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a = 5, b;
    b = ++a*--a;
    printf("b=%d\n", b);
    return 0;
}

我们反汇编 b = ++a*--a;这段代码,并跟踪调试和作注释:
8:        b = ++a*--a;
0040102F   mov         eax,dword ptr [ebp-4] ; [ebp-4]就是变量a,这行把a的值(5)给寄存器eax
00401032   add         eax,1                 ; eax + 1 = 5 + 1 = 6
00401035   mov         dword ptr [ebp-4],eax ; 然后又把6放回到变量a处,这样一来a = 6
00401038   mov         ecx,dword ptr [ebp-4] ; 接着把a的值6又给了寄存器ecx
0040103B   sub         ecx,1                 ; ecx - 1 = 6 - 1 = 5
0040103E   mov         dword ptr [ebp-4],ecx ; 把5又赋值给变量a
00401041   mov         edx,dword ptr [ebp-4] ; 又把a的值5给了寄存器edx
00401044   imul        edx,dword ptr [ebp-4] ; edx * a = 5 * 5 = 25 = edx
00401048   mov         dword ptr [ebp-8],edx ; [ebp-8]就是变量b,这一步把edx的值(25)给变量b
9:        printf("b=%d\n", b);
                                                                         .
上面反汇编的这段代码说明了变量a的值的变化过程就是先增加1变为6,然后又减1变回5,然后再5*5。所以,最终结果为25,而不是30的原因。


[ 本帖最后由 prankmoon 于 2009-9-4 22:31 编辑 ]
2009-09-04 22:25
ic06123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:57
注 册:2009-9-2
收藏
得分:0 
回复 27楼 prankmoon
相乘的时候为什么不是直接去寄存器中取值???
2009-09-04 22:46
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:0 
以下是引用ic06123在2009-9-4 22:46的发言:
相乘的时候为什么不是直接去寄存器中取值???
intel的《Instruction Set Reference》中说乘法允许一个是寄存器,另一个是内存(但不允许两个均为内存)。如果均使用寄存器的话,[ebp-4]将要被取出2次,比如:
mov edx, dword ptr [ebp-4]
mov ecx, dword ptr [ebp-4]
imul edx, ecx
这样就多了一条指令,也就浪费了计算时间。
                                                                     .
至于为什么不直接从寄存器取值,可能是因为要取的是变量a的值,而变量a的值并不在寄存器。这些应该是写编译器的人考虑的问题了。

[ 本帖最后由 prankmoon 于 2009-9-4 23:54 编辑 ]
2009-09-04 23:48
ic06123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:57
注 册:2009-9-2
收藏
得分:0 
以下是引用prankmoon在2009-9-4 23:48的发言:
intel的《Instruction Set Reference》中说乘法允许一个是寄存器,另一个是内存(但不允许两个均为内存)。如果均使用寄存器的话,[ebp-4]将要被取出2次,比如:
mov edx, dword ptr [ebp-4]
mov ecx, dword ptr [ebp- ...
我是说为什么在相乘的时候从eax和ecx中取值。。。。++a和--a这两个表达式的值就存在这两个寄存器呀。。。O(∩_∩)O~

[ 本帖最后由 ic06123 于 2009-9-5 10:46 编辑 ]
2009-09-05 10:44
快速回复:我预期的结果是30 ,为什么程序运行的结果是25?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019423 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved