奇怪的输出,请高手指点

lj9852 2001-05-10 11:52:00
这样:
#include<iostream.h>
//using namespace std;
int main()
{
char *p="1234";
cout<<p<<endl<<p++<<endl;
return 0;
}
输出为:
234
1234
#include<iostream.h>
//using namespace std;
int main()
{
char *p="1234";
cout<<p<<endl;
cout<<p++<<endl;
return 0;
}
输出为:
1234
1234
请问两种有什么区别?为什么第一种结果那么奇怪?
如果using namespace std的话,两种的结果就都正常了,why?
...全文
164 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lj9852 2001-05-12
  • 打赏
  • 举报
回复
呵呵,谢谢各位的热心回答,虽然最终还不是很满意:)
好了,给分了
cber 2001-05-11
  • 打赏
  • 举报
回复
根据我对于你的这段代码的分析,我认为你恰好陷入了一个C++中未定义的地方,那就是在函数调用中,如果它的各个实参之间存在着相互影响的关系时,对于实际传入的参数来说,结果就是undefined.简单一点,考虑以下的代码
void foo( int i, int j );
//...
foo( a, a++ );
上面的那句语句在不同的编译器上的结果都会不同,列于如下:
bcc55: foo(a+1,a)
g++2.91.57: foo(a+1,a)
vc6: foo(a,a)
当然,在函数调用结束后,对于a的副作用(side-effect)都会起效,a应该等于2

在表达式中也存在类似的情况,如下面的语句:
int i = 2;
int j = i++ + ++i + ++i;
在不同的编译器下就能得到不同的结果,列于如下:
bcc55: 12
g++2.91.57: 10
vc6: 10

至于VC中对于std的打开与否的问题,可能也正是由于std中的iostream与传统的C++ iostream不同的缘故(新的iostream是由template构造出来的,老的估计是由直接的代码构造出来的)

另外,给你一个建议,不要在一条语句中试图进行几种不相关的任务.在你的代码中,正是由于同时进行了两种不相关的操作(输出及改变指针的值),所以才会得到奇怪的输出.还有一点就是尽量使用标准函数库,也就是打开std这个namespace.并且习惯于使用新型的头文件类型,如:
#include <iostream>
而不是
#include <iostream.h>
lj9852 2001-05-11
  • 打赏
  • 举报
回复
真的没人知道吗?
waker 2001-05-11
  • 打赏
  • 举报
回复
C++是从右向左压栈的,从右边开始编译,右面的压栈时是原值,左边的压栈时就是改变后的值了,可以在Debug下察看汇编代码,就清楚多了
招RD和QA 2001-05-11
  • 打赏
  • 举报
回复
不要使用这种容易出问题的语法就行了。
lj9852 2001-05-11
  • 打赏
  • 举报
回复
我就是说在vc6啊
hitman 2001-05-11
  • 打赏
  • 举报
回复
和编译器的实现依赖很大阿
lj9852 2001-05-11
  • 打赏
  • 举报
回复
to cber:
如果c++是从右向左入栈,那么int j = i++ + ++i + ++i;就该相当于4+4+3=11,为什么是10呢?
ferocityAngel 2001-05-10
  • 打赏
  • 举报
回复
不知你用的是那种编译器。
我用的是gcc , 用不用using namespace std; 的结果是一样的。
都是:
234
1234


产生问题的原因应该是,编译时的扫描顺序是自右向左,
因此,编译程序先发现p++,这样,p的值就增加了,所以会出现这样的结果。
lj9852 2001-05-10
  • 打赏
  • 举报
回复
还是不对,如果using namespace std的话就一切正常:
#include<iostream>
using namespace std;
int main()
{
char *p="1234";
cout<<p<<endl<<p++<<endl;
return 0;
}

glhorse 2001-05-10
  • 打赏
  • 举报
回复
也不对,反正应该于++运算符有关,怎么解释那?
glhorse 2001-05-10
  • 打赏
  • 举报
回复
应该是这样:
#include<iostream.h>
//using namespace std;
int main()
{
char *p="1234";
cout << p <<endl;
p++;
cout<<p<<endl;
return 0;
}


klaaa 2001-05-10
  • 打赏
  • 举报
回复
cout<<p<<endl<<p++<<endl;
在cout<<p传入的引用值被表达式p++加一了,而<<p++传入的值是实际的值,不是引用
holyfire 2001-05-10
  • 打赏
  • 举报
回复
C语言里一般的调用规则是从右向左入栈的。
glhorse 2001-05-10
  • 打赏
  • 举报
回复
你的第一个程序等同于:
#include<iostream.h>
//using namespace std;
int main()
{
char *p="1234";
cout << p++<<endl;
cout<<p<<endl;
return 0;
}

gnfcjs 2001-05-10
  • 打赏
  • 举报
回复
因为第一个cout语句先将p++压入栈中,第二个分开了当然就正常了
lj9852 2001-05-10
  • 打赏
  • 举报
回复
加分了
lj9852 2001-05-10
  • 打赏
  • 举报
回复
先谢谢各位的回答,c++从右向左进栈可以从这句看出:
cout<<p<<endl<<++p<<endl<<p<<endl;
结果是
234
234
1234
但还有一个问题:
#include<iostream.h>
int main()
{
char *p="1234";
cout<<p<<endl<<p++<<endl;
return 0;
}
结果是
234
1234

#include<iostream>
using namespace std;
int main()
{
char *p="1234";
cout<<p<<endl<<p++<<endl;
return 0;
}
结果是
1234
1234
即using namespace std后p++对p值的改变不影响它前面的p,为什么?
lj9852 2001-05-10
  • 打赏
  • 举报
回复
但问题是,在vc6下,有没有using namespace std结果并不一样。
hyena 2001-05-10
  • 打赏
  • 举报
回复
同志们,问题的关键在于:
编译器先计算p++
p++表达式将p加1但是返回原来的p值,这就造成了左边的p已经被加1,
而右边p++的值仍然是加1之前的值

而 ++p则相反,p被加1且返回加1后的值

69,368

社区成员

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

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