我一直在尝试一些涉及循环的基本练习。
有人可以告诉我为什么以下代码段有不同的输出?
while (i<3)
{
while(j<3)
{
printf("(%d %d) ",i,j);
j++;
}
i++;
}
输出
(0 0) (0 1) (0 2)
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("(%d %d) ",i,j);
}
输出
(0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2)
它们不应该具有相同的输出吗?
答案 0 :(得分:15)
尝试:
while (i<3)
{
j = 0;
while(j<3)
{
printf("(%d %d) ",i,j);
j++;
}
i++;
}
在你的代码中,发生的事情很简单 - 第一个循环i = 0,j = 0,1,2,3,第二个i = 1,j = 3 ...
答案 1 :(得分:9)
在while循环开始之前,您没有重新初始化变量,就像在for循环中一样。试试这个:
i = 0;
while (i<3)
{
j = 0;
while(j<3)
{
printf("(%d %d) ",i,j);
j++;
}
i++;
}
答案 2 :(得分:5)
你永远不会在while循环中重新启动变量。
答案 3 :(得分:2)
内部while循环只执行一次,因为你的j变量等于3并且永远不会重置。
答案 4 :(得分:2)
有人可以告诉我为什么以下代码段有不同的输出?
是的,它们并不等同。要使代码的两个代码段等效,您需要在while循环中初始化i = 0
,尤其是j = 0
,如下所示:
i = 0;
while (i < 3) {
j = 0;
while(j < 3) {
printf("(%d %d)", i, j);
j++;
}
i++;
}
请记住
for(init-statement condition; expression) {
statement
}
被翻译为
init-statement
while(condition) {
statement
expression
}
特别是
for(j = 0; j < 3; j++)
printf("(%d %d)", i, j);
被翻译为
j = 0;
while(j < 3) {
printf("(%d %d)", i, j);
j++;
}
因此,在进入内部j = 0
循环之前,您缺少非常关键的while
初始化,以及在进入外部i = 0
循环之前while
初始化。< / p>
所以要把它全部包起来,
的翻译for(i = 0; i < 3; i++) {
for(j = 0; j < 3 ; j++)
printf("(%d %d)", i, j);
}
是(第一次通过)
i = 0;
while(i < 3) {
for(j = 0; j < 3; j++)
printf("(%d %d)", i, j);
i++;
}
最后
i = 0;
while(i < 3) {
j = 0;
while(j < 3) {
printf("(%d %d)", i, j);
j++;
}
i++;
}
答案 5 :(得分:1)
简短而甜蜜,一旦在“i”的第一次迭代后命中3,你就没有重置变量“j”。 在使用之前始终初始化while变量。
答案 6 :(得分:0)
在while语句中,j的值保持为3,不再执行。它在for循环中重置。
答案 7 :(得分:0)
正如其他人所说,您尚未重置j
变量。一般来说,我可以说
s1;
while(condition){
s0;
s2;
}
......不等于......
for(s1;condition;s2){
s0;
}
...因为如果s0
包含continue
,则s2
在第一种情况下不执行,在第二种情况下执行。
其次,s1
中的变量声明将限于第二种情况下的循环。这是有用的,但有时不是。在这种情况下,您可以在循环之前进行声明。
答案 8 :(得分:0)
这就是为什么你在它们应该存在的范围内声明变量的原因。例如,这应该返回与你从for获得的相同的值。
while (i<3)
{
int j;
while(j<3)
{
printf("(%d %d) ",i,j);
j++;
}
i++;
}
为什么呢?因为j是为外部的每个循环重新创建的。