一个++的疑问

darkstar21cn 2004-08-09 11:53:35
#include <iostream>
#include <stdlib.h>

using namespace std;
int main (int argc, char* argv[])
{
char* c = "abc";
char* b = c;
cout << *c++ << *c++ << *c++ << endl;
cout << *(b++) << *(b++) << *(b++) << endl;
system ("pause");
return 0;
}

运行结果是
cba
cba

大家来讨论一下吧。编译器怎么生成的这段代码。
我用VC++和g++编译都是如此。
...全文
256 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkstar21cn 2004-08-11
  • 打赏
  • 举报
回复
谢谢 freefalcon(心宇—小小菜鸟想高飞)说的如此清楚。
柯本 2004-08-09
  • 打赏
  • 举报
回复
gcc 及 bcb 结果为
cba
cba
VC 为
aaa
aaa
应该是编译器的问题,VC的结果是正确的
qwertasdfg123 2004-08-09
  • 打赏
  • 举报
回复
编译器的问题!

看看汇编。
zncn2 2004-08-09
  • 打赏
  • 举报
回复
应该是cout的问题吧,该成这样你看看

#include <iostream.h>
#include <stdlib.h>

int main (int argc, char* argv[])
{
char* c = "abc";
char* b = c;
cout<< *c++;
cout<< *c++;
cout<< *c++ << endl;
cout << *(b++) << *(b++) << *(b++) << endl;
system ("pause");
return 0;
}

结果为
abc
cba
RookieStar 2004-08-09
  • 打赏
  • 举报
回复
怎么又讨论这种问题?看汇编代码。。。
goodluckyxl 2004-08-09
  • 打赏
  • 举报
回复
运行结果为
aaa
aaa
不是cba
Agemo 2004-08-09
  • 打赏
  • 举报
回复
不是吧,怎么也不会是这个结果吧?
应该是aaa才对
goodluckyxl 2004-08-09
  • 打赏
  • 举报
回复
这个结果就是
++ 运算的优先及高于 *运算
freefalcon 2004-08-09
  • 打赏
  • 举报
回复
楼主不要生气,我也不是说你
我是特别反感考试题中的"(i++) + (i++) + (i++)"这样的白痴问题

前面有朋友已经说过了,不明白为什么时,自己写一些测试语句,然后再看看汇编代码就能明白为什么

VC6中输出结果为aaa
先看一个测试例子:
cout << 1 << 2 << 3 << endl;
汇编代码为:
004017A5 push offset @ILT+195(std::endl) (004010c8)
004017AA push 3
004017AC push 2
004017AE push 1
004017B0 mov ecx,offset std::cout (004767e8)
004017B5 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)
004017BA mov ecx,eax
004017BC call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)
004017C1 mov ecx,eax
004017C3 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)
004017C8 mov ecx,eax
004017CA call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)

可以看到,当执行多个cout<<时,VC6先对输出的内容进行压栈,并且按照从右到左的顺序进行,最后再调用cout<<输出,这个例子的结果为123

再看你的问题
cout << *c++ << *c++ << *c++ << endl;
首先根据优先级可以肯定,它实际上等于
cout << *(c++) << *(c++) << *(c++) << endl;
其汇编代码为:
004017A5 push offset @ILT+195(std::endl) (004010c8)
004017AA mov ecx,dword ptr [ebp-4]
004017AD mov dl,byte ptr [ecx]
004017AF mov byte ptr [ebp-9],dl
004017B2 mov al,byte ptr [ebp-9]
004017B5 push eax
004017B6 mov ecx,dword ptr [ebp-4]
004017B9 mov dl,byte ptr [ecx]
004017BB mov byte ptr [ebp-0Ah],dl
004017BE mov al,byte ptr [ebp-0Ah]
004017C1 push eax
004017C2 mov ecx,dword ptr [ebp-4]
004017C5 mov dl,byte ptr [ecx]
004017C7 mov byte ptr [ebp-0Bh],dl
004017CA mov al,byte ptr [ebp-0Bh]
004017CD push eax
004017CE push offset std::cout (004777e8)
004017D3 mov ecx,dword ptr [ebp-4]
004017D6 add ecx,1
004017D9 mov dword ptr [ebp-4],ecx
004017DC call @ILT+440(std::operator<<) (004011bd)
004017E1 add esp,8
004017E4 push eax
004017E5 mov edx,dword ptr [ebp-4]
004017E8 add edx,1
004017EB mov dword ptr [ebp-4],edx
004017EE call @ILT+440(std::operator<<) (004011bd)
004017F3 add esp,8
004017F6 push eax
004017F7 mov eax,dword ptr [ebp-4]
004017FA add eax,1
004017FD mov dword ptr [ebp-4],eax
00401800 call @ILT+440(std::operator<<) (004011bd)
00401805 add esp,8
00401808 mov ecx,eax
0040180A call @ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e5)

最开始有三次push eax实际上都是将'a'(位于al中)压栈,这时输出的内容已确定,最后再调用了operator<<时才进行++运算,已经对输出内容没有影响


这类问题是依赖于编译器的,不同的编译器可能采取不同的处理方式,其他编译器可以按类似的方式自行察看

darkstar21cn 2004-08-09
  • 打赏
  • 举报
回复
我知道一般不会这么写——自己也没这么用过,只是今天工作比较轻松想起来了试试而已。然后想知道编译器是怎么处理(就是解释的顺序)这条语句的。
以前的我也参加过讨论的,但是没有出现过这种情况呀,用(i++) + (i++) + (i++)的答案,我无法解释这个现象,所以发上来,希望有人给我解答而已,如果你觉得我白痴的话,请走,我不喜欢散分。
先谢一下解答和帮我顶的朋友!
qiuafa 2004-08-09
  • 打赏
  • 举报
回复
这就是应试教育,呵呵〉〉〉
xrhone 2004-08-09
  • 打赏
  • 举报
回复
我在VC6中和Tc3中结果都是
cba
cba
可能不同编译器会有所不同,但一般不会这样写。
darkstar21cn 2004-08-09
  • 打赏
  • 举报
回复
这时候编译器是怎么作的
darkstar21cn 2004-08-09
  • 打赏
  • 举报
回复
我是想知道,为什么会出现这种情况。
ross33123 2004-08-09
  • 打赏
  • 举报
回复
学校里就是学这些
================

这样的学校应该点把火烧了
威露士生哥哥 2004-08-09
  • 打赏
  • 举报
回复
的却是~!但是在学校里就是学这些~!没有办法~!
qhgary 2004-08-09
  • 打赏
  • 举报
回复
这个跟编译器有关系的:
其实这样的结果有两个原因要弄清楚:
1. 这里的()功能失效
2. cout是从右往左实现的
freefalcon 2004-08-09
  • 打赏
  • 举报
回复
没有意义的话题

谁在实际工作中写这样的代码谁就是白痴,:)
bm1408 2004-08-09
  • 打赏
  • 举报
回复
这样的问题讨论的太多了!

GOGO以前的贴子就OK
xuzheng318 2004-08-09
  • 打赏
  • 举报
回复
帮楼主顶

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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