C++小疑问

lulipeng_cpp 2012-03-21 04:23:38
请看下面两个小程序:

#include<iostream>
using namespace std;

int main()
{
int a,b;

cin>>a>>b;

cout<<a*b<<endl;

return 0;
}


#include<iostream>
using namespace std;

int main()
{
int a,b,c;

cin>>a>>b;

c=a*b;

cout<<c<<endl;

return 0;
}

第一个程序没有用C来存放a*b的值,那么a*b被放到哪里了呢???
...全文
160 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevin_zlg 2012-03-21
  • 打赏
  • 举报
回复
确实,存放在临时变量里,临时变量存于堆栈
yh_no_code 2012-03-21
  • 打赏
  • 举报
回复
一下是反汇编的结果(这个插入代码怎么没有啊,手动添加)

main proc near

var_48= dword ptr -48h
var_8= dword ptr -8
var_4= dword ptr -4

push ebp
mov ebp, esp
sub esp, 48h
push ebx
push esi
push edi
lea edi, [ebp+var_48]
mov ecx, 12h
mov eax, 0CCCCCCCCh
rep stosd
lea eax, [ebp+var_8]
push eax
lea ecx, [ebp+var_4]
push ecx
mov ecx, offset std__cin
call j_std__basic_istream_char_std__char_traits_char_____operator__
mov ecx, eax
call j_std__basic_istream_char_std__char_traits_char_____operator__
push offset loc_40110E
mov edx, [ebp+var_4]
imul edx, [ebp+var_8];注意这一句就是a*b
push edx
mov ecx, offset std__cout
call j_std__basic_ostream_char_std__char_traits_char_____operator__
mov ecx, eax

从上面可以看到,得到的值首先存放在edx中,最后压入堆栈,作为参数传递给输出函数。所以你要的答案是:存放在堆栈中
dingjin_dj 2012-03-21
  • 打赏
  • 举报
回复
1楼,2楼都已经说出来了,a*b的值就是一个临时对象
  • 打赏
  • 举报
回复
a*b执行后,会生成一个无名子的临时对象,把a*b的结果放到这个无名子的临时对象内,当程序结束后,就会有系统释放掉这个临时对象
www_adintr_com 2012-03-21
  • 打赏
  • 举报
回复
可以不放内存里.
直接把 a 和 b 相加后的寄存器 push 到堆栈里就传给 operator<< 函数了.
详见汇编

64,637

社区成员

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

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