请教:cout<< i++<

letok 2003-07-06 10:16:06
为什么输出结果是0 1呢???
...全文
515 56 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
windoze 2003-07-12
  • 打赏
  • 举报
回复
cout<<i++<<i--就相当于
operator<<( operator<<(cout, i++), i-- )
标准保证一定会先把内部的operator<<(cout, i++)和i--求值完成后才会调用外部的operator<<,这是必然的:),但是标准并没有规定是先对operator<<(cout, i++)求值还是i--求值,但是这个次序必然会影响到这个程序的输出结果。
zzm7000 2003-07-12
  • 打赏
  • 举报
回复
本来觉得没意思的问题,却有这么多专业解释,也有收获
letok 2003-07-12
  • 打赏
  • 举报
回复
越来越糊涂了,下面的程序输出的是4321,应该是1234才对呀。

#include "stdafx.h"
#include "string"
#include "vector"
#include "iostream"

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i = 1 ;
cout<<i++ <<i++ <<i++ <<i++
<<endl;


return 0;
}


win2003, vc.net 2003



zixiu2008 2003-07-08
  • 打赏
  • 举报
回复
楼主刚开始可能就是想说一个基本概念问题,后来大家越说越深了,呵呵~~
另外,个人认为i++之类的问题,不必研究的太甚,对程序设计没什么帮助。
thrillers 2003-07-08
  • 打赏
  • 举报
回复
cout<<i++<<i--和cout<<(i=t,i++,t)<<(i=s,i--,s)是等价的
gernal_dn 2003-07-08
  • 打赏
  • 举报
回复
初值i=0时,VC中在debug版输出-1 0,release版输出0 0
jiuyu 2003-07-08
  • 打赏
  • 举报
回复
收藏
bluecoffee 2003-07-08
  • 打赏
  • 举报
回复
vc6.0:

int i = 1;
int j = 7;
int n = 9;
cout<<i<<","<<i++<<","<<i++<<","<<j<<","<<j++<<","<<n<<","<<i++;

结果:
4,3,2,8,7,9,1

在vc6.0中cout输出顺序是左-〉右

相同的参数的输出好像是经过压栈,所以顺序是反的
cjnet 2003-07-08
  • 打赏
  • 举报
回复
我觉得这只是一个很基本的概念问题。
sevencat 2003-07-08
  • 打赏
  • 举报
回复
参数求值与这个有关系吧?
假如这个地方是
int func(a,b,a+b,a++,b++,c--,a+b+c)
求值就是说将要压STACK的值算好压进去,但是自减操作跟这个好像没什么关系,
正如我一开始所说的,
要传进去的根本就可以与i无关的,
是另外一个临时变量。
所以说I的自减自加跟这里求值好像没什么关系
zhang,qiuping 2003-07-07
  • 打赏
  • 举报
回复
cout的输出是先从右向左将数据送到堆伐,当该语句都处理完后,再从堆伐里但除数局,进行输出.
victorppy 2003-07-07
  • 打赏
  • 举报
回复 1
在c中,i++和i--的执行过程是这样的,首先是取出i的当前值,然后再加一或者减一;现在首先确定i的初试值,如果是0
则 cout<<i++,这时候i是0,然后显示出来之后再是i自加一,此时i的值为1;
然后是 <<i--,首先显示出i的值是1,然后再自减一,此时i的值为0

好像有的语言的i++,i--和++i,--i的执行过程不是一样,所以在使用之前可以先试验一下,或者直接先设置i=i+1然后再做;
ffish——胖胖鱼
kuangjingbo 2003-07-07
  • 打赏
  • 举报
回复
各种编译器的结果是不一样的,所以尽量不要这样写!!
晨星 2003-07-07
  • 打赏
  • 举报
回复
另外,如果初值为0的话,VC输出的不是0,1而是-1,0。
所以这个还是要看具体的编译器,不能仅仅从++的特性上来解释,更不能简单的认为默认参数求值都是从左到右的,VC就不是。
晨星 2003-07-07
  • 打赏
  • 举报
回复
这个问题的确有意思,我也没楼主蒙了,呵呵。
其实如果真的想了解某种编译器的具体特性的话,还是下面这个更能说明问题:
int i = 0;
cout << ++i << ++i << endl;
在VC里,他会先输出2,再输出1。

另外,楼主原来的
cout<< i++ << i- -
从VC产生的汇编代码来看,也是减运算在前,加运算在后的:
7: cout << i++ << i--;
0040155F mov eax,dword ptr [ebp-4]
00401562 mov dword ptr [ebp-8],eax
00401565 mov ecx,dword ptr [ebp-8]
00401568 push ecx
00401569 mov edx,dword ptr [ebp-4]
0040156C sub edx,1 //**************************
0040156F mov dword ptr [ebp-4],edx
00401572 mov eax,dword ptr [ebp-4]
00401575 mov dword ptr [ebp-0Ch],eax
00401578 mov ecx,dword ptr [ebp-0Ch]
0040157B push ecx
0040157C mov edx,dword ptr [ebp-4]
0040157F add edx,1 //***************************
00401582 mov dword ptr [ebp-4],edx
00401585 mov ecx,offset std::cout (004767e0)
0040158A call @ILT+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)
0040158F mov ecx,eax
00401591 call @ILT+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)

当然,还是那句话,VC的行为只能说明VC,C++标准对这个顺序没有做规定。
wlfjck 2003-07-07
  • 打赏
  • 举报
回复
累了,再也不参加这个讨论了,公道自在人心
xundeng 2003-07-07
  • 打赏
  • 举报
回复
你的i 值 初始为0;
执行cout<<i++的时候,
先输入出i 的值,然后,++i;
此是i=1;
再执行 <<i-- 的时候,输出i 的值为1,然后再--i;
最后,i 的值为0;
sevencat 2003-07-07
  • 打赏
  • 举报
回复
我可能写得不是很正确,
cout<<i++<<i--
这里面有两个临时变量在里面
a=i++
b=i--

楼上说的意思就是这边直接将i传给cout??
我想不会,应该是先算一个临时变量a,传给cout,再算一个临时变量b,传给cout
看汇编代码看到的只能是特定编译器的原代码,有的甚至是优化过的原代码。
这边可能跟形参跟实参没什么联系了因为不管形参实参这里面cout都不会改变传进去的值的
wlfjck 2003-07-07
  • 打赏
  • 举报
回复
sevencat(七猫)
cout<<a<<b
a=i++
b=i--
其实那两个地方一般都是两个临时变量
理解错误啊,这里没有临时变量,只有实参和变参。

大家如果想知道编译器的处理行为。可以看看编译器生成的汇编代码,一切旧明白了。这种问题,新闻组上已经是很老很老的问题了
sevencat 2003-07-07
  • 打赏
  • 举报
回复
agree steedhorse(晨星) ( )
cout<<a<<b
a=i++
b=i--
其实那两个地方一般都是两个临时变量。
求值顺序是先将临时变量A求出来,再将B求出来,
但是C++并没有规定I这个时候一定要算出来,
只是保证下一句开始之前,I已经正确赋值了。
这个地方即使你看iostream的原代码也没用,因为有可能传进去的根本就是一个临时变量而已,而并不是真正的I
还请指教
加载更多回复(36)

70,025

社区成员

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

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