我是一个菜鸟,请教一个i++和++i的小问题,非常感谢!

HuoChunGuang 2007-04-17 05:29:35
这到题如下:

int main(void)
{
int a=0,b=0,i=5;
a=(i++)+(i++)+(i++);
i=5;
b=(++i)+(++i)+(++i);
printf("%d\n%d",a,b);
getch();
return 0;
}
请问程序结束后 a和b的值分别是什么?为什么?
我通过实验得知,a=15;b=24。a的值我可以理解,因为a先参与运算再自增1,a=(5)+(5)+(5)=15,那b呢 我有点不理解了,请高手帮我分析分析。
不胜感激!!!
对了,我是新来的,可能没有分给,希望大家原谅!!!
...全文
510 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lenic__ 2007-06-06
  • 打赏
  • 举报
回复
很诡异的一个问题,我用VC 2005速成版编译结果得到b=24……
但是我自己想的是这个b=(++5)+(++6)+(++7)=21才对。搞不清C编译器是怎么编译的。按照编译结果解释应该是:先做完这一语句中一个变量的所有的++语句,然后再相加。因为++的优先级大于+!
然后我又做了一段这样的代码,来印证我的想法是不是对的:
#include<iostream>
using namespace std;
void main(){
int i=5,b,j=2,c;
b=(++i)+(++i)+(++i);
c=(++i)+(++i)+(++i)+(++j)+(++j);
cout<<b<<endl;
cout<<c<<endl;
getchar();
}
我自己算了一下,b=这一行先算完++运算(因为这是一个语句),i应该等于8,这个时候再进行+运算,b=8+8+8=24。到了c=这一行,也是这样运算。因为之前i就等于8了,所以做完这一行的运算,i=8+1+1+1=11。同样的问题,这一行之后j=4。这样c=11+11+11+4+4=41。你可以自己验证一下!
还有一点就是我也是新加入的,刚开始学C和C++的时间也不算太长。凡事只要仔细一点,好好思考,还是能够解决的。我不是就解决了,不是吗!
winner8080 2007-06-06
  • 打赏
  • 举报
回复
++i效率要高一点
st_mj 2007-06-06
  • 打赏
  • 举报
回复
你的编译器不会是默认为在此运算式中用了三次加完后再预算吧。
8+8+8=24.
不过这种讨论确实比较没意思,一般情况下是不会这样使用的。
可以把它拆成3个句子,这样不管那种意思就很清楚了。
shengcfy 2007-06-06
  • 打赏
  • 举报
回复
我也是菜鸟,测试结果如下(实验环境,WINTC)
#include<stdio.h>
void main()
{
int b=0,i=5;
b=(++i);
printf("%d\n",b);
getch();
结果6

#include<stdio.h>
void main()
{
int b=0,i=5;
b=(++i)+(++i);
printf("%d\n",b);
getch();

结果14

#include<stdio.h>
void main()
{
int b=0,i=5;
b=(++i)+(++i)+(++i);
printf("%d\n",b);
getch();
结果24

结论:因为按照运算优先级 先做3次++i 表达式(++i)的值为8
然后回过头来做+运算 即b=8+8+8

楼上楼上的楼上正确
自己的结论,不知对不对.
gracefullee 2007-06-06
  • 打赏
  • 举报
回复
我来说一个办法:
b=(++i)
b=(++i)+(++i)
b=(++i)+(++i)+(++i)
b=(++i)+(++i)+(++i)+(++i)
………………
就这样推下去,看结果是怎么得到的
chai2010 2007-06-06
  • 打赏
  • 举报
回复
这种题目比较变态,建议删除!
llyzq1987 2007-06-06
  • 打赏
  • 举报
回复
应该很好理解吧,6+7+8=22????
6+7+8=21 - -
vc 6.0的编译很鬼异
EdwardYangYang 2007-06-06
  • 打赏
  • 举报
回复
昨天刚看到相关的内容
这是相对比较特殊的例子
i=5;
b=(++i)+(++i)+(++i);

b的结果等于24

因为按照运算优先级 先做3次++i 表达式(++i)的值为8
然后回过头来做+运算 即b=8+8+8
sixiangzhanshi 2007-06-05
  • 打赏
  • 举报
回复
估计是优先级别的问题!!
很难理解!!
weijunbo 2007-04-24
  • 打赏
  • 举报
回复
电脑是这样来编译的
(++i)+(i++)=6+(6+1)+1
(++i)+(--1)=6+(6-1)-1
同理得出b= (++i)+(++i)+(++i)=6+(6+1)+(7+1)+1
我业不知道为什么
sampson_fox 2007-04-19
  • 打赏
  • 举报
回复
恩,VC6的 b=22 怎么来的很有必要讨论下呀。哪位出手。
hansin 2007-04-19
  • 打赏
  • 举报
回复
22怎么来的呢?
lisheng053758 2007-04-19
  • 打赏
  • 举报
回复

你看用下面一段代码,你就可以分析出你的编译器如何计算
这其中包括的知识点有运算的优先级顺序,编译器的执行运算;
不知对你有帮助没
# include "stdio.h"

int main(void)
{
int a=0,b=0,i=5,r1,r2,r3;
a=(i++)+(i++)+(i++);
i=5;
b=(r1=++i)+(r2=++i)+(r3=++i);
printf("%d\n%d",a,b);
printf("%d\n%d\n%d",r1,r2,r3);//这段代码用来调试来用的
getch( );
return 0;
}
guanwl 2007-04-18
  • 打赏
  • 举报
回复
写复杂的表达式是人为制造bug.
除了阅读上的困难.编译也困难.
有的时候编译器甚至会骗你.
fqyy1234 2007-04-18
  • 打赏
  • 举报
回复
怎么没人解释用VC6.0 那个22的值怎么来的呢
intuition444 2007-04-18
  • 打赏
  • 举报
回复
哈哈,错了,错了,不好意思
intuition444 2007-04-18
  • 打赏
  • 举报
回复
VC6.0测试结果
15,22
应该很好理解吧,6+7+8=22
syunt 2007-04-17
  • 打赏
  • 举报
回复
很有意思,我也试试
HuoChunGuang 2007-04-17
  • 打赏
  • 举报
回复
谢谢各位的回答!!
编译器不同 ,得到的结果也不同吗,
我用的是一个共享的软件 Win-TC,我也用vc 6,0试一下吧,再次感谢!
friarchen 2007-04-17
  • 打赏
  • 举报
回复
这跟编译器是密切相关的。我觉得我们自己写程序的时候尽量避免写这样子的东西,如果别人的程序里有这样的东西,我们就实地到编译器上去验证一下。
唉,痛苦呀。面试的时候就喜欢问这些东西。
加载更多回复(2)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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