Имена констант и переменных

Каждой используемой в программе константе и переменной должно быть присвоено имя. Максимальная длина имени зависит от особенностей компилятора: некоторые ограничивают имя восемью символами, другие позволяют давать имена, состоящие из 32 и даже большего количества символов. В некоторых случаях имя переменной может быть гораздо длиннее, но не все составляющие его символы будут иметь значение для компилятора. Например, вы можете использовать имя, состоящее из 32 символов, но определяющими являются только первые восемь, и переменные, названные вами accountspayable и accountsreceivable, компилятор будет воспринимать как одну и ту же переменную.

Имена переменных и констант могут содержать латинские прописные или строчные буквы, а также символ подчеркивания (_). Можно использовать любые сочетания букв и цифр, но начинаться имя должно с буквы. Символ подчеркивания используют для разделения слов, чтобы сделать имя более понятным, например, city_tax вместо citytax.

Старайтесь выбирать имена переменных и констант так, чтобы они указывали на то, как будут использоваться данные. Имя city_tax содержит больше информации, чем ctax, а имя amt_due должно сказать вам больше, чем просто due. Избегайте употребления имен типа А или В кроме тех случаев, когда пишете очень простую программу.

В качестве имен констант и переменных нельзя использовать ключевые слова языка Си. При введении в качестве имени ключевого слова вы получите ошибку компиляции. Ниже приведен список всех ключевых слов языка Си и Си++, перечисляющий ключевые слова, определенные в исходном K&R стандарте языка Си, а также те, которые были добавлены в стандарте ANSI, и те, которые добавлены для Си++. Компилятор может иметь дополнительные команды, которые тоже будут относиться к ключевым словам, поэтому, прежде чем писать программу, изучите документацию компилятора. Если у вас произошла ошибка компиляции, а вы уверены, что все инструкции написаны правильно, проверьте, не употребили ли вы случайно ключевое слово в качестве имени константы или переменной.

Ключевые слова K&R стандарта:

auto break case char continue default dodouble else entry extern float for goto if int long register return short sizeof static struct switch typedef union

В стандарте ANSI Си добавлены следующие ключевые слова:

const enum signed void volatile


Рис. 6. В языке Си приняты правила определения имен констант и переменных

В языке Си++ добавлены ключевые слова:

catch cin class cout delete friend inline new operator private protected

В именах констант и переменных учитывается регистр символа. Если вы назвали переменную TAX, вы не можете ссылаться на нее как на переменную Tax или tax. Фактически, вы получите три различные переменные с именами TAX, Tax и tax, каждая из которых имеет свое значение и относится к своему типу, что, разумеется, сильно затруднит чтение и отладку программы. Многие начинающие программисты допускают неточности в употреблении заглавных букв в именах констант и переменных в разных частях программы, что приводит к ошибкам компиляции или выполнения, которые часто бывает очень трудно найти и исправить.

В языке Си принято правило (рис. 6) использовать маленькие буквы для имен переменных, а заглавные — для имен констант. Хотя нарушение этого соглашения не приведет к ошибке компиляции, тем не менее существует веская причина подчиняться ему. Соблюдение этого простого правила позволяет легко различать константы и переменные в тексте программы, что упрощает чтение программы и облегчает понимание ее логики.

В программе должны быть определены имена и типы всех используемых переменных и констант.


Рис. 7. Синтаксис определения константы

Определение констант

Определить константу — это значит сообщить компилятору Си ее имя и значение. Для определения константы перед функцией main() помещают директиву #define, имеющую следующий синтаксис:

#define NAME VALUE

После директивы точка с запятой не пишется, зато необходимо вставить, по меньшей мере, по одному пробелу между директивой, именем константы и присваиваемым значением. Дополнительные синтаксические символы вводятся в зависимости от типа определяемых данных: числовых, символьных или строк (рис.7).

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

   

 


Рис. 8. Определение константы

Для определения числовой константы необходимо задать имя и значение константы. Например, директива

#define PI 3.14

создает константу, называемую PI, и присваивает ей значение 3.14 (рис.8).

Везде, где компилятор в исходном тексте программы (например, в формуле) встретит имя константы PI, он подставит вместо него значение 3.14 (рис.9).


Рис. 9. Компилятор подставляет вместо имени константы ее значение

При определении константы нет необходимости специально указывать тип данных. Компилятор присвоит его на основании значения, заданного директивой #define. В приводившемся выше примере, константа PI будет отнесена к типу чисел с плавающей точкой, так как ее значение, 3.14, является вещественным числом. В директиве

#define COUNT 5

компилятор отнесет константу COUNT к типу целых чисел, поскольку 5 — это целое число.

Присваивая константе значение, относящееся к типу float, проследите, чтобы ваше число имело, по меньшей мере, по одному знаку слева и справа от точки. Если само значение не имеет десятичной части, добавьте после точки пару нулей:

#define RATE 5.00

Если этого не сделать, компилятор автоматически отнесет константу к типу int, вместо float. Если вы задаете значение константы меньше единицы, добавьте ноль перед точкой:

#define RATE 0.56

В противном случае, если будет написано #define RATE .56, неизбежна ошибка компиляции.

 

Значение символьного типа должно быть заключено в одинарные кавычки:

#define UNIT 'A'

Аналогично, определяя строку, заключите значение в двойные кавычки:

#define MY_FRIEND "George" main() { puts(MY_FRIEND); }

Помните о том, что кавычки не входят в значение константы.

Когда имя константы является параметром, как с функцией puts() в нашем примере, оно не заключается в кавычки. Отсутствие кавычек указывает компилятору, что следует использовать значение, присвоенное константе с таким именем, а не символы (буквы), из которых это имя состоит. То есть в нашем случае будет использовано значение, присвоенное константе MY_FRIEND, которое соответствует строке "George", а не буквы M-Y-_-F-R-I-E-N-D. Для того чтобы на экране появилось именно слово MY_FRIEND, инструкция должна быть такой:

puts("MY_FRIEND");

После того как мы ввели директиву #define MY_FRIEND" George", встретив в любом месте программы слово MY_FRIEND, компилятор подставит вместо него слово "George", так что инструкция

puts(MY_FRIEND);

на самом деле будет вызывать функцию puts() как

puts("George");

что приведет к появлению на экране имени George. Если ваша программа начинается со строки

#define MY_FRIEND "Марина"

на экране появится имя Марины. Почему? Потому что директива #define определяет константу с именем MY_FRIEND, имеющую значение "Марина".

Константы в Си++

Компиляторы Си++ и некоторые компиляторы Си имеют дополнительный способ определения констант. Можно определить константу, описать тип данных и присвоить значение, используя ключевое слово const. Такое определение должно помещаться внутри тела функции, в отличие от директивы, помещаемой всегда вне его:

main() { const int CHILDREN = 8; const char INIT = 'C'; ....; ....; }
Использование ключевого слова const обусловлено тем, что оно позволяет программисту создавать константы, которые принадлежат одной определенной функции. Но чтобы обеспечить совместимость компиляторов Си и Си++, многие программисты продолжают использовать для определения констант директиву #define.

 

Приведенные инструкции определяют целочисленную константу со значением 8 и символьную константу, имеющую значение 'C'. Их можно определить и так: