for循环的参数是如何入栈的??

bluepig111111 2012-05-17 11:13:35
最近看关于堆栈的东西,突然发现对for循环很迷茫,如:
for(int i=0;i<N;++i)
{
}这个循环是不是参数先入栈,然后是不是从右向左,然后i在什么时候执行自加。为什么在vc里面i是在括号退出钱执行自加的,在for循环的括号里没有执行呢?
...全文
704 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sundayX 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:
讲的详细点啊,这个汇编语言看的挺晕的。

亡羊补牢,为时未晚。
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
[/Quote]

一直在努力...
喜马拉雅星星 2012-05-17
  • 打赏
  • 举报
回复
for有入栈么?
采石工 2012-05-17
  • 打赏
  • 举报
回复

for(int i=0;i<10;i++);
;将i赋值为0,此为初始化循环变量部分
004117CE mov dword ptr [i],0
;跳转到条件判断部分
004117D5 jmp main+30h (4117E0h)
;下面三行代码为循环变量更新部分
;eax是累加器,将eax赋值为i
004117D7 mov eax,dword ptr [i]
;eax加1
004117DA add eax,1
;将i赋值为eax
004117DD mov dword ptr [i],eax
;比较i与10,此为条件判断部分
004117E0 cmp dword ptr [i],0Ah
;如果i大于等于10跳转,跳出循环体
004117E4 jge main+38h (4117E8h)
;此为循环体部分,简便起见,使用如下代码,其没有生成汇编代码
{
i;
}
;如果i小于10跳转,跳到条件判断部分
004117E6 jmp main+27h (4117D7h)
iamnobody 2012-05-17
  • 打赏
  • 举报
回复
把自己当作没有学过C语言的人,
去看C PRIMER
小步舞曲 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:
讲的详细点啊,这个汇编语言看的挺晕的。

亡羊补牢,为时未晚。
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
[/Quote]
为什么组成要放在最开始学啊?如果要学组成 应该在前面再加一个数字逻辑啊
小步舞曲 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C/C++ code

for (int t=0;t<10;t++)
004115BE mov dword ptr [t],0
004115C5 jmp main+30h (4115D0h)
004115C7 mov eax,dword ptr [t]
004115CA add eax,1
004115CD……
[/Quote]
这段汇编代码的意思是:
第一句 给t赋值 0
第二句 跳转
第三句 第四句 第五句 完成的是t++
第六句 判断t<10
第七句 跳转
完全没有涉及到栈,所以for循环跟栈没什么关系
采石工 2012-05-17
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
int main()
{
for(int i=0;i<5;cout<<i<<endl)
{
i++;
}
cout<<endl;
for(int i=0;i<5;i++)
{
cout<<i<<endl;
}

return 0;
}

输出结果为:
1
2
3
4
5

0
1
2
3
4
可见for(e1;e2;e3)中的e3是在循环体中的语句执行之后执行的。
一般地,有下面的结论,大家不妨测试一下:
The following for loop:

for( for-init-statement; expression1; expression2 )
{
// Statements
}

is equivalent to the following while loop:

for-init-statement;
while( expression1 )
{
// Statements
expression2;
}
bluepig111111 2012-05-17
  • 打赏
  • 举报
回复
6楼说的很对,目前正在补牢,呵呵。一直在补。希望能补上。
AnYidan 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

for 循环不是函数调用,和参数入栈有什么关系?
[/Quote]

任何一本语法书都对 for 的执行顺序有解释
赵4老师 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
讲的详细点啊,这个汇编语言看的挺晕的。
[/Quote]
亡羊补牢,为时未晚。
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
bluepig111111 2012-05-17
  • 打赏
  • 举报
回复
3楼说的对,但是要是for循环在函数内部呢,不是还是要入栈的,但是我就是不明白为什么自加会在一次for循环结束的时候才发生。
bluepig111111 2012-05-17
  • 打赏
  • 举报
回复
讲的详细点啊,这个汇编语言看的挺晕的。
liangbch 2012-05-17
  • 打赏
  • 举报
回复
for 循环不是函数调用,和参数入栈有什么关系?
W170532934 2012-05-17
  • 打赏
  • 举报
回复

for (int t=0;t<10;t++)
004115BE mov dword ptr [t],0
004115C5 jmp main+30h (4115D0h)
004115C7 mov eax,dword ptr [t]
004115CA add eax,1
004115CD mov dword ptr [t],eax
004115D0 cmp dword ptr [t],0Ah
004115D4 jge main+68h (411608h)
proorck6 2012-05-17
  • 打赏
  • 举报
回复
跟编译器的优化策略有关。

69,369

社区成员

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

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