在C ++中没有主体的for循环

时间:2015-05-07 16:02:08

标签: c++

在测试期间,我们被问到以下问题:下面打印的C ++程序是什么?。

for (int j=1;j<=6 ; j++)  {
    for ( int i = 1; i<=j ; i++)
        cout<<i;
    cout<<endl;
}

所以我给出了答案:

            1
            1
            2
            1
            2
            3
            1
            2
            3
            4
            1
            2
            3

            4
            5
            1
            2
            3
            4
            5
            6

这就是我理解它的方式。后来我在源代码中键入它,执行代码并输出令人惊讶:

1
12
123
1234
12345
123456

然后我意识到问题的内部循环没有身体支撑。 因此,如果代码为:

,则会提供我的答案输出
for (int j=1;j<=6 ; j++)  {
  for ( int i = 1; i<=j ; i++) {
   cout<<i ;
   cout<<endl;}   //Note the opening and closing braces and compare with the one above.;
  } 

两个程序在执行方式上的主要区别是什么? 在上面的第一个for循环中会发生什么,其中内部循环没有主体支撑。 我的老师无法给予我很多帮助,请帮助。

8 个答案:

答案 0 :(得分:4)

如果你没有用{}指定for循环的范围,它将假定一个指令范围。

所以这段代码:

for (int j=1;j<=6 ; j++)  {
  for ( int i = 1; i<=j ; i++) 
    cout<<i ;
  cout<<endl;
} 

相当于:

for (int j=1;j<=6 ; j++)  {
      for ( int i = 1; i<=j ; i++) {
        cout<<i ;
      }
      cout<<endl;
    } 

同样适用于if和其他循环。这可能是一个非常难以找到的错误,尤其是如果您执行以下操作:

if (condition) ;
   do_something();

无论条件如何,它都会做。这就是为什么我个人试图避免没有范围的if / for#。

希望这有帮助。

答案 1 :(得分:1)

for (int j=1;j<=6 ; j++)  {
    for ( int i = 1; i<=j ; i++)
        cout<<i;
        cout<<endl;
}

相当于:

for (int j=1;j<=6 ; j++)  {
    for ( int i = 1; i<=j ; i++)
    {
        cout<<i;
    }
    cout<<endl;
}

答案 2 :(得分:1)

因此,如果你缩进程序,它将看起来像这样:

for (int j=1;j<=6 ; j++)  
{
    for ( int i = 1; i<=j ; i++) 
        cout<<i ;
    cout<<endl;
}

你在这里发生的是cout&lt;&lt;我是内部for循环所解释的唯一的东西,这是因为内部for循环周围没有括号,因此只执行th enext语句。它通常用if语句完成,例如

if(isValid == true)
    cout << "It's Valid" << endl;
cout << "This isn't part of the if block" << endl;

因此外部循环将添加endl。

这与变量范围有关。所以i的范围只是内部循环,而int j可以用在内部循环和外部循环中。

希望有所帮助

答案 3 :(得分:1)

内循环只运行

cout << i;

行:

cout<< endl;

作为外循环的一部分执行,因此answe是

1 
12
123
1234
12345
123456

如果你没有为循环指定大括号,它只执行下一行。

答案 4 :(得分:1)

for循环执行单个语句。现在,它可以是复合语句(它是大括号内的一组语句),也可以是单个语句,它是以分号结尾的表达式。

您的代码实际上具有以下形状:

for (int j=1;j<=6 ; j++)  {
   for ( int i = 1; i<=j ; i++) 
      cout<<i ;
   cout<<endl;
}

其中cout<<i是附加到内部for的语句。请注意外部for如何使用大括号({})将多个语句分组到复合语句中。

答案 5 :(得分:1)

您的原始代码相当于:

for (int j=1;j<=6 ; j++)  {
    for ( int i = 1; i<=j ; i++) {
        cout<<i;
    }
    cout<<endl;
}

答案 6 :(得分:1)

第一个场景

for(int i=1;i<=10;i++) {
    for(int j=1;j<=i;j++)
        cout<<j;
    cout<<endl;
}

for(int i=1;i<=10;i++) {
    for(int j=1;j<=i;j++) {
        cout<<j;
    }
    cout<<endl;
}

上面的代码对编译器来说意味着相同 会给出类似的输出 1
12
123
....
因为没有大括号的 for循环将只考虑其块下的一个立即声明

第二个场景
这样的代码(请注意i之前的空格)

for(int i=1;i<=10;i++) {
    for(int j=1;j<=i;j++)
        cout<<j;
        cout<<" "<<i;
    cout<<endl;
}

会打印
1 1
12 2
123 3
1234 4
因为无论在没有大括号的for循环下写了多少语句, 它只会在其块 下考虑1条语句,并且我给了i之前的空格只是为了解释没有大括号的for循环首先执行next next然后终止循环

希望有帮助,还有疑问吗?很乐意提供帮助:)

答案 7 :(得分:0)

如果要删除此代码段中的大括号

for (int j=1;j<=6 ; j++)  {
    for ( int i = 1; i<=j ; i++)
        cout<<i;
        cout<<endl;
}

然后外部循环将等同于以下

for (int j=1;j<=6 ; j++)  {
    for ( int i = 1; i<=j ; i++)
        cout<<i;
}
cout<<endl;

或者那是相同的

for (int j=1;j<=6 ; j++)  {
    for ( int i = 1; i<=j ; i++) {
        cout<<i;
    }
}
cout<<endl;

,输出看起来像

112123123412345123456

来自C ++标准(6.5迭代语句)

  

2迭代语句中的子语句隐式定义了一个   阻止范围(3.3),每次进入和退出通过   环。 如果iteration-statement中的子语句是单个的   声明而不是复合声明,就好像它被重写了一样   是包含原始陈述的复合陈述。 [   例如:

while (--x >= 0)
int i;

可以等效地重写为

while (--x >= 0) {
int i;
}

如果要将for iteration语句替换为for迭代语句,该示例具有相同的意义。