Он не должен компилироваться, если только не объявлено ранее i
.
Код был бы недопустим в C90, поскольку не было разрешено никаких объявлений, кроме как в начале блоков.В C99 объявление i
в цикле for
является допустимым, но его область действия является циклом и не выходит за его пределы.Это также было бы верно в стандартном C ++, но в предстандартном C ++ область действия расширялась до конца включающего блока.Конечно, возможно, что компилятор не соответствует ни одному опубликованному стандарту, и в этом случае мы не можем сказать, что именно должно произойти.
Цикл for имеет три предложения.Первый выполняется в самом начале и больше нигде, и (в C99 и C ++) может быть объявлением.Он устанавливает начальное значение i
.
. Второе предложение выполняется перед телом цикла.Если значение равно false, оператор for
немедленно заканчивается.Поскольку i
является int
, единственным ложным значением является 0. В этом случае i++
возвращает текущее значение i
и увеличивает его для последующего использования.Следовательно, если i
равно 0, цикл for ничего не делает.Если i
равно 1, то i
будет увеличиваться до тех пор, пока i
не станет 0 или что-то еще не произойдет.Это фактически неопределенное поведение, поскольку i
является целочисленным типом со знаком, но обычно происходит то, что он будет увеличиваться до максимально положительного значения int
, затем превращаться в максимально отрицательный int
, а затем увеличиваться доэто 0, и цикл останавливается.Если i
начинается с -1, то при первом запуске это не 0, но это будет при втором запуске.
Третье предложение, которое здесь выполняет печать, запускается после циклатело.Обычно он используется для увеличения того, что делает цикл, который может проходить через диапазон целых чисел или цепочку указателей в связанном списке или что-то еще.Он не имеет никакого эффекта, кроме выполняемого.
Тело цикла for
пустое, как показано ;
сразу после закрывающей скобки.Это означает, что после выполнения первого предложения выполнение будет чередоваться со вторым и третьим с остановкой всякий раз, когда второе предложение оценивается в 0.
Это очень странный оператор for
, в котором неттело цикла и инкремент выполняется во втором предложении, но это допустимо (если нет арифметического переполнения, которое произойдет, если i
положительно для начала)Неопределенный i
, следующий сразу же, не является.