Бьерн Страуструп.
Язык программирования С++
83
3.2.1 Скобки
Синтаксис языка С++ перегружен скобками, и разнообразие их применений способно сбить с толку. Они
выделяют фактические параметры при вызове функций, имена типов, задающих функции, а также
служат для разрешения конфликтов между операциями с одинаковым приоритетом. К счастью,
последнее встречается не слишком часто, поскольку приоритеты и порядок применения операций
определены так, чтобы выражения вычислялись "естественным образом" (т.е. наиболее
распространенным образом). Например, выражение
if (i<=0 || max
означает следующее: "Если i меньше или равно нулю, или если max меньше i". То есть, оно
эквивалентно
if ( (i<=0) || (max
но не эквивалентно допустимому, хотя и бессмысленному выражению
if (i <= (0||max) < i) // ...
Тем не менее, если программист не уверен в указанных правилах, следует использовать скобки, причем
некоторые предпочитают для надежности писать более длинные и менее элегантные выражения, как:
if ( (i<=0) || (max
При усложнении подвыражений скобки используются чаще. Не надо, однако, забывать, что сложные
выражения являются источником ошибок. Поэтому, если у вас появится ощущение, что в этом
выражении нужны скобки, лучше разбейте его на части и введите дополнительную переменную.
Бывают случаи, когда приоритеты операций не приводят к "естественному" порядку вычислений.
Например, в выражении
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)
// ошибка: присваивание константы в условии
// ...
Она вполне объяснима, поскольку в большинстве языков "=" означает "равно". Для транслятора не
составит труда сообщать об ошибках подобного рода.
Достарыңызбен бөлісу: