13. Почему в макросах, сделанных «настоящими» программистами, так много круглых скобок?
Автор ARV   
18.12.2009 г.

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

#define sq(x) x*x

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

 Написано  Реально компилируется Соответствует задуманному?
var = sq(3);var = 3*3;Да
var = sq(tmp + 1);var = tmp + 1 * tmp + 1; Нет 
var = 100 / sq(3);  var = 100 / 3 * 3; Нет

 

Если бы макрос был записан с «лишними» скобками, то результат был бы совсем иным:

#define sq(x) ((x)*(x))

Написано   Реально компилируется  Соответствует задуманному?
var = sq(3);var = ((3)*(3)); Да
var = sq(tmp + 1);var = ((tmp + 1) * (tmp + 1)); Да
var = 100 / sq(3);var = 100 / ((3) * (3));  Да
 

Вывод: в определениях макросов скобки лишними не бывают!


Добавить в любимые (0) | Просмотров: 9023

  Коментарии (3)
 1 Написал(а) Максим Геннадьевич, в 12:11 29.12.2009
Да....действительно важный момент :roll
 2 Написал(а) Михаил, в 03:16 02.12.2010
да, скобки вещь полезная. я вот тут мучался долго с одной проблемой, а оказалось что компилятор хотел чтоб я скобок ему добавил. вот так не работало ((temp2 & 0x80==0x80) ? 47:46) а вот так заработало (((temp2 & 0x80)==0x80) ? 47:46) ну объясните мне почему?? ведь вроде никакие приоритеты здесь не нарушены, действие temp2&0x80 одно единственное.
 3 Написал(а) ARV, в 20:06 02.12.2010
если вы ответите, какая из двух операций выполнится первой - вопросов нет: & или == :)

Только зарегистрированные пользователи могут оставлять коментарии.
Пожалуйста зарегистрируйтесь или войдите в ваш аккаунт.