Может кто-нибудь сказать мне, почему следующие фрагменты имеют разные выходы?
Да, они не эквивалентны. Чтобы сделать два фрагмента кода эквивалентными, вам нужно инициализировать i = 0
и особенно j = 0
внутри цикла while следующим образом:
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
.
Итак, чтобы обернуть все это, перевод
for(i = 0; i < 3; i++) {
for(j = 0; j < 3 ; j++)
printf("(%d %d)", i, j);
}
is (первый проход)
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++;
}