在测试期间,我们被问到以下问题:下面打印的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循环中会发生什么,其中内部循环没有主体支撑。 我的老师无法给予我很多帮助,请帮助。
答案 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迭代语句,该示例具有相同的意义。