2.4. Описания
Все переменные должны быть описаны до их использования,
хотя некоторые описания делаются неявно, по контексту. Опи-
сание состоит из спецификатора типа и следующего за ним
списка переменных, имеющих этот тип, как, например,
INT LOWER, UPPER, STEP;
CHAR C, LINE[1000];
Переменные можно распределять по описаниям любым обра-
зом; приведенные выше списки можно с тем же успехом записать
в виде
INT LOWER;
INT UPPER;
INT STEP;
CHAR C;
CHAR LINE[1000];
Такая форма занимает больше места, но она удобна для до-бавления комментария к каждому описанию и для последующих модификаций.
Переменным могут быть присвоены начальные значения внут-
ри их описания, хотя здесь имеются некоторые ограничения.
Если за именем переменной следуют знак равенства и констан-
та, то эта константа служит в качестве инициализатора, как,
например, в
CHAR BACKSLASH = '\\';
INT I = 0;
FLOAT EPS = 1.0E-5;
Если рассматриваемая переменная является внешней или
статической, то инициализация проводится только один раз,
согласно концепции до начала выполнения программы. Инициали-
зируемым явно автоматическим переменным начальные значения
присваиваются при каждом обращении к функции, в которой они
описаны. Автоматические переменные, не инициализируемые яв-
но, имеют неопределенные значения, (т.е. мусор). Внешние и
статические переменные по умолчанию инициализируются нулем,
но, тем не менее, их явная инициализация является признаком
хорошего стиля.
Мы продолжим обсуждение вопросов инициализации, когда
будем описывать новые типы данных.
2.5. Арифметические операции.
Бинарными арифметическими операциями являются +, -, *, /
и операция деления по модулю %. Имеется унарная операция -,
но не существует унарной операции +.
·
44 -
При делении целых дробная часть отбрасывается. Выражение
X % Y
дает остаток от деления X на Y и, следовательно, равно нулю,
когда х делится на Y точно. Например, год является високос-
ным, если он делится на 4, но не делится на 100, исключая
то, что делящиеся на 400 годы тоже являются високосными. По-
этому
IF(YEAR % 4 == 0 && YEAR % 100 != 0 \!\! YEAR % 400 == 0)
год високосный
ELSE
год невисокосный
Операцию % нельзя использовать с типами FLOAT или
DOUBLE.
Операции + и - имеют одинаковое старшинство, которое
младше одинакового уровня старшинства операций *, / и %, ко-
торые в свою очередь младше унарного минуса. Арифметические
операции группируются слева направо. (Сведения о старшинстве
и ассоциативности всех операций собраны в таблице в конце
этой главы). Порядок выполнения ассоциативных и коммутатив-
ных операций типа + и - не фиксируется; компилятор может пе-
регруппировывать даже заключенные в круглые скобки выраже-
ния, связанные такими операциями. таким образом, а+(B+C) мо-
жет быть вычислено как (A+B)+C. Это редко приводит к како-
му-либо расхождению, но если необходимо обеспечить строго
определенный порядок, то нужно использовать явные промежу-
точные переменные.
Действия, предпринимаемые при переполнении и антипере-
полнении (т.е. При получении слишком маленького по абсолют-
ной величине числа), зависят от используемой машины.
2.6. Операции отношения и логические операции
Операциями отношения являются
=> > =< <
все они имеют одинаковое старшинство. Непосредственно за ни-
ми по уровню старшинства следуют операции равенства и нера-
венства:
== !=
которые тоже имеют одинаковое старшинство. операции отноше-
ния младше арифметических операций, так что выражения типа
I<LIM-1 понимаются как I<(LIM-1), как и предполагается.
Логические связки && и \!\! более интересны. Выражения,
связанные операциями && и \!\!, вычисляются слева направо,
причем их рассмотрение прекращается сразу же как только ста-
новится ясно, будет ли результат истиной или ложью. учет
этих свойств очень существенен для написания правильно рабо-
тающих программ. Рассмотрим, например, оператор цикла в счи-
тывающей строку функции GETLINE, которую мы написали в главе
1.
· 45 -
FOR(I=0;I<LIM-1 && (C=GETCHAR()) != '\N' && C != EOF; ++I)
S[I]=C;
Ясно, что перед считыванием нового символа необходимо
проверить, имеется ли еще место в массиве S, так что условие
I<LIM-1 должно проверяться первым. И если это условие не вы-
полняется, мы не должны считывать следующий символ.
Так же неудачным было бы сравнение 'C' с EOF до обраще-
ния к функции GETCHAR : прежде чем проверять символ, его
нужно считать.
Старшинство операции && выше, чем у \!\!, и обе они
младше операций отношения и равенства. Поэтому такие выраже-
ния, как
I<LIM-1 && (C = GETCHAR()) != '\N' && C != EOF
не нуждаются в дополнительных круглых скобках. Но так как
операция != старше операции присваивания, то для достижения
правильного результата в выражении
(C = GETCHAR()) != '\N'
кобки необходимы.
Унарная операция отрицания ! Преобразует ненулевой или
истинный операнд в 0, а нулевой или ложный операнд в 1.
Обычное использование операции ! Заключается в записи
IF( ! INWORD )
Вместо
IF( INWORD == 0 )
Tрудно сказать, какая форма лучше. Конструкции типа ! INWORD
Читаются довольно удобно (“если не в слове”). Но в более
сложных случаях они могут оказаться трудными для понимания.
Упражнение 2-1.
Напишите оператор цикла, эквивалентный приведенному выше
оператору FOR, не используя операции &&.
... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...
... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...
... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...
... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...
0 комментариев