Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
воробьев
0 / 0 / 0
Регистрация: 26.02.2014
Сообщений: 67
#1

#define sqr(a) (a)*(a) - зачем так много скобок? - C++

19.03.2014, 20:19. Просмотров 1274. Ответов 4
Метки нет (Все метки)

#define sqr(a) ((a)*(a))

такие вопросы:
1) Зачем ((a)*(a)) так много скобок? (если можно,объяснить доступным языком)
2) почему, если их убрать - то будет неправильно?
3) как работает этот #define ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2014, 20:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос #define sqr(a) (a)*(a) - зачем так много скобок? (C++):

Чем же макрос define так плох? - C++
После прочтения про директиву препроцессора define возник вопрос по поводу применения define, как функции: #define QQ (q) (q^q) Можно...

#define работает не так, как ожидается - C++
Здравствуйте. Подскажите, пожалуйста, почему в таком случае некорректно использовать #define: switch (kind) { case 1: ...

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? - C++
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

что и зачем следует, а так же как работет - C++
int askInteger() { int ret = 0; char cnt = getch(); while(cnt >= '0' && cnt <= '9') { ...

почему так много алгоритмов сортировок - C++
почему так много алгоритмов сортировок?

ошибка номер...да их много. подскажите что не так. - C++
дано расчетно-графическое задание: написать программу на языке с++ в среде MS Visual Studio 2008: написать программу, которая будет...

4
recoder
130 / 130 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
19.03.2014, 20:25 #2
Так, define вообще оператор препроцессора, обеспечивающий реализацию макросов. То, есть, если:

C++
1
#define SQR(x) x*x
То в коде любое вхождение a = SQR(2), компилятор просто заменит на a = 2 * 2;

Скобки нужны, что бы можно было делать вот так:

C++
1
a = SQR(2 + 2);
1
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
19.03.2014, 20:27 #3
Цитата Сообщение от воробьев Посмотреть сообщение
3) как работает этот #define ?
Делает замену. Например:
C++
1
sqr(2)  =>  ((2)*(2))
Цитата Сообщение от воробьев Посмотреть сообщение
1) Зачем ((a)*(a)) так много скобок? (если можно,объяснить доступным языком)
2) почему, если их убрать - то будет неправильно?
Теперь с выражением посложнее:
C++
1
8 / sqr(2 + 2)  =>  8 / ((2 + 2)*(2 + 2))
Без скобок хотя синтаксически корректно, по смыслу уже не то.
1
kupnu4
26 / 26 / 9
Регистрация: 03.05.2013
Сообщений: 71
19.03.2014, 20:30 #4
#define обрабатывается препроцессором. препроцессор - просто текстовый редактор. и он не думая о логике скопирует параметр из sqr в "тело". для этого и нужны скобки.
Пример:
sqr(a) заменится на a*a - то чего и хочется программисту, а sqr(a+1) даст в результате а+1*а+1. согласитесь, не совсем этого вы ожидали от этой операции. для того и нужны скобки и потому без них работает не так как хочется.
1
воробьев
0 / 0 / 0
Регистрация: 26.02.2014
Сообщений: 67
19.03.2014, 20:32  [ТС] #5
теперь мне понятно!

спасибо всем,кто ответил!
0
19.03.2014, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 20:32
Привет! Вот еще темы с ответами:

часы на си=)) не бойтесь -много не спрошу, так ньюанс - C++
значит так... в целях выполнения курсовика и т.д. и т.п. корчое пишу прогу с часами на си... стрелочки, циферблатик, и прочее я сделал...

Почему в программах, компилированных в С++-компиляторах так много лишнего кода? - C++
Здравия всем! Никому не интересное предисловие: Захотел перенсти своего бота с C++ на ассемблер, говорят, так размер уменьшается и...

Зачем взятие адреса нулевого элемента массива, если сама переменная и так его содержит? - C++
Доброго времени суток. Очень часто наблюдаю во всевозможных примерах такого вида код: void* bits = (void*)&(pixels); Таких...

Зачем преобразовывать itsVal в int, если эта переменная и так объявлена как тип int - C++
// Оператор преобразования #include <iostream> using namespace std; class Counter { public: Counter(): itsVal(0) {} ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru