Компилятор Java имеет небольшое количество логики потока, чтобы вы могли инициализировать final
переменные после их объявления. Это законная Java:
final int something;
if ( today == Friday )
something = 7;
else
something = 42;
Java обнаружит, если какие-либо ветви оставляют окончательное значение неопределенным. Он не будет анализировать условия, поэтому это недопустимая Java, даже если она логически похожа:
final int something;
if ( today == Friday )
something = 7;
if ( today != Friday )
something = 42;
В ANSI C89 переменные const
(отличные от extern
) должны быть инициализированы в операторе, в котором они объявлены.
const int something = ( today == Friday ) ? 7 : 42;
Модификатор extern
в объявлении сообщает компилятору, что переменная инициализируется в другом модуле компиляции (или в другом месте в этом модуле компиляции).
В ANSI C99 вы можете смешивать объявления и код, поэтому вы можете объявлять и инициализировать переменную const
после блока утверждений и кода. Переносимость ANSI C 1999 года остается проблемой.
Обходной путь для C89 состоит в том, чтобы заметить, что правила для объявлений, предшествующих коду, работают в области блока, а не в области функции, поэтому вы можете сделать это:
#include<stdio.h>
int main ( void )
{
printf ( "wibble\n" );
{
const int x = 10;
printf ( "x = %d\n", x );
}
return 0;
}