2.10. Операции и выражения присваивания.
Такие выражения, как
I = I + 2
в которых левая часть повторяется в правой части могут быть
записаны в сжатой форме
I += 2
используя операцию присваивания вида +=.
Большинству бинарных операций (операций подобных +, ко-
торые имеют левый и правый операнд) соответствует операция
присваивания вида оп=, где оп - одна из операций
+ - * / % << >> & \^ \!
Если е1 и е2 - выражения, то
· 54 -
е1 оп= е2
эквивалентно
е1 = (е1) оп (е2)
за исключением того, что выражение е1 вычисляется только
один раз. Обратите внимание на круглые скобки вокруг е2:
X *= Y + 1
то
X = X * (Y + 1)
не
X = X * Y + 1
В качестве примера приведем функцию BITCOUNT, которая подсчитывает число равных 1 битов у целого аргумента.
BITCOUNT(N) /* COUNT 1 BITS IN N */
UNSIGNED N;
(
INT B;
FOR (B = 0; N != 0; N >>= 1)
IF (N & 01)
B++;
RETURN(B);
)
Не говоря уже о краткости, такие операторы приваивания
имеют то преимущество, что они лучше соответствуют образу
человеческого мышления. Мы говорим: “прибавить 2 к I” или
“увеличить I на 2”, но не “взять I, прибавить 2 и поместить
результат опять в I”. Итак, I += 2. Кроме того, в громоздких
выражениях, подобных
YYVAL[YYPV[P3+P4] + YYPV[P1+P2]] += 2
Tакая операция присваивания облегчает понимание программы,
так как читатель не должен скрупулезно проверять, являются
ли два длинных выражения действительно одинаковыми, или за-
думываться, почему они не совпадают. Такая операция присваи-
вания может даже помочь компилятору получить более эффектив-
ную программу.
Мы уже использовали тот факт, что операция присваивания
имеет некоторое значение и может входить в выражения; самый
типичный пример
· 55 -
WHILE ((C = GETCHAR()) != EOF)
присваивания, использующие другие операции присваивания (+=,
-= и т.д.) также могут входить в выражения, хотя это случа-
ется реже.
Типом выражения присваивания является тип его левого
операнда.
Упражнение 2-9.
В двоичной системе счисления операция X&(X-1) обнуляет
самый правый равный 1 бит переменной X.(почему?) используйте
это замечание для написания более быстрой версии функции
BITCOUNT.
2.11. Условные выражения.
Операторы
IF (A > B)
Z = A;
ELSE
Z = B;
конечно вычисляют в Z максимум из а и в. Условное выражение,
записанное с помощью тернарной операции “?:”, предоставляет
другую возможность для записи этой и аналогичных конструк-
ций. В выражении
е1 ? Е2 : е3
сначала вычисляется выражение е1. Если оно отлично от нуля
(истинно), то вычисляется выражение е2, которое и становится
значением условного выражения. В противном случае вычисляет-
ся е3, и оно становится значением условного выражения. Каж-
дый раз вычисляется только одно из выражения е2 и е3. Таким
образом, чтобы положить Z равным максимуму из а и в, можно
написать
Z = (A > B) ? A : B; /* Z = MAX(A,B) */
Следует подчеркнуть, что условное выражение действитель-
но является выражением и может использоваться точно так же,
как любое другое выражение. Если е2 и е3 имеют разные типы,
то тип результата определяется по правилам преобразования,
рассмотренным ранее в этой главе. например, если F имеет тип
FLOAT, а N - тип INT, то выражение
(N > 0) ? F : N
Имеет тип DOUBLE независимо от того, положительно ли N или
нет.
· 56 -
Так как уровень старшинства операции ?: очень низок,
прямо над присваиванием, то первое выражение в условном вы-
ражении можно не заключать в круглые скобки. Однако, мы все
же рекомендуем это делать, так как скобки делают условную
часть выражения более заметной.
Использование условных выражений часто приводит к корот-
ким программам. Например, следующий ниже оператор цикла пе-
чатает N элементов массива, по 10 в строке, разделяя каждый
столбец одним пробелом и заканчивая каждую строку (включая
последнюю) одним символом перевода строки.
OR (I = 0; I < N; I++)
PRINTF(“%6D%C”,A[I],(I%10==9 \!\! I==N-1) ? '\N' : ' ')
Символ перевода строки записывается после каждого десятого
элемента и после N-го элемента. За всеми остальными элемен-
тами следует один пробел. Хотя, возможно, это выглядит муд-
реным, было бы поучительным попытаться записать это, не ис-
пользуя условного выражения.
Упражнение 2-10.
Перепишите программу для функции LOWER, которая переводит
прописные буквы в строчные, используя вместо конструкции
IF-ELSE условное выражение.
... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...
... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...
... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...
... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...
0 комментариев