Чтобы было понятно, просто удалите фигурные скобки после l oop, потому что они избыточны. Таким образом, программа будет выглядеть как
#include <stdio.h>
int main()
{
int sub[50], i;
for (i = 0; i <= 48; i++);
sub[i] = i;
printf("%d\n", sub[i]);
return 0;
}
После выполнения l oop переменная i
будет равна 49
. Это первое значение, для которого условие l oop i <= 48
оценивается как ложное.
Так что это значение 49
присваивается элементу массива sub
с индексом 49
. Этот элемент выводится в следующем операторе.
Скобки используются для создания новой области видимости для объявлений. Но в такой программе, как, например, эта
#include <stdio.h>
int main()
{
int sub[50], i;
{ for (i = 0; i <= 48; i++); }
{ sub[i] = i; }
{ printf("%d\n", sub[i]); }
{ return 0; }
}
, ни одна декларация не присутствует в каждой паре фигурных скобок (конечно, кроме самых внешних фигурных скобок, которые заключают тело функции main). Таким образом, фигурные скобки здесь избыточны и не изменяют поток управления программой.
В результате последняя программа с многочисленными фигурными скобками выдаст тот же результат, что и первая программа без фигурных скобок.
Обратите внимание на то, что оператор l oop
for (i = 0; i <= 48; i++);
содержит нулевой под-оператор. То есть точка с запятой вводит нулевой подоператор оператора for l oop.
Из стандарта C (6.8.3 Выражения выражения и нулевые операторы)
3 Пустой оператор (состоящий только из точки с запятой) не выполняет никаких операций.
Таким образом, вы можете сказать, что l oop в каждой своей итерации выполняет нулевой оператор, который не выполняет никаких операций .:)
Фактически это для оператора
for (i = 0; i <= 48; i++);
эквивалентно следующему для оператора
for (i = 0; i <= 48; i++) {}
Таким образом, исходная программа также может быть переписана следующим образом
#include <stdio.h>
int main()
{
int sub[50], i;
for (i = 0; i <= 48; i++) {}
{
sub[i] = i;
printf("%d\n", sub[i]);
}
return 0;
}