Главная arrow Начинающим arrow FAQ по языку Си arrow 13. Почему в макросах, сделанных «настоящими» программистами, так много круглых скобок?  
25.09.2017 г.
Главная
Проекты
Статьи
Начинающим
Архив новостей
Ссылки
Контакты
Поиск
Файлы
Форум
Карта сайта
Авторизация





Забыли пароль?
Ещё не зарегистрированы? Регистрация
Поддержи наш сайт!
Через WebMoney

 R785211844650
 Z210696637574
 E368177590409

Простые устройстваОтличные товары по превосходным ценамОтличные товары по превосходным ценам
13. Почему в макросах, сделанных «настоящими» программистами, так много круглых скобок? Печать E-mail
Рейтинг: / 8
ХудшаяЛучшая 
Автор 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) | Просмотров: 7906

  Коментарии (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
если вы ответите, какая из двух операций выполнится первой - вопросов нет: & или == :)

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

 
« Пред.
Полезные материалы по сходным темам
Кто на сайте?
Помощь on-line
BannerFans.com