Средство enumобеспечивает удобный способ присвоить константам имена, причем в отличие от #defineзначения констант при этом способе могут генерироваться автоматически. Хотя разрешается объявлять переменные типа enum, однако компилятор не обязан контролировать, входят ли присваиваемые этим переменным значения в их тип. Но сама возможность такой проверки часто делает enum лучше, чем #define. Кроме того, отладчик получает возможность печатать значения переменных типа enum в символьном виде.
Все переменные должны быть объявлены раньше, чем будут использоваться, при этом некоторые объявления могут быть получены неявно - из контекста. Объявление специфицирует тип и содержит список из одной или нескольких переменных этого типа, как, например, в
int lower, upper, step;
char с, line[1000];
Переменные можно распределять по объявлениям произвольным образом, так что указанные выше списки можно записать и в следующем виде:
int lower;
int upper;
int step;
char c;
char line[1000];
Последняя форма записи занимает больше места, тем не менее она лучше, поскольку позволяет добавлять к каждому объявлению комментарий. Кроме того, она более удобна для последующих модификаций.
В своем объявлении переменная может быть инициализирована, как, например:
char esc = '\\';
int i = 0;
int limit = MAXLINE+1;
float eps = 1.0e-5;
Инициализация неавтоматической переменной осуществляется только один раз - перед тем, как программа начнет выполняться, при этом начальное значение должно быть константным выражением. Явно инициализируемая автоматическая переменная получает начальное значение каждый раз при входе в функцию или блок, ее начальным значением может быть любое выражение. Внешние и статические переменные по умолчанию получают нулевые значения. Автоматические переменные, явным образом не инициализированные, содержат неопределенные значения ("мусор").
К любой переменной в объявлении может быть применен квалификатор constдля указания того, что ее значение далее не будет изменяться.
const double е = 2.71828182845905;
const char msg[] = "предупреждение: ";
Применительно к массиву квалификатор constуказывает на то, что ни один из его элементов не будет меняться. Указание constможно также применять к аргументу- массиву, чтобы сообщить, что функция не изменяет этот массив:
int strlen(const char[]);
Реакция на попытку изменить переменную, помеченную квалификатором constзависит от реализации компилятора.
2.5 Арифметические операторы
Бинарными (т. е. с двумя операндами) арифметическими операторами являются +, -, *, /, а также оператор деления по модулю %. Деление целых сопровождается отбрасыванием дробной части, какой бы она ни была. Выражение
x % y
дает остаток от деления x на y и, следовательно, нуль, если x делится на y нацело. Например, год является високосным, если он делится на 4, но не делится на 100. Кроме того, год является високосным, если он делится на 400. Следовательно,
if ((year % 4 == 0 && year % 100 !=0 || year % 400 == 0)
printf("%d високосный год\n", year);
else
printf("%d невисокосный год\n", year);
Оператор %к операндам типов floatи doubleне применяется. В какую сторону (в сторону увеличения или уменьшения числа) будет усечена дробная часть при выполнении /и каким будет знак результата операции %с отрицательными операндами, зависит от машины.
Бинарные операторы +и -имеют одинаковый приоритет, который ниже приоритета операторов *, /и %, который в свою очередь ниже приоритета унарных операторов +и -. Арифметические операции одного приоритетного уровня выполняются слева направо.
В конце этой главы (параграф 2.12) приводится таблица 2.1,в которой представлены приоритеты всех операторов и очередность их выполнения.
2.6 Операторы отношения и логические операторы
Операторами отношения являются
›
›=
‹
‹=
Все они имеют одинаковый приоритет. Сразу за ними идет приоритет операторов сравнения на равенство:
==
!=
Операторы отношения имеют более низкий приоритет, чем арифметические, поэтому выражение вроде i ‹ lim-1 будет выполняться так же, как i ‹ (lim-1), т.е. как мы и ожидаем.
Читать дальше