Макрос в выражении не работает должным образом - PullRequest
1 голос
/ 24 октября 2019

У меня есть простой макрос для добавления 2 переменных, который не работает должным образом.

#include <iostream>
using namespace std;
#define ADD(x,y) (x+y);

int main() {
    int a = 10;
    int b = 1;
    int c = ADD(a,b)+1; //c=11 - NOT EXPECTED
    int c = 1+ADD(a,b); //c=12 - EXPECTED

    cout<< c;
}

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

Почему это происходит? Насколько мне известно, когда используется макрос, компилятор просто заменит макрос строкой токена во время компиляции. Если это так, в обоих случаях выходные данные должны быть одинаковыми.

Первый случай: c = (a+b)+1 Второй случай c = 1+(a+b)

1 Ответ

4 голосов
/ 24 октября 2019

Удалите точку с запятой в конце макроса и напишите его как

#define ADD(x,y) (( x ) + ( y ))

В противном случае, например, эта строка

int c = ADD(a,b)+1;

эквивалентна

int c = (a + b); +1;

то есть содержит объявление переменной c и оператор

+1;

без эффекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...