Для пользователей, которые регистрируются. Если Вам не приходит письмо с подтверждением email, пишите на admin[at]quizful[dot]net - будем подтверждать вручную. Просим прощения за доставленные неудобства.

С уважением,
команда Quizful
Знаете ли Вы, что

Индивидуальный рейтинг по категориям можно просмотреть на странице с профилем.

Топ контрибуторов
loading
loading
Лента обновлений
ссылка May 17 19:13
Комментарий от elirijndael:
Полностью согласен с valid_name.
ссылка May 17 18:47
Комментарий от Aleksandr89:
Неплохой тест. Для тех кто хочет ещё попрактиковатьс...
ссылка May 17 15:13
Комментарий от dpdpdp:
Поменяйте радиокнопки на чекбоксы.
Во втором варианте про...
ссылка May 17 11:55
Комментарий от Torredo812:
вот это подвох!!!
забываешь что х увеличился))и думае...
ссылка May 17 10:50
Комментарий от lesha1980:
Хороший вопрос. Получается, что проверяется только x в...
Статистика

Тестов: 130, вопросов: 5791. Пройдено: 126748 / 526541.

Макросы и встраиваемые функции

Автор: Mimiko  к списку      

Вопрос
В чем отличия макросов от встраиваемых функций?
Ответ
1. Выражения, переданные в качестве аргументов во встроенные функции, вычисляются один раз, в то время как в макросах в некоторых случаях выражения могут вычисляться более одного раза.

#define max(aa, bb) (aa>bb?aa:bb)

int main()
{
int a = 0;
int b = 1;

int c = max(a++, b++);
cout << a << endl << b << endl << c << endl;
}
В консоли будет: 13, потому что макрос развернется в следующее выражение

int c = a++ > b++ ? a++ : b++;
(b увеличится 2 раза)

2. Макросы разворачивает предпроцессор, тело встроенной функции вставляет в место вызова компилятор.

3. Встроенные функции более безопасны в плане типов передаваемых аргументов, т.к. это проверяется еще на этапе компиляции. Макросы могут получить в качестве аргумента (-ов) значения совершенно неподходящего типа (при этом ошибки предпроцессора не будет и компиляция пройдет успешно), что может вызвать undefined behavoir, макрос может вернуть некорректный результат или могут произойти другие нежелательные, но не всегда очевидные последствия.

4. Макросы [i]всегда[/i] разворачиваются предпроцессором, в том время как компилятор делает функцию с inline директивой встроенной в зависимости от своей внутренней логики.

5. Встраиваемые функции всегда передают аргументы по значению. Если аргумент - выражение, то перед передачей оно всегда вычисляется и передается уже результат этого выражения. Функция func(3 + 5) передаст в качестве аргумента 5, в то время как макросы не всегда производят вычисления выражений в качестве аргументов.

#define square(x) x*x
...
int y =  square(2+3)
Будет заменено на int y = 2 + 3*2 + 3

6. Встраиваемые функции учитывают пространство имен, в то время как макросы не различают границ пространства имен, они доступны везде. Макросы не могут определяться внутри класса (т.е. принадлежать ему), встраиваемые функции - могут.

Если Вам понравился вопрос, проголосуйте за него

Голосов: 5  loading...
HSF   olkorule   andreyduha   art   anton010