一个超简单的C++选择题?

achiever1992 2011-12-28 08:21:47
"#include<iostream.h>
void main( )
{
int i=5,k;
k=(++i)+(++i)+(i++);
cout<<k<<' '<<i<<endl;
}"



A、24 8 B、21 8 C、21 7 D、24 7
为什么选B呢?
++i和i++具体有什么区别,要有例子解释,通俗
...全文
438 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
xsniper001 2011-12-29
  • 打赏
  • 举报
回复
顶8楼的,看汇编,汇编很清纯
Zoelov 2011-12-29
  • 打赏
  • 举报
回复
i++和++i的区别在于先自增还是后自增,比如当i=2时,a = ++i; 运算完后结果是i=3 a = 3;因为++i是先自增然后再把值赋给a,所以他们都是3;对于a = i++;结果是i = 3,而a = 2;因为,这个i后自增,先把i的值赋给了a然后i自增,所以a=2 i=3;

对于你这个题不管是i++还是++i都是一样的,因为你加了括号,所以要先运算括号中的内容,运算结果是(6)+(7)+(8)=21而i=8
luliily 2011-12-29
  • 打赏
  • 举报
回复
i++是先使用i的值,再自加
++i是先自加,再使用i的值

我学C/C++的时候老师就是这样说的,你先读点代码,遇到多了也就很快理解了
blinwen 2011-12-29
  • 打赏
  • 举报
回复
一楼说的很好,很通俗
hondely 2011-12-29
  • 打赏
  • 举报
回复
20 8 吧
iamnobody 2011-12-29
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?10206

今天第四次贴这个链接了,,,,不要看老谭的书,害人不浅!!!!!!!!!!!!!
fyk810888 2011-12-29
  • 打赏
  • 举报
回复
七楼的哥们,照你那样解释也应该是6+7+7,最后调用i的时候才是8,现在的计算机教育真坑爹,这种问题好无意义。。。不同的C++系统输出结果不一样,建议看看裘老关于这方面的解释。。。
老孬斌 2011-12-29
  • 打赏
  • 举报
回复
i++是 i=i i=i+1
++i是 i=i+1 i=i
Enter空格 2011-12-29
  • 打赏
  • 举报
回复
这种问题,反汇编是解决之本。
牙牙学语 2011-12-29
  • 打赏
  • 举报
回复
这种东西很无聊呀,很无聊
iamnobody 2011-12-29
  • 打赏
  • 举报
回复
楼主怎么还不结呢???见10楼链接..


不要看老谭的书!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
jijiyuyisheng 2011-12-29
  • 打赏
  • 举报
回复
应该是20 8

不过感觉这种题目很无聊的。都TM找抽
苹果皮 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shenandyi 的回复:]

为什么不是 20,8 呢??
[/Quote]

我也以为是20,8 !!!!
卡卡_苏米 2011-12-29
  • 打赏
  • 举报
回复
哎 这都是没事找事干的
AlburtHoffman 2011-12-29
  • 打赏
  • 举报
回复
这个表达式的求值在C/C++中是未定义的,具体的求值过程见具体的编译器实现。

楼主可以认真阅读下面这篇文章《C/C++中的表达式求解和序列点概念》

一般来说,不推荐在一个表达式中使用两个以上的自增自减操作符。那样的表达式基本上是未定义的。
超级僵尸 2011-12-29
  • 打赏
  • 举报
回复
i=3,m=3;
j=(++m)-(++m);
k=(++i)+(++i);
输出结果是i=5,m=5,j=0,k=0
i=3,m=3,n=3;
j=(++m)-(++m)+(++m);
p=(++n)*(++n)*(++n);
k=(++i)+(++i)+(++i);
输出结果是i=6,m=6,n=6,j=6,p=150,k=16
个人分析:平级的++i是两个同时算的(可能与加减乘除是双目运算有关,算完之后再算第三个。所以前两个相同,都是5,第三个是6。
比如S=A+B+C+D
先算S1=A+B,S=S1+C+D
然后S2=S1+C,S=S2+D
即从左到右两个运算一次,因为加减乘除都是双目运算,所以两个进行一次运算

k=(7+7)+(i++)=14+(i++)=14+7=21;同时算前两个++i,i立即变为7,i++在这条语句后变为8
帅得不敢出门 2011-12-29
  • 打赏
  • 举报
回复
无意义的问题呀
楼主是自寻烦恼

而且为什么还有一堆的人也跟着?

10楼 链接 为标准答案。
achiever1992 2011-12-29
  • 打赏
  • 举报
回复
谢谢各位踊跃发言,这种2B题目确实很坑爹。。。
wangjieest 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 zoelov 的回复:]

i++和++i的区别在于先自增还是后自增,比如当i=2时,a = ++i; 运算完后结果是i=3 a = 3;因为++i是先自增然后再把值赋给a,所以他们都是3;对于a = i++;结果是i = 3,而a = 2;因为,这个i后自增,先把i的值赋给了a然后i自增,所以a=2 i=3;

对于你这个题不管是i++还是++i都是一样的,因为你加了括号,所以要先运算括号中的内容,运算结果是(6)+……
[/Quote]
括号能作为i++的分割点么?
KK_Liang 2011-12-29
  • 打赏
  • 举报
回复
这个正解。
1. ++i //i 为6
2. 第二个++i // i为7
3. (++i)+(++i) 和为14 ,i值为7
4. 最后(i++) 与14和为21 i值加1 为8

最后结果 k 值为21 i值为8

7楼的兄弟,不能把括号内的值一个一个算完在相加,虽然结果很想。++无视括号的

[Quote=引用 14 楼 yuan512341959 的回复:]

4: int i=5,k;
00401058 mov dword ptr [ebp-4],5 [ebp-4] = 5
5: k=(++i)+(++i)+(i++);
0040105F mov eax,dword ptr [ebp-4] eax = 5
00401062 add eax,1 eax = 6
00401065 mov d……
[/Quote]
加载更多回复(18)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧