1
shon 2021-07-15 20:17:23 +08:00 via iPhone
for 循环怎么创建局部变量?贴个代码让我学习一下
|
2
zxlzy 2021-07-15 20:28:53 +08:00
for 循环里的变量是复用同一个栈空间的,你是用哪个语言?
|
3
RedBlackTree OP @zxlzy Go,是不是因为 C 的 for{}没有单独的 scope,所以 for 内的变量跟在 for 外面声明一样,只有一个?
|
4
billlee 2021-07-15 20:37:28 +08:00
@RedBlackTree 有 scope, {} 内创建的变量,一步循环执行结束的时候就销毁了。所以不会堆叠
|
5
Ediacaran 2021-07-15 20:46:08 +08:00 via Android
for 里面是编译期的声明,不是可执行语句
|
6
zxlzy 2021-07-15 20:54:55 +08:00
@RedBlackTree 和 C 没关系,几乎所有的语言都是这样做的,for 循环中的对象的栈帧地址是复用的
|
7
RedBlackTree OP @zxlzy 好的,感谢
|
8
hanssx 2021-07-16 11:07:12 +08:00 1
刚开始想觉得有意思,不过是不是有 BUG ?”无限 for 循环创建局部变量“你这个怎么做到?
```c for (int i = 0; i < 3; ++i) { int a; int b; } ``` 这样么?这样可不是无限创建局部变量,只有 2 个局部变量,那就是 a b,一方面是有块级作用域的语言像 C/C++,int a 、int b 在一次 for 循环结束时应该就释放了空间,然后下一次再给栈空间,这样是无法做到 stackoverflow 的;另一方面像没有块级作用域的语言如 PHP/Python/JS 等,那每次 for 循环应该就是(重新)赋值罢了。 |
9
hanssx 2021-07-16 11:08:23 +08:00
另外,C/C++可以看一下反汇编代码
|
10
GuuJiang 2021-07-17 13:53:13 +08:00 1
@RedBlackTree
用“创建”变量这个词容易让人产生一种误解,好像变量是某种资源一样,“创建”是个消耗资源的过程,实际上所有的局部变量仅仅是 BP+N 这个地址的一个代号而已,并且这个 N 在编译时已经确定了,换句话说在运行时根本就没有所谓的“创建”变量这回事,跟是否循环没有任何关系 |