Строго говоря, случай, который вы указываете с int
, разрешен на всех трех языках, но по разным причинам.
C позволяет переходить через определение любой локальной переменной (арифметика, struct
, union
, массив ...) во всех случаях (для C89) и во всех случаях, кроме одного (для C99). Исключением для C99 являются массивы переменной длины.
C ++ допускает это только для типов данных, которые не имеют конструктора или деструктора, часто называемого POD.
Так что если у вас есть тип T
вместо int
в вашем примере в C89, это всегда допустимо, а в C99 и C ++ это зависит от типа T
, является ли это правильным.
В любом случае, все это легко приводит к неинициализированным переменным, поэтому лучше не делать этого, если вы можете избежать этого.