cout << *p << " " << *p++ << endl;

DaPPer 2012-03-08 05:10:18
怎么会这样?

#include "stdafx.h"
#include<stdio.h>
#include <iostream>
using namespace std;

int main ()
{
char *p = "Hello";
cout << *p << " " << *p++ << endl; // e H
char *t = "Hello";
cout << *t++ << " " << *t << endl; // H e
return 0;
}
...全文
7959 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2012-03-08
  • 打赏
  • 举报
回复
这跟表达式计算顺序有关。这要看编译器是按那种顺序计算了。输出时e H:因为计算的顺序是从右向左计算的。所以是*s++输出H然后指针指向下一个字符。*s++中运算符“*”的优先级比运算“++”低。
  • 打赏
  • 举报
回复

/*入栈顺序
e h: h, " ", e
h e: e, " ", h
参考vc汇编,这样解释不知道妥不妥*/
char *p = "Hello";
cout << *p << " " << *p++ << endl; // e H
/*从右往左看,先获取p指向的值('H'),由于接下来p要改变,因此先把该值存起来,即把*p的值先存起来,假设放在A处,接下来就是p++计算。
由于后面p的值不在改变,通过p可方便的找到p指向的值('e'),因此这个值不在保存。
因此最终的入栈顺序是 'H'(在A处), " ", 'e'(通过p获取),输出结果就是 e H*/
char *t = "Hello";
cout << *t++ << " " << *t << endl; // H e
/*同样从右往左看,先获取t指向的值('H')。接下来计算*t++,由于后面计算完t++后,t会改变,因此*t++的值需要保存,
同样,假设保存在B处,最后入栈的顺序是 'e'(通过t获取), " ", 'H'(从B处取得),输出结果就是 H e*/

//最后,为了验证我们说的是对的,可以修改下程序
char *t = "Hello";
cout << *t++ << " " << *t << " " << *t++ << " " << endl; // e l H
char *p = "Hello";
cout << *p << " " << *p++ << " " << *p++ << " " << endl; // l e H

/*总结:cout输出,遇到*p++的情况,会把值先保存,否则不保存
(结合vc asm查看得出结论,不适合其他编译器,同样,不知道c++标准是否这样规定)*/

刚才验证程序不对,以这次为准
  • 打赏
  • 举报
回复
高亮显示

入栈顺序
e h: h, " ", e
h e: e, " ", h
参考vc汇编,这样解释不知道妥不妥
char *p = "Hello";
cout << *p << " " << *p++ << endl; // e H
从右往左看,先获取p指向的值('H'),由于接下来p要改变,因此先把该值存起来,即把*p的值先存起来,假设放在A处,接下来就是p++计算。
由于后面p的值不在改变,通过p可方便的找到p指向的值('e'),因此这个值不在保存。
因此最终的入栈顺序是 'H'(在A处), " ", 'e'(通过p获取),输出结果就是 e H
char *t = "Hello";
cout << *t++ << " " << *t << endl; // H e
同样从右往左看,先获取t指向的值('H')。接下来计算*t++,由于后面计算完t++后,t会改变,因此*t++的值需要保存,
同样,假设保存在B处,最后入栈的顺序是 'e'(通过t获取), " ", 'H'(从B处取得),输出结果就是 H e

最后,为了验证我们说的是对的,可以修改下程序
char *t = "Hello";
cout << *t++ << " " << *t << " " << *t++ << " " << *t++ << endl; // e l H
char *p = "Hello";
cout << *p << " " << *p++ << " " << *p++ << " " << *p++ << endl; // l e H

总结:cout输出,遇到*p++的情况,会把值先保存,否则不保存
(结合vc asm查看得出结论,不适合其他编译器,同样,不知道c++标准是否这样规定)
elegant87 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

额 表达式求值顺序的问题。所以不需要过多的讨论。
[/Quote]
编译器的问题
不需要深究
pengzhixi 2012-03-08
  • 打赏
  • 举报
回复
额 表达式求值顺序的问题。所以不需要过多的讨论。

69,371

社区成员

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

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