3.2.3. Инициализация переменных

Урок 3.1.1. Целые константы

3.1.1. Целые константы

Целая константа - это число, записанное в программе без десятичной точки и без показателя степени. Целые константы в Си могут быть:

-         десятичными;
-         восьмеричными;
-         шестнадцатеричными.

Систему счисления константы компилятор распознает по форме ее записи следующим образом:

Если константа записана цифрами 0 - 9 и первая цифра не 0, то константа десятичная. Например, 45 и 37. Если константа записана цифрами 0 - 7 и первая цифра 0, то константа восьмеричная. Например, 045 и 037. Если константа записана цифрами 0 - 9, буквами A - F или a - f и начинается с 0Х или 0х, то константа шестнадцатеричная. Например, 0Х45 и 0х37.

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

В зависимости от значения константы и от архитектуры компьютера компилятор выделяет для ее машинного представления 2 или 4 байта памяти. На современных компьютерах вы вряд ли увидите 2 байта для целых констант. Для хранения целых типов выделяется 4 байта. Для того, чтобы узнать сколько байт занимает константа или переменная можно использовать операцию sizeof (Урок 4.7. Операция размер). Например, sizeof(25)  даст 4, а sizeof (7984222238294967284) - 8, т.к. тип этой константы long long int.

Для значений от -32768 до 32 767 выделяется 2 байта, в которых первый бит интерпретируется как знак константы, а оставшиеся 15 битов определяют ее значение. В этом случае константа имеет тип int (целый).

Для значений от 0 до 65 535 также выделяется два байта памяти, но уже все 16 бит определяют значение константы. Такая константа имеет тип unsigned int (беззнаковый целый). Константы этого диапазона, записанные со знаком минус, рассматриваются как беззнаковые к которым применяется операция "унарный минус".

Для значений от-2 147483 648 до 2 147 483 647 выделяется 4 байта, в которых первый бит интерпретируется как знак, а оставшиеся 31 бит, как значение числа. Такие константы имеют тип long (длинный).

Для значений от 0 до 4 294 967 295 выделяются 4 байта, в которых все 32 бита интерпретируются как значение. Такая константа имеет тип unsigned long (беззнаковый длинный). Для этого типа к отрицательным константам также применяется операция "унарный минус".

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

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

Для того чтобы указать, что константа имеет тип long нужно дописать модификатор L или I (допускается также l или i). Например, константы:

846L  054l  0x7A4Fl

будут занимать в памяти четыре байта и иметь тип long несмотря на то, что они по своему значению входят в двухбайтный диапазон int. Для того чтобы указать что константа беззнаковая необходимо дописать U или u. Например, константы: 846U  054U  0x7A4Fu будут занимать в памяти два байта (определяется компилятором по значению) и интерпретироваться как беззнаковые, т.е. будут иметь тип unsigned int. Одновременно в константе можно явно определить и long и unsigned, например так:

235lu  0578ul  0x5ul

Эти константы будут занимать в памяти по четыре байта и интерпретировать как беззнаковые, т.е. иметь тип unsigned long. Порядок дописывания модификаторов безразличен. Таблица 4.1. иллюстрирует типы, диапазоны значений и выделяемую компилятором память для представления целых констант. Ключевые слова в квадратных скобках необязательны  - их можно опускать при записи.

Таблица 4.1. Целые константы

Тип Диапазон значений Память (байты)
[signed] short [int] -32768 ÷ 32767 2
int
[signed] int
-2 147483 648 ÷ 2 147483 647 4
unsigned short [int] 0 ÷ 65535 2
unsigned [int] 0 ÷ 4294967295 4
long
[signed] long [int]
-2 147483 648 ÷ 2 147483 647 4
unsigned long
unsigned long [int]
0 ÷ 4 294 967 295 4
long long int
long long
-9223372036854775808  ÷ 9223372036854775807 8

Урок 3.2.1. Имена переменных

3.2.1. Имена переменных

Правила формироиания имен переменных очень просты.

Имя переменной (идентификатор переменной) - это буквенно-цифровая последовательность символов алфавита, начинающаяся с буквы.

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

На длину имени не накладывается ограничений, однако для компилятора Си значащими являются первые 32 символа и, таким образом в имя переменной легко вносить содержательный смысл.

Примеры правильных имен:

Salary Summa_A rezistor1_R25 TEXT_NO

alpha Summa_B rezistor2_R26 TEXT_YES

beta DELTA GAMMA _Name_

Недопустимые имена:

4ТАХА - первый символ не буква;

Vatra.34 - содержит недопустимый символ точку;

сhar - имя совпадает с ключевым словом;

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

Следовательно, если переменная будет принимать значения, например, констант типа int, то для нее необходимо зарезервировать 4 байта, а если переменная будет принимать значения констант типа double, то для нее необходимо выделить 8 байтов и т.д.

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

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

Урок 3.2.3. Инициализация переменных

3.2.3. Инициализация переменных

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

<имя>=<константа>

или

<имя>=<константное_выражение>

или

<имя>=<имя>

где
<имя> - имя переменной, которой компилятором должно быть установлено начальное значение до выполнения программы;  <константа> - определяет конкретное устанавливаемое значение;  <константное выражение> – выражение, состоящее только из констант и знаков операций, например, 60+60.

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

char backslach = '\\', litera = 'T';
int cows = 32, goats = 14;
float alfa, beta, gamma=1.7e-12;

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

int cows = 3.2e+1, goats = 1.4e+1;

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

Рассмотрим еще несколько примеров инициализации переменных. В комментариях указываются случаи когда форма инициализации допускается только в языке C++.
int i = 5;
int i(5);                //только в с++
int a = abs(-3);    //используется математическая функция abs
double price = 109.99, discount = 0.16;
double sale_price = price * discount;
double sale_price (price * discount);       //только в с++
int val = get_value();                 //используется пользовательская функция,
//возвращающая число

Если глобальной статической переменной не задано начальное значение, то она инициализируется нулем. В остальных случаях значение не определено.

Урок 3.2.2. Описание переменных

3.2.2. Описание переменных

Все переменные программы должны быть описаны. Описание переменных обычно осуществляется в начале программы с помощью операторов описания. Остановимся на неформальном понятии оператора.

Под оператором Си понимают некоторую запись, заканчивающуюся символом ;(точка с запятой), смысл которой определяет действия компилятора во время обработки им исходного текста программы или действия процессора во время выполнения программы. К операторам компиляции относятся операторы, характеризующие данные программы, а к операторам выполнения относятся операторы определяющие действия по обработке данных в соответствии с заданным алгоритмом.

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

<тип> <список имен переменных>;

где <тип> определяет тип значений, которые могут принимать переменные списка. В качестве <тип> используется одно из ключевых слов int, float, double или char;

<список имен переменных> - это перечисление имен переменных, отделенных друг от друга запятой;

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

float salary,summa,itog;

int time,count;

char znak,litera;

Эти операторы содержат информацию для компилятора о том, что переменные salary, summa и itog будут принимать вещественные значения типа float в диапазоне от 3.4е-38 до 3.4+38 и для каждой из этих переменных требуется область памяти 4 байта.

Каждой из переменных time, count требуется память 4 байта и эту память следует интерпретировать как целые числа типа int.

Значения переменных с именами znak, litera следует интерпретировать как символьные, т.е. целое число однобайтовой области памяти этих переменных рассматриваются как код соответствующего символа ASCII. Одно описание можно разбить на несколько описаний, например, с целью комментирования физического смысла переменных программы. Операторы:

 

float salary;      /*зарплата в месяц*/

float summa;   /*зарплата в год*/

float itog;          /*зарплата к выдаче*/

эквивалентны первому оператору вышеприведенных примеров.

 

Урок 3.2.4. Модификаторы переменных

3.2.4. Модификаторы переменных Читать далее

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов