| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1087 人关注过本帖
标题:[求助]求助 b=++a + ++a + ++a 得算法过程
只看楼主 加入收藏
chairmancui
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-7-10
收藏
 问题点数:0 回复次数:17 
[求助]求助 b=++a + ++a + ++a 得算法过程
求助 b=++a + ++a + ++a 得算法过程 a=3
那位高手教教我 我用的是Vc6.0
搜索更多相关主题的帖子: 算法 
2007-07-11 20:58
chairmancui
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-7-10
收藏
得分:0 
a=6我明白 为什么b=16?不明白
2007-07-11 20:58
THINKERYE
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-6-9
收藏
得分:0 

怎么有编译错误
#include <iostream.h>
int main(void){
int a=3,b;
b=++a+++a+++a;
cout<<a<<endl<<b<<endl;
return 0;
}
--------------------Configuration: Institution - Win32 Debug--------------------
Compiling...
R&D.CPP
D:\创世纪\MICHEAL\MyProjects\AAA Institution\R&D.CPP(4) : error C2105: '++' needs l-value
执行 cl.exe 时出错.

R&D.OBJ - 1 error(s), 0 warning(s)


2007-07-11 21:45
xiaotnai
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2007-6-8
收藏
得分:0 

在我来看如果A=3 那么B=15
可是我的编译器不这么认为 编译结果18


2007-07-11 21:47
xiaotnai
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2007-6-8
收藏
得分:0 

#include "stdio.h"
main()
{int a=3,b;
b=++a + ++a + ++a;
printf("%d",b);
getch();
}


2007-07-11 21:48
千金散尽
Rank: 1
等 级:新手上路
威 望:2
帖 子:55
专家分:0
注 册:2007-5-23
收藏
得分:0 
不同的编译器规定的结合性不一样。三楼的可以加上空格或者括号试一下。

才明白但已经晚了,希望结识想创业的朋友。
2007-07-11 21:55
weizifly
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-7-11
收藏
得分:0 
2007-07-11 21:58
THINKERYE
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-6-9
收藏
得分:0 
加括号和加空格之后都可以编译通过
#include <iostream.h>
int main(void){
int a=3,b;
b=(++a)+(++a)+(++a);
cout<<a<<endl<<b<<endl;
return 0;
}
输出
6
16

2007-07-11 22:02
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 


#include <stdio.h>
int main()
{
int a=3,b;
b=++a + ++a + ++a;
printf(\"%d\n\",b);
}


.file \"temp.c\"
.def ___main; .scl 2; .type 32; .endef
.text
LC0:
.ascii \"%d\12\0\"
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
call __alloca
call ___main
movl $3, -4(%ebp)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
incl (%eax)
movl -4(%ebp), %eax
movl -4(%ebp), %edx
addl %eax, %edx
leal -4(%ebp), %eax
incl (%eax)
movl %edx, %eax
addl -4(%ebp), %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
leave
ret
.def _printf; .scl 2; .type 32; .endef



我们可以看到它先做了两次自增运算,这时a=5了,然后做了一次加法运算,再做一次自增运算,最后做一次加法运算。5+5+6等于16
至于为什么这样处理,我也不知道,我认为这种题目没有意义,我记得这种在一个语句中使用多次对同一变量带有副作用的表达式,有时候会造成编译器依赖,不同的编译器会得到不同的答案,而且这种写法在实际编程中不会被使用,正因为有编译器依赖就更应该避免使用。
注意我没有说避免使用带有副作用的表达式,而是说避免在一个语句中多次使用对同一变量带有副作用的表达式。

2007-07-12 02:51
THINKERYE
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-6-9
收藏
得分:0 
同意楼上看法,除非你以"破解"某编译器的编译原理为乐,否则这种题只对应试教育的命题人有意义!
另想请教LS是怎么得到它的汇编程序的

2007-07-12 18:17
快速回复:[求助]求助 b=++a + ++a + ++a 得算法过程
数据加载中...
 
   



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

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