在C 中没有身体的前循环

A for-loop without a body in C++

本文关键字:循环      更新时间:2023-10-16

在测试期间,我们被问到以下问题,下面的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循环范围,则假定一个指令范围。

所以此代码:

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。

希望这会有所帮助。

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;
}

您在这里发生的事情是Cout&lt;&lt;我是唯一被内部循环示出的东西,这是因为内部循环周围没有括号,因此只执行了Enext语句。通常是通过语句来完成的,例如

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

因此,外循环会添加末端。

这与可变范围有关。因此,i的范围仅是内部环,而int j则可以在内环和外环中使用。

希望有助于一点

内部循环仅运行该行

cout << i;

行:

cout<< endl;

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

1 
12
123
1234
12345
123456

如果您不指定循环的支架,则仅执行下一行。

a for循环执行单个语句。现在,这可以是一个复合语句(这是括号内的一组语句),也可以是单个语句,该语句是用半彩色终止的表达式。

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

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

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

您的原始代码等效于:

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

1st Scenario

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
....
因为无括号的环路将仅考虑其块下的一个即时陈述。<<<<<</p>

第二场景
这样的代码(请注意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
因为不管没有牙套的循环下有多少陈述,它仅在其块下仅考虑1个语句,我给了i之前的空间只是说明没有括号的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;

或那是相同的

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),每次通过 环形。如果迭代陈述中的取代是一个 语句而不是复合陈述,好像是被重写的 是包含原始语句的复合态。 [ 示例:

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

可以等效地重写为

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

该示例具有相同的含义,如果替换迭代语句代替迭代语句。