for (statement1; statement2; statement3)
{
/* body */
}
(1) Сначала выполняется statement1
.
(2) Далее statement2
выполняется.
(3) Если оценка statement2
истинна, то тело выполняется
(4) Затем выполняется statement3
.
(5) Повторите с шага (2)
| +<-----------------+
| | ^
V V |
for ( (s1); -------->(s2 true? | false?); (s3) )
{ | | ^
| | |
| | |
V | |
(body)-----|--------->+
} |
|
V
(come out)
Структура, которую вы показали, такая же, как и выше. statement n
может быть любым утверждением. В вашем примере вы разделены запятыми в statement1
и statement3
. Вы можете разделить любое количество операторов запятыми.
Обычно циклы for
используются с statement1
с инициализацией, поскольку она выполняется только один раз. statement2
используется для проверки условия завершения цикла, потому что значение оценки этого оператора используется, чтобы решить, следует ли вводить тело прерывания. И statement3
используется для обновления переменной завершения цикла, так как она выполняется после тела. Но, как правило, они могут быть использованы любым способом.
Сначала statement1
- это i=10, j=0;
, это инициализирует переменные. Далее в statement2
стоит j <= 10
, если это правда, то тело выполняется. После того, как тело выполнено, выполняется statement3
, что составляет i--,j++
. Цикл будет повторяться 11
раз 0
до 10
. Но напечатает 5
раз, так как в один момент i
и j
станут одинаковыми, а if (i > j)
оценит ложь.
EDIT
Вот пример, где его можно использовать, не очень практично, но в качестве примера, для проверки строки палиндрома.
int i, j, n, flag;
char str[128];
printf ("\nEnter string: ");
scanf ("%s", &str);
n = strlen (str);
for (flag=1, i=n-1, j=0; j<n/2; j++, i--)
{
if (str[i] != str[j])
{
flag = 0;
break;
}
}
if (flag)
printf ("\n\"%s\" is a palindrome");
else
printf ("\n\"%s\" is not a palindrome");
Мы всегда должны пытаться написать код, который легко читать и который не создает путаницы. Это помогает как разработчику кода, так и другим, кто читает код.