Страница 27 из 51
3.2 Краткая сводка операций
Операции С++ подробно и систематически описываются в #с. 7; прочитайте, пожалуйста, этот раздел. Здесь же приводится операция краткая сводка и некоторые примеры. После каждой операции приведено одно или более ее общеупотребительных наваний и пример ее использования. В этих примерах имя_класса – это имя класса, член – имя члена, объект – выражение, дающее в результате объект класса, указатель – выражение, дающее в результате указатель, выр – выражение, а lvalue – выражение, денотирующее неконстантный объект. Тип может быть совершенно произвольным именем типа (со * () и т.п.) только когда он стоит в скобках, во всех остальных случаях существуют огранчения.
Унарные операции и операции присваивания правоассоцитивны, все остальные левоассоциативны. Это значит, что a=b=c означает a=(b=c), a+b+c означает (a+b)+c, и *p++ означает *(p ++), а не (*p)++.
В каждой очерченной части находятся операции с одинаквым приоритетом. Операция имеет приоритет больше, чем оперции из частей, расположенных ниже. Например: a+b*c означает a +(b*c), так как * имеет приоритет выше, чем +, а a+b-c ознчает (a+b)-c, поскольку + и – имеют одинаковый приоритет (и поскольку + левоассоциативен).
3.2.1 Круглые скобки
Скобками синтаксис С++ злоупотребляет; количество спосбов их использования приводит в замешательство: они применются для заключения в них параметров в вызовах функций, в них заключается тип в преобразовании типа (приведении к типу), в именах типов для обозначения функций, а также для разрешения конфликтов приоритетов. К счастью, последнее требуется не слишком часто, потому что уровни приоритета и правила ассоцативности определены таким образом, чтобы выражения «работали ожидаемым образом» (то есть, отражали наиболее привычный спсоб употребления). Например, значение
if (i«=0 !! max«i) // ...
очевидно. Тем не менее, всегда, когда программист сомнвается относительно этих правил, следует употреблять скобки, и некоторые программисты предпочитают немного более длинное и менее элегантное
if ( (i«=0) !! (max«i) ) // ...
При усложнении подвыражений употребление скобок станвится более обычным явлением, но сложные подвыражения являюся источником ошибок, поэтому если вы чувствуете потребность в скобках, попробуйте оборвать выражение и использовать дополнительную переменную. Есть и такие случаи, когда приоритты операций не приводят к «очевидному» результату. Например в
if (i amp;mask == 0) // ...
не происходит применения маски mask к i и последующей проверки результата на ноль. Поскольку == имеет приоритет вше, чем amp;, выражение интерпретируется как i amp;(mask==0). В этом случае скобки оказываются важны:
if ((i amp;mask) == 0) // ...
Но, с другой стороны, то, что следующее выражение не рботает так, как может ожидать наивный пользователь, ничего не значит:
if (0 «= a «= 99) // ...
Оно допустимо, но интерпретируется оно как (0«=a)«=99, где результат первого подвыражения или 0 или 1, но не a (если только a не равно 1). Чтобы проверить, лежит ли a в диапазоне 0...99, можно написать
if (0«=a amp; amp; a«=99) // ...
|