For循环初始化
Posted
技术标签:
【中文标题】For循环初始化【英文标题】:The For Loop Initialization 【发布时间】:2012-12-26 23:30:14 【问题描述】:所以我想知道是否可以在 for 循环的声明中声明一个变量。这段代码有效吗?
for (int a = 0;a < len + 1;a++);
a
存在于什么范围内?它会在 for 循环之外无效,还是我仍然可以访问它?
另外,我可以在一个 for 循环语句中声明或初始化 2 个变量吗?
for (int a = 0, b = len + 1;a < b;a++);
这是一个有效的陈述吗?
【问题讨论】:
首先,你试过了吗?那么显然你没有,否则你会得到你的答案。,。 答案已指定多变量初始值设定项是有效的,并且它们是正确的。但是,您应该知道,它们之所以如此,是因为它们属于同一类型。 (即他们都是int
)。您不能在 for-initializer 中拆分不同类型的 var-decls(您也没有,所以这很好)。
-1:显然没有研究。您的 C++ 书籍涵盖了 for
循环的工作方式。另外,您可以尝试一下。
【参考方案1】:
两者都完全有效,因为for
语句的初始化部分(称为for-init-statement)要么是表达式语句,要么是简单声明。您的两个示例都是 simple-declarations - 第二个示例只有两个声明符。
for-init-statement 中声明的变量范围是 for
循环本身,因此在 for
循环之外不可用(第 6.5.3/3 节):
如果 for-init-statement 是一个声明,则声明的名称的范围会扩展到 for-statement 的末尾。
【讨论】:
【参考方案2】:您可以在 for 循环中声明 then ,这是这样做的正常方法。
通常它的范围与 for 循环的 一样长。
Visual Studio(不确定其他编译器)可以设置标志以扩展 for 循环之外的范围。不过不要这样做。
你可以在for循环初始化中声明多个变量,只要它们的类型相同。
【讨论】:
【参考方案3】:它在for
循环之外是无效的,因为它的作用域是for
循环,是的。是的,这也是一个有效的声明。
Working 和 not working。
【讨论】:
【参考方案4】:两者都有效,但在这种情况下:
for (int a = 0, b = len + 1;a < b;++a);
会更快
for (int a = 0;a < len + 1;++a);
因为 len+1 是预先计算好的。
【讨论】:
任何体面的优化编译器都会为这两个以完全相同的速度运行的循环生成代码。优化可读性,而不是你认为编译器会对你的代码做什么。 @GregHewgill: ...假设编译器可以确定len
在循环体执行期间没有改变。
@VladLazarenko:没错,在大多数情况下这是可能的(例如,除非len
是全球性的)。【参考方案5】:
for (int a = 0;a < len + 1;a++);
如果在此语句之前没有声明“int i”,这完全没问题。
不能在 for 循环之外访问“a”。
for (int a = 0, b = len + 1;a < b;a++);
这也很好,但是
for (int a = 0;int b = len + 1;a < b;a++);
或
for (int a = 0;double b = len + 1;a < b;a++);
以上两个语句都无效,因为你必须用“分号”替换“逗号”和
【讨论】:
以上是关于For循环初始化的主要内容,如果未能解决你的问题,请参考以下文章