如果使用C语言,请编写以下代码:
for(int i = 0; i < 7; i++)
{
// for loop Body
}
变量的范围i
在for循环体内。没关系。
但是,如果我这样写:
for(int i = 0; i < 7; i++)
{
long int i = 1; // Redeclaration of i
}
在这里,该变量i
在循环体内再次声明,但它已成功编译并在C中运行。
但是,在C ++中,编译器给出“重新声明'long int i'”错误。
那么,为什么C编译器没有给出重新声明错误?它是编译器错误吗?
C ++和C在这里有所区别。根据C11(n1570)§6.8.5¶5,请强调:
迭代语句是一个块,其作用域是其封闭块作用域的严格子集。循环主体还是一个块,其作用域是迭代语句作用域的严格子集。
转化为for循环:
{
declaration
while ( expression) {
statement
expression ;
}
}
您放置在statement
零件中的任何内容都可以隐藏声明中引入的任何内容。现在,C ++(17,n4659)在[stmt.for] / 1处明确声明了类似的内容。但是它还继续添加:
除了init语句中声明的名称与条件中声明的名称位于相同的声明性区域外,
因此,这里的第二个i
确实是尝试重新声明。上面的内容听起来令人困惑(在条件中声明了名称!?),但是此处的“条件”是这样定义的[[stmt.stmt] / 1):
condition:
expression
attribute-specifier-seq decl-specifier-seq declarator brace-or-equal-initializer
正是这样允许while循环这样(仅C ++):
while (T t = x) statement
另外,我得出的结论也总结在[stmt.iter] / 3中(感谢@TC):
如果在子语句的最外层块中重新声明了init语句或for-range声明中引入的名称,则程序格式错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句