Почему надо использовать целые числа?

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

Частично причина кроется в необходимости резервирования памяти для хранения информации. Если компьютеру не хватает памяти для выполнения вашей программы, он прекращает работу, а память стоит денег. Хорошие программисты стараются экономить память. Чем меньше ее требуется для выполнения программы, тем лучше. Использование типа int вместо float и типа char вместо строк помогает в этом.

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

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

Константы и переменные

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

Константа остается неизменной во все время выполнения программы. Фактически вы задаете значение константы уже, когда пишете программу, а не тогда, когда начинается ее выполнение, и значение это нельзя изменить, не изменив исходный текст программы. Если значение некоего элемента данных известно заранее и известно также, что оно не будет меняться, используйте константу. Например, вы живете в штате, где установлен пятипроцентный налог на продажи. Когда вы рассчитываете сумму налога для нескольких облагаемых налогом товаров, ставка налога каждый раз будет составлять 5%. Соответственно, число 0.05, относящееся к типу данных с плавающей точкой, можно определить как константу.

С другой стороны, значение переменной вводится после запуска программы и может изменяться в процессе ее выполнения. Вернемся к примеру с налогом на продажи. Как мы уже установили выше, ставка налога не меняется, но сумма налога будет меняться для каждой новой покупки. Покупки совершаются на самые разные суммы, в зависимости от цены и количества купленного товара, и, следовательно, размер стоимости покупки надо определить как переменную.

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

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

Каждой используемой в программе константе и переменной должно быть присвоено имя. Максимальная длина имени зависит от особенностей компилятора: некоторые ограничивают имя восемью символами, другие позволяют давать имена, состоящие из 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

Почему надо использовать целые числа? - student2.ru
Рис. 3.4. В языке Си приняты правила определения имен констант и переменных

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

catch cin class cout delete friend inline new operator private protected

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

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

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

Почему надо использовать целые числа? - student2.ru
Рис. 3.5. Синтаксис определения константы

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

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

#define NAME VALUE

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

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

Почему надо использовать целые числа? - student2.ru
Директиву #define можно использовать и для создания макроопределений (смотри главу 7).

Почему надо использовать целые числа? - student2.ru
Рис. 3.6. Определение константы

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

#define PI 3.14

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

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

Почему надо использовать целые числа? - student2.ru
Рис. 3.7. Компилятор подставляет вместо имени константы ее значение

При определении константы нет необходимости специально указывать тип данных. Компилятор присвоит его на основании значения, заданного директивой #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'; ....; ....; }
Почему надо использовать целые числа? - student2.ru
Использование ключевого слова const обусловлено тем, что оно позволяет программисту создавать константы, которые принадлежат одной определенной функции. Но чтобы обеспечить совместимость компиляторов Си и Си++, многие программисты продолжают использовать для определения констант директиву #define.

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

#define CHILDREN 8 #define INIT 'C'

Наши рекомендации