Объявление переменных и констант — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
м
м
Строка 32: Строка 32:
 
var int x = "1", y = 1.5;    int      real        "1" as int        1.5
 
var int x = "1", y = 1.5;    int      real        "1" as int        1.5
 
</source>
 
</source>
 +
 +
'''Примечание:''' как видно из таблицы, существует различие между инициализацией переменной и присваиванием ей значения, которое заключается в том, что в зависимости от условий, тип переменной может оказаться либо динамическим, либо фиксированным статическим; внешне же, выражения вызывающие такое поведение, могут выглядеть очень похоже. Рассмотрим следующий пример:
 +
 +
<source lang="kpp">
 +
var x = 0;
 +
var y;
 +
y = 0;
 +
</source>
 +
 +
В результате выполнения этого кода и переменная ''x'', и переменная ''y'' будут иметь значение равное 0. Более того, типы переменных в этот момент будут совпадать и равны <tt>int</tt>. Однако, переменная ''x'' будет иметь статический тип, в то время как переменная ''y'' — [[Переменные#Нетипированные (динамические) переменные|динамический]]. Если же мы попытаемся присвоить этим переменным другие значения, заведомо неприводимого типа, то произойдет следующее:
 +
 +
<source lang="kpp">
 +
x = { |x| x + 1; };
 +
y = [1, 2, 3];
 +
</source>
 +
 +
В случае переменной ''x'' будет сгенерирована ошибка еще на этапе компиляции, поскольку тип переменной был назначен статически при инициализации и не может быть изменен в ходе работы программы. В случае переменной ''y'' никакой ошибки не произойдет, поскольку это динамическая переменная. В ходе присваивания, она просто изменит свой тип на <tt>[[Стандартные типы данных#Массивы и списки|array]]</tt> и будет представлять собой уже массив из трех чисел.
  
  

Версия 12:36, 13 сентября 2007

Про объявление как переменных так и констант уже достаточно много говорилось в предыдущих главах этой книги. Вероятно, Читатель уже хорошо себе представляет что такое переменные, чем они отличаются от констант и как следует их инициализировать. Читатель уже должен представлять себе, что такое тип переменной или константы, и чем статически типированные переменные отличаются от нетипированных, динамических переменных. В этой главе мы не будем уделять много внимания философским вопросам, касающимся переменных и констант, а опишем только сами синтаксические конструкции объявления.

Вот несколько примеров объявления как одиночной переменной, так и группы переменных в рамках одного оператора:

<source lang="kpp" line="1"> var x; var x = "hello"; var x, y; var x, y = 0; var int x, y; var int x, real y; var int x = "1", y = 1.5; </source>

При объявлении переменных важно понимать, что при явном указании типа переменной, он сопостовляется только идентификатору идущему сразу после него. Таким образом, строка 5 объявляет переменную x типа int, в то время как переменная y будет иметь динамический тип.

То же самое относится и к инициализаторам, которые ставятся в соответствие только той переменной, которая стоит слева от оператора "=". К примеру, выражение в строке 4 будет инициализировать только переменную y, в то время как переменная x не будет иметь инициализатора; то есть для переменной x объявление эквивалентно тому что записано в строке 1.

Обратите внимание на строку 7: переменная x имеет инициализатор типа string, но ввиду того что тип переменной указан явным образом, переменная будет иметь тип int. При этом, тип инициализатора будет приведен к типу переменной. Если же типы переменной и инициализатора неприводимы, — будет выдано сообщение об ошибке.

Приведем еще раз те же самые примеры, но оформим их в виде таблицы, дополнив сведениями о типах переменых:

<source lang="kpp"> //Строка объявления Тип x Тип y Инициализатор x Инициализатор y

var x; динамика var x = "hello"; string "hello" var x, y; динамика динамика var x, y = 0; динамика int 0 var int x, y; int динамика var int x, real y; int real var int x = "1", y = 1.5; int real "1" as int 1.5 </source>

Примечание: как видно из таблицы, существует различие между инициализацией переменной и присваиванием ей значения, которое заключается в том, что в зависимости от условий, тип переменной может оказаться либо динамическим, либо фиксированным статическим; внешне же, выражения вызывающие такое поведение, могут выглядеть очень похоже. Рассмотрим следующий пример:

<source lang="kpp"> var x = 0; var y; y = 0; </source>

В результате выполнения этого кода и переменная x, и переменная y будут иметь значение равное 0. Более того, типы переменных в этот момент будут совпадать и равны int. Однако, переменная x будет иметь статический тип, в то время как переменная yдинамический. Если же мы попытаемся присвоить этим переменным другие значения, заведомо неприводимого типа, то произойдет следующее:

<source lang="kpp"> x = { |x| x + 1; }; y = [1, 2, 3]; </source>

В случае переменной x будет сгенерирована ошибка еще на этапе компиляции, поскольку тип переменной был назначен статически при инициализации и не может быть изменен в ходе работы программы. В случае переменной y никакой ошибки не произойдет, поскольку это динамическая переменная. В ходе присваивания, она просто изменит свой тип на array и будет представлять собой уже массив из трех чисел.


Объявления констант вместо var, начинаются с ключевого слова const и синтаксически ничем не отличаются от объявления переменных, за исключением того, что константы обязательно должны инициализироваться:

<source lang="kpp"> const x; //неверно. требуется инициализатор const x = "hello"; //верно const x, y = 0; //неверно. константа x не инициализируется const int x = "1", y = 1.5; //верно </source>

Смотри также

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты