嵌套循环中的C ++变量重新声明

时间:2018-04-16 06:04:14

标签: c++ gcc syntax-error variable-declaration

下面是一个包含3个嵌套循环的代码。变量curs和tempv在最外层for循环的每次迭代中被重新声明。这应该给我错误,但我能够成功运行它而没有错误的gcc 4.8.4。

for(int i = 0; i<lend; i++)
{
    string curs = vstring[digits[i]-'0'];
    vector<string> tempv;
    for(int j = 0; j<v.size(); j++)
    {
        for(int k = 0; k<curs.size(); k++)
        {
            tempv.push_back(v[j] + curs[k]);
        }
    }
    v = tempv;
}

在for循环中重新声明变量是否可以?我理解在C ++中,变量不能在同一范围内重新声明。

3 个答案:

答案 0 :(得分:5)

  

在for循环中重新声明变量是否可以?我理解在C ++中,变量不能在同一范围内重新声明。

它是一个单独的词汇范围,其中这些变量被声明一次。执行重复执行它的事实是无关紧要的 - 它不像您在多次调用的函数中声明的变量获得重复的定义错误。与往常一样,每次进入范围时,都会在其中定义一个新的变量实例。

换句话说:范围规则是关于程序的静态,词法结构,这与程序执行流程的实际发生方式无关;它们充当其运行时行为的蓝图,因为它们指示编译器如何解析块的其余部分以及每次输入作用域时要生成的代码。

答案 1 :(得分:3)

  

变量curstempv将在最外层for-loop的每次迭代中重新声明

不,他们在每次迭代时都会实例化。创建,并在块结束时,销毁。由编译器完成的模数优化。

范围是编译时的概念。通过检查代码看到的东西。实例化是一种运行时效果。相同的变量声明可以执行任意次,实例化变量次数。好吧,除非它是static,在这种情况下它被实例化一次。

  

我理解在C ++中,变量不能在同一范围内重新声明。

不能在同一范围内直接重新声明 ,但可以在嵌套范围中重新声明。而且你有许多嵌套的范围。让我们考虑一下:

for(int i = 0; i<lend; i++)                      // ← For loop scope.
{                                                // ← Block scope.
    string curs = vstring[digits[i]-'0'];
    vector<string> tempv;
    for(int j = 0; j<v.size(); j++)              // ← For loop scope.
    {                                            // ← Block scope.
        for(int k = 0; k<curs.size(); k++)       // ← For loop scope.
        {                                        // ← Block scope.
            tempv.push_back(v[j] + curs[k]);
        }
    }
    v = tempv;
}

正式for循环定义与等效于放置在外部块中的相应while循环,该外部块包含循环变量的声明(如果有)。然而,

C ++17§6.3.3/ 1:
  

init-statement for-range-declaration 条件中声明的名称> ifwhilefor和   switch语句是ifwhileforswitch语句的本地语句(包括受控语句),   并且不得在该陈述的后续条件下或在最外面的区块中重新宣布(或者,对于   受控语句的if语句,任何最外面的块);见9.4。

例如,在您的代码中,外部for循环的i无法直接在构成该循环体的块中重新声明,即使它是嵌套范围,但可以在内部嵌套中重新声明循环。

答案 2 :(得分:0)

这是完全合法的,事实上,它一直在使用。在这种情况下,每次迭代都可以被视为一个全新的范围。