| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 945 人关注过本帖
标题:关于自加的问题。。
只看楼主 加入收藏
mapeiyun
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-1-4
收藏
 问题点数:0 回复次数:12 
关于自加的问题。。
m=2,j=2
m+=(j++)+(++j)+(j++)
求M的值

这个的答案我调试了下 是11
 由于刚学,但是我怎么算都是12,请前辈们给我解决下。谢谢了
2010-01-04 20:39
指手画脚
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:334
专家分:560
注 册:2009-12-28
收藏
得分:0 
vc的debug版编译成汇编 其中m+=(j++)+(++j)+(j++)编译成汇编:
程序代码:
; Line 10
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax
    mov    ecx, DWORD PTR _j$[ebp]
    add    ecx, DWORD PTR _j$[ebp]
    add    ecx, DWORD PTR _j$[ebp]
    mov    edx, DWORD PTR _m$[ebp]
    add    edx, ecx
    mov    DWORD PTR _m$[ebp], edx
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax
    mov    ecx, DWORD PTR _j$[ebp]
    add    ecx, 1
    mov    DWORD PTR _j$[ebp], ecx
加上注释 你就明白了:
程序代码:
; Line 10
    ++j
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax

    ecx=j+j+j
    mov    ecx, DWORD PTR _j$[ebp]
    add    ecx, DWORD PTR _j$[ebp]
    add    ecx, DWORD PTR _j$[ebp]
    
    m=m+ecx
    mov    edx, DWORD PTR _m$[ebp]
    add    edx, ecx
    mov    DWORD PTR _m$[ebp], edx
    
    j++
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax
    j++
    mov    ecx, DWORD PTR _j$[ebp]
    add    ecx, 1
    mov    DWORD PTR _j$[ebp], ecx

如果是:
m = (j++)+(++j)+(++j)+(j++);
那编译器会把程序编译成:
程序代码:
; Line 10
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax
    mov    ecx, DWORD PTR _j$[ebp]
    add    ecx, DWORD PTR _j$[ebp]
    mov    edx, DWORD PTR _j$[ebp]
    add    edx, 1
    mov    DWORD PTR _j$[ebp], edx
    add    ecx, DWORD PTR _j$[ebp]
    add    ecx, DWORD PTR _j$[ebp]
    mov    DWORD PTR _m$[ebp], ecx
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax
    mov    ecx, DWORD PTR _j$[ebp]
    add    ecx, 1
    mov    DWORD PTR _j$[ebp], ecx
也就是说:
程序代码:
; Line 10
    ++j
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax

    ecx=j+j
    mov    ecx, DWORD PTR _j$[ebp]
    add    ecx, DWORD PTR _j$[ebp]

    ++j
    mov    edx, DWORD PTR _j$[ebp]
    add    edx, 1
    mov    DWORD PTR _j$[ebp], edx
    
    ecx=j+j
    add    ecx, DWORD PTR _j$[ebp]
    add    ecx, DWORD PTR _j$[ebp]

    m=ecx
    mov    DWORD PTR _m$[ebp], ecx

    j++
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax
    
    j++
    mov    ecx, DWORD PTR _j$[ebp]
    add    ecx, 1
    mov    DWORD PTR _j$[ebp], ecx
慢慢理解吧

[ 本帖最后由 指手画脚 于 2010-1-5 08:51 编辑 ]

世界很简单 是非很复杂
有些东西是你的 但是你质疑的多了 可能就不是你的了
2010-01-04 21:22
等风的旗3413
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-1-4
收藏
得分:0 
m+=2+3+4
m=9+2
m=11
2010-01-04 21:55
nbyyxjhqq
Rank: 1
等 级:新手上路
帖 子:6
专家分:6
注 册:2010-1-4
收藏
得分:0 
回复 3楼 等风的旗3413
那为什么不是 m+=2+4+4么?
2010-01-04 22:05
mapeiyun
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-1-4
收藏
得分:0 
我怎么算都是2+4+4  
至于2楼的,暂时是一点都看不懂
2010-01-04 22:33
指手画脚
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:334
专家分:560
注 册:2009-12-28
收藏
得分:0 
以下是引用mapeiyun在2010-1-4 22:33:21的发言:

 我怎么算都是2+4+4  
至于2楼的,暂时是一点都看不懂
看过程就行 不用看汇编源码

世界很简单 是非很复杂
有些东西是你的 但是你质疑的多了 可能就不是你的了
2010-01-04 22:35
jiangwu10057
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:341
专家分:667
注 册:2009-3-25
收藏
得分:0 
求值顺序是右结合型
j++和++j是不一样的
j++是把j原来的值赋给式子在自增
++j是先加在赋值
所以是这样的
11=2+=4+3+2
2010-01-04 22:48
andytony1234
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:74
专家分:102
注 册:2009-11-9
收藏
得分:0 
括号最优先..三个括号优先级都是一样的..所以三个括号都是3..
我把程序改成这样.
#include<stdio.h>
void main()
{int m,j;
m=2,j=2;
m+=(j++);
printf("%d ",m);
m+=(++j);
printf("%d ",m);
m+=(j++);
printf("%d ",m);
}就输出.4 8 12
但放在一起,就是3+3+3=9
9+2=11
2010-01-04 22:56
mapeiyun
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-1-4
收藏
得分:0 
以下是引用andytony1234在2010-1-4 22:56:17的发言:

括号最优先..三个括号优先级都是一样的..所以三个括号都是3..
我把程序改成这样.
#include<stdio.h>
void main()
{int m,j;
m=2,j=2;
m+=(j++);
printf("%d ",m);
m+=(++j);
printf("%d ",m);
m+=(j++);
printf("%d  ...
8楼的答案让我豁然开朗,其他的虽然我都是不是很理解,但是还是谢谢各位前辈的辛劳。。
2010-01-05 00:09
liangwenbc
Rank: 3Rank: 3
来 自:广州
等 级:论坛游侠
帖 子:168
专家分:174
注 册:2008-6-11
收藏
得分:0 
教你个办法,在一个式子中变量前面有n个++变量就先加n然后再计算式子,如m=2,j=2
m+=(j++)+(++j)+(j++)+(++j)得m=2+4+4+4+4=18
--也是如此

qq7434391
2010-01-05 00:23
快速回复:关于自加的问题。。
数据加载中...
 
   



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

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