Типы, операторы и выражения☛Язык программирования C ✎ |
Переменные и постоянные - это основные объекты данных, которыми орудует программа. Объявление заключают список переменных, которые будут использоваться, и отмечают их тип и, возможно, начальное значение. Операторы указывают на выполняемое действие. Выражения объединяют переменные и постоянные для образования нового значения. Тип определенного объекта обуславливает набор значений, то может иметь, а также, какие именно операции применимы к нему. Эти составные части и является темой данной главы.
Стандарт ANSI привнес много малых изменений и дополнений в основных типов и выражений. Теперь существуют знаковые (signed) и беззнаковые (unsigned) формы всех типов целых, а также обозначение для беззнаковых констант и шестнадцатеричных символьных констант. Операции с плавающей точкой возможны с одинарной точностью; существует также тип long double (длинное двойное число) для повышенной точности. Цепочке константы может быть сцеплено во время компиляции. Перечни (энумерации) стали официальной частью языка, формализуя эту долговременную риса. Объекты можно объявить как const, что предотвращает их изменении. Дополнен правила автоматической коррекции среди арифметических типов, для возможности оперирования богаче набором.
Названия переменных
Хотя мы не упомянули об этом в Разделе 1, существуют определенные ограничения относительно названий переменных и символических констант. Названия должны состоять из букв и цифр, первый символ должен быть буква. Жесткий пробел "_" тоже считается буквой, он порой полезен для улучшения прочитности длинных названий переменных. Однако, не начинайте названий переменных с жесткого пробела, так как функции библиотеки часто употребляют такие названия для собственных нужд. Заглавные буквы и строчные буквы различаются, поэтому x и X - это две разные названия. Традиционной практикой в C является использование букв нижнего регистра для имен переменных и только верхнего для символических констант.
Меньшей мере, 31 знак внутреннего имени является значимым. Для названий функций и внешних переменных число может оказаться меньше 31, поскольку внешние названия могут использоваться ассемблера и загрузчиками связей, над которыми язык не имеет никакого влияния. Для внешних имен, стандарт гарантирует уникальность только для 6-х знаков одного регистра. Ключевые слова, такие как if, else, int, float и т.д., резервированной - вы не можете использовать для названий переменных. Ключевые слова должны быть в нижнем регистре.
Разумным будет выбирать такие названия переменных, отражающих содержание переменной и которые невозможно было бы типографические спутать с другими. Мы склонны принимать короткие названия для локальных переменных, особенно счетчиков цикла, и длинные - для внешних переменных.
Типы данных и размеры
Существует лишь несколько основных типов данных в C: char один байт, способный удерживать один знак локального набора символов
int целое, типично отражает натуральный размер целых машины
float одинарной точности число с плавающей точкой
double двойной точности число с плавающей точкой
В дополнение, существует определенное количество классификаторов, которые можно использовать применительно вышеуказанных основных типов. Так, short с long применяются с целыми:
short int sh;
long int counter;
Слово int можно опустить в таких объявлениях и, типично, именно так и делают.
Идея заключается в том, что short и long должны обеспечивать различными длинами целых, там где это имеет практический смысл; int, как правило, будет натуральным размером целого для определенной машины. short часто имеет 16-битную длину, а int - 16, или 32-битную. Каждый компилятор может выбрать соответствующие размеры для собственного оборудования, единственным ограничением будучи то, что short и int должны иметь не менее 16 бит, long - 32 бита, short не может быть длиннее int, который, в свою очередь - не длиннее long.
Классификаторы signed или unsigned можно применять для char или любого целого. Беззнаковые, unsigned, числа всегда положительные или ноль и подлежат правилам арифметического модуля 2n, где n - это количество битов используемого типа. Так, например, если char имеет длину 8 битов, переменные типа unsigned char иметь значение от 0 255, тогда как signed char - между -128 и 127 (в машине с двоичной системой). Или обычные char принимаются со знаком, есть беззнаковыми, зависит от машины, но друковни знаки всегда положительны.
Тип long double указывает на число с плавающей точкой повышенной точности. Так же, как и в случае с целыми, размеры объектов с плавающей точкой зависят от реализации; float, double и long double могут представлять один, два или три отличных размеры.
Стандартные файлы заголовка
Упражнение 2-1. Напишите программу для определения амплитуд переменных char, short, int и long, как со знаком, singned, так и беззнаковых, unsigned, путем вывода соответствующих значений из файлов заголовка и путем непосредственного вычисления. Труднее, если вы вычислите их. Определите диапазон различных типов с плавающей точкой.
Константы
Целочисленная константа, например 1234, имеет тип int. Длинная константа пишется с конечной l (английский "эл") или L, вроде 123456789L; целочисленная константа, слишком велика для того, чтобы уместиться в int, также будет рассмотрена как long. Беззнаковые константы пишутся с конечной u (английский "ю") или U, а суффикс ul или UL указывает на тип unsigned long (беззнаковое длинное целое).
Константы с плавающей точкой, должны содержать или десятичную точку, либо экспоненту, или обе; их тип считается double, разве что указано какой другой суффикс. Суффикс f или F обозначает константу с плавающей точкой, float; l или L указывают на long double (длинное двойное число с плавающей точкой).
Значение целого можно указать как восьмеричное или шестнадцатеричное, вместо десятичной. Передний 0 (ноль) в случае целой константы, означает восьмеричное число; 0x или 0X впереди означают шестнадцатеричное. Так, например, десятичное 31 может быть записано как 037 в восьмеричной системе, и 0x1f или 0x1F - в шестнадцатеричной. По восьмеричными и шестнадцатеричными константами может также следовать L, чтобы поменять их тип на long, или U, чтобы превратить их в беззнаковые; 0XFUL - это константа, имеет тип unsigned long (беззнаковых длинных) с десятичным значением 15.
Символьная константа - это целое, записанное как символ в одинарных кавычках, как вот 'x'. Значение символьной константы равна числовому значению знака в наборе знаков машины. Например, в наборе знаков ASCII, символьная константа '0 'имеет значение 48, что не имеет никакого отношения к числового значения 0. Если мы напишем '0 ', вместо числового значения 48, которое зависит от набора знаков, программу, которая не зависит от определенного числового значения, будет одновременно легче читать. Символьные константы могут принимать участие в числовых операциях так же, как и другие цели, хотя их чаще используют для сравнений с другими знаками.
Некоторые знаки в символьных и строковых константах можно представить как экранированные последовательности, например \ n (символ новой строки); эти последовательности выглядят как два знака, но означают только один. В дополнение, произвольный ряд битов размером один байт можно указать как
'\ Ooo'
где ooo - это один к трем восьмеричных цифр (0 ... 7), или как
'\ Xhh'
где hh - это одна или более шестнадцатеричных цифр (0 .. 9, a. .. f, A. .. F). Таким образом, мы можем написать
# Define VTAB '\ 013' / * вертикальная табуляция в ASCII * /
# Define BELL '\ 007' / * символ звонка в ASCII * /
или в шестнадцатеричной форме
# Define VTAB '\ xb' / * вертикальная табуляция в ASCII * /
# Define BELL '\ x7' / * символ звонка в ASCII * /
Вот полный набор экранированных последовательностей: \ a символ сигнала (звонка) \ \ обратная наклонная
\ B реверс (шаг назад) \? знак
\ F изменение страницы \ 'одинарные кавычки
\ N новая строка \ "двойные кавычки
\ R возврат каретки \ ooo восьмеричное число
\ T горизонтальная табуляция \ xhh шестнадцатеричное число
\ V вертикальная табуляция
Символьная константа '\ 0' обозначает знак со значением ноль, нулевой знак. '\ 0' часто используется вместо 0, чтобы подчеркнуть символьное происхождение некоторых выражений, но числовое значение - это просто 0.
Устойчивое (константный) выражение - это такой, который включает только стали (константы). Такие выражения оцениваются во время компиляции, а не во время обращения программы и, соответственно, могут использоваться в любом месте, где может стоять константа, скажем
# Define MAXLINE 1000
char line [MAXLINE +1];
или
# Define LEAP 1 / * високосный год * /
int days [31 +28 + LEAP +31 +30 +31 +30 +31 +31 +30 +31 +30 +31];
Цепную константа, или строковых литерал - это последовательность из нуля или более знаков, окруженных двойные кавычки, как, например
"I am a string"
или
"" / * Пустой цепочку * /
Кавычки не являются частью цепочки, а служат только для его ограничения. Те же экранированные последовательности, используемые в символьных константах, можно так же применить в цепочках; \ "представляет знак двойных кавычек. Цепочке константы можно сцепить при компиляции:
"Hello" "world"
тождественно
"Hello, world"
Это удобно для разделения длинных цепочек на несколько строк исходного текста.
Технически, цепную константа - это массив знаков. Внутреннее представление цепочки включает нулевой знак '\ 0' в конце, поэтому физическое место хранения требует на один больше символов, чем те, которые находятся в двойных кавычках. Этот способ представления означает, что нет ограничения длины цепочки, но программы полностью должен просканировать цепочку, чтобы определить его длину. Функция стандартной библиотеки strlen (s) возвращает длину своего аргумента, символьного цепочки s, за исключением конечного '\ 0'. Вот наша версия этой функции:
/ * Strlen: возвращает длину s * /
int strlen (char s [])
{
int i;
while (s [i]! = '\ 0')
+ + I;
return i;
}
strlen и другие цепочке функции объявлены в стаvндартному файле заголовка
Будьте осторожны, чтобы суметь отличить символьную константу от цепочки, содержащей один знак: 'x' - это не то же, что "x". Первое - это целое число, которое используется для получения числового значения буквы x в машинном наборе символов. Второе - массив символов, содержащий единственный знак (букву x) и '\ 0'.
Существует еще один вид постоянных - константы перечня. Перечень - это список постоянных целых значений, например
enum boolean {NO, YES};
Первое название типа enum наберет значение 0, следующая - 1, и так далее, разве что был задан явные значения. Если не все значения указано явно, тогда те, которые не задано, будут продолжать прогрессию от последнего заданного, как показано в следующих примерах:
enum escapes {BELL = '\ a', BACKSPACE = '\ b', TAB = '\ t',
NEWLINE = '\ n', VTAB = '\ v', RETURN = '\ r'};
enum months {JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC};
/ * FEB = 2, MAR = 3, etc. * /
Названия в разных списках должны отличаться. Значения не обязательно должны отличаться в том же списке.
Перечни предоставляют удобный способ связывания постоянных значений с названиями, как альтернатива # define за исключением того, что значение может быть автоматически генерируемые для вас. Даже если переменные типа enum объявлено, компиляторы не обязаны проверять, что то, что вы сохранили в такой переменной является действующим значением для перечня. Несмотря на это, сменные перечня обеспечивают возможностью проверки, поэтому часто это лучше чем # define. В дополнение, отладчик может вывести значения переменных перечня в их символической форме.
Другие материалы по теме:
- Внешние переменные и область действия- Язык программирования c в игровой индустрии: движки и производительность
- Введение в c++
- Функции и структура программ
- Символьные массивы
