一个关于c语言的++,--的问题

SeekInRain 2000-08-14 11:44:00
int i=3,k;
k=++i+(++i)+(++i);

小弟算来算去总是15,但结果应该是18, 请高手详细分析一下吧!!!!!1 小菜鸟感激不尽!!!!!!!!!!
...全文
428 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
E 2001-02-03
  • 打赏
  • 举报
回复
肯定是个白痴
graygu 2001-02-03
  • 打赏
  • 举报
回复
还是要注意新旧编译器的区别。程序中可能会有这样的语句
k= ++i+i++;
fty 2001-02-03
  • 打赏
  • 举报
回复
如果程序中有 k= ++i+i++; 这样的语句.那编程的不是个白痴就是个天才.
tom7587758 2001-02-02
  • 打赏
  • 举报
回复
真是吃饱撑着!对于初学者,这种问题可以先留到后来再做。如果你要的话。
k=++i+(++i)+(++i);
先讨论优先级,自增运算符》计算运算符。3个自增运算符一起,++i=6.在把
3个++i相加得18。
可以这样理解。
hoyle 2000-08-21
  • 打赏
  • 举报
回复
对不起,我把名字打错了,应该是jiujiejushi
hoyle 2000-08-21
  • 打赏
  • 举报
回复
jiujieshi:
我言语不周,向你道歉。
我把我所知道的东西再说一遍吧。这个问题早在95年电脑报上就有人提出来过,我当时年幼,看了一些高手的解答。有一种解答比较令人信服,即,类似于本问题中的情形,不同的编译器编译出来的结果是不一样的。所以答案是15还是18取决于编译器。不过,按照大多数C编译器的标准,对赋值语句和表达式的处理是不一样的。就是说,printf("%d",k)和printf(" %d",(++i)+(++i)+(++i));的结果肯定是不一样的,因为编译时处理方法不同,所以它们两个没有可比性。
按照以前电脑报上的答案,对于大多数编译起来说,应该是前者为18,后者为15。(如果我没有记错的话,不过有一点可以肯定,就是答案肯定不一样。)。另:据说某些Release版和Debug版
也会不一样,我没试过,不敢妄言。
另外,只在C/C++层面上讨论这个问题没有多大意义,看一看汇编代码,就一目了然了。
但请记住最重要的一点:由于C巨大的灵活性,类似的问题与编译器密切相关。
最后,再次向jiujieshi表示歉意,请原谅我的年轻,不会说话。



hoyle
jiujiejushi 2000-08-21
  • 打赏
  • 举报
回复
版主:
不是我想贴这么多次的!
前边几次每次都是服务器内部错误,重新打开也看不到新贴子,所以贴了这么多次。
把重复的删掉吧。
jiujiejushi 2000-08-21
  • 打赏
  • 举报
回复
hoyle:
我只是把我记得的东西说出来做个参考而已,况且那是18的唯一解释。何必如此激动。
i++是后计算++,你应该知道的。问题是是在整个表达式运算的最先最后计算++、--还是在表达式中间碰到一个算一个没有明确规定(至少VC6语言参考手册上没有)。你看了下面的东西,我不知道你还会说些什么。
------------------------------------
各位:
我测试了一下,得出了难以置信的结果。
#include "stdio.h"
void main(void)
{
int i=3,k;
k=++i+(++i)+(++i);
printf("%d",k);
i=3;
printf(" %d",++i+(++i)+(++i));
}
Win98SE,VC6,控制台应用。
输出结果是:
****************************
16 16
****************************
哪位能解释一下。

修改了一下:
#include "stdio.h"
void main(void)
{
int i=3,k;
k=(++i)+(++i)+(++i);
printf("%d",k);
i=3;
printf(" %d",(++i)+(++i)+(++i));
}
输出结果不变。
jiujiejushi 2000-08-21
  • 打赏
  • 举报
回复
hoyle:
我只是把我记得的东西说出来做个参考而已,况且那是18的唯一解释。何必如此激动。
i++是后计算++,你应该知道的。问题是是在整个表达式运算的最先最后计算++、--还是在表达式中间碰到一个算一个没有明确规定(至少VC6语言参考手册上没有)。你看了下面的东西,我不知道你还会说些什么。
------------------------------------
各位:
我测试了一下,得出了难以置信的结果。
#include "stdio.h"
void main(void)
{
int i=3,k;
k=++i+(++i)+(++i);
printf("%d",k);
i=3;
printf(" %d",++i+(++i)+(++i));
}
Win98SE,VC6,控制台应用。
输出结果是:
****************************
16 16
****************************
哪位能解释一下。

修改了一下:
#include "stdio.h"
void main(void)
{
int i=3,k;
k=(++i)+(++i)+(++i);
printf("%d",k);
i=3;
printf(" %d",(++i)+(++i)+(++i));
}
输出结果不变。
borz 2000-08-18
  • 打赏
  • 举报
回复
printf("%d",++i+(++i)+(++i));

“,”后从左至右
4+5+6
怎么会不等于15呢?
又如:
printf("%d",(i++)+(i++)+(i++));
则是:
3+4+5

SeekInRain 2000-08-18
  • 打赏
  • 举报
回复
谢谢各位, 我知道了, 用asm语言写以上程式可以清楚地看出先做++运算得到i为6, 然后将3个i相加得到18~~~~~~~~~~~~~~~~ 但还有些不明白-----用printf("%d",++i+(++i)+(++i));打印出的结果为15, 这是为什么啊??????
onion 2000-08-18
  • 打赏
  • 举报
回复
拷,看来高手的语言基础也不怎么样。
hoyle 2000-08-18
  • 打赏
  • 举报
回复
胡说,难道++(i++)是先算完两个++之后才算括号的吗?
jiujiejushi 2000-08-18
  • 打赏
  • 举报
回复
我记得谭浩强的书(书名不用说了吧)上说,++是整个表达式最先处理的,否则不论运算顺序如何,结果都是15。
Kevin_qing 2000-08-16
  • 打赏
  • 举报
回复
TNND谁这么写程序,不是超级天才就一定是大白痴。

一定是什么教材里面的白痴题目吧
Arsoka 2000-08-16
  • 打赏
  • 举报
回复
k=++i+(++i)+(++i);
对应的汇编如下(用bc -S 得到)
inc si
inc si
inc si
mov ax,si
add ax,si
add ax,si
可以看出,先把i(si)连加三次,然后再得到k.
hoyle 2000-08-16
  • 打赏
  • 举报
回复
根据C/C++的运算符优先级,按照语法树进行分析,
括号的优先级最高,简单加法的优先级最低,
所以程序先计算出括号中的内容,此时i经过两次++运算,变为5
即++5+5+5
再计算++(优先级高于+),这时i为6
即6+6+6
最后计算加法
结果为18
claider 2000-08-16
  • 打赏
  • 举报
回复
吃饱撑着
daiguan 2000-08-16
  • 打赏
  • 举报
回复
如果是在printf中用这个表达式
printf(++i+(++i)+(++i));
你的答案就对了,在赋值表达式中,先进行++操作,函数中从右往左计算。
这可能是c的一个BUG吧!
wxz 2000-08-15
  • 打赏
  • 举报
回复
k=++i+(++i)+(++i); // i=3
1.最后一个(++i) i=4;
2.中间的(++i) i=5;
3.第一个++i; i=6;
k=6+6+6=18
关键在于运算时把同一个单元的值连续做了3个++运算,最后把三个相同的数相加
加载更多回复(2)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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