Бьерн Страуструп - Язык программирования С++. Главы 2-4
Страница 39. Скобки


 

3.2.1  Скобки

Синтаксис языка С++ перегружен скобками, и разнообразие их применений
способно сбить с толку. Они выделяют фактические параметры при
вызове функций, имена типов, задающих функции, а также служат для
разрешения конфликтов между операциями с одинаковым приоритетом.
К счастью, последнее встречается не слишком часто, поскольку приоритеты
и порядок применения операций определены так, чтобы выражения вычислялись
"естественным образом" (т.е. наиболее распространенным образом).
Например, выражение

            if (i<=0 || max<i)   // ...

означает следующее: "Если i меньше или равно нулю, или если max меньше i".
То есть, оно эквивалентно

            if ( (i<=0) || (max<i) )    // ...

но не эквивалентно допустимому, хотя и бессмысленному выражению

            if (i <= (0||max) < i)    // ...

Тем не менее, если программист не уверен в указанных правилах,
следует использовать скобки, причем некоторые предпочитают для
надежности писать более длинные и менее элегантные выражения, как:

           if ( (i<=0) || (max<i) )   // ...

При усложнении подвыражений скобки используются чаще.  Не надо, однако,
забывать, что сложные выражения являются источником ошибок. Поэтому,
если у вас появится ощущение, что в этом выражении нужны скобки,
лучше разбейте его на части и введите дополнительную переменную.
Бывают случаи, когда приоритеты операций не приводят к "естественному"
порядку вычислений. Например, в выражении

           if (i&mask == 0)    // ловушка! & применяется после ==

 не происходит маскирование i (i&mask), а затем проверка результата
 на 0. Поскольку у == приоритет выше, чем у &, это выражение эквивалентно
 i&(mask==0). В этом случае скобки играют важную роль:

           if ((i&mask) == 0) // ...

Имеет смысл привести еще одно выражение, которое вычисляется
 совсем не так, как мог бы ожидать неискушенный пользователь:

           if (0 <= a <= 99) // ...

Оно допустимо, но интерпретируется  как (0<=a)<=99, и результат первого
сравнения равен или 0, или 1, но не значению a (если, конечно,
a не есть 1). Проверить, попадает ли a в диапазон 0...99, можно так:

           if (0<=a && a<=99) // ...

Среди новичков распространена ошибка, когда в условии вместо ==
(равно) используют = (присвоить):

           if (a = 7)   // ошибка: присваивание константы в условии
                  // ...

Она вполне объяснима, поскольку в большинстве языков "=" означает "равно".
Для транслятора не составит труда сообщать об ошибках подобного рода.

 
« Предыдущая статья   Следующая статья »