Макрос-функция в С++

167
03 октября 2018, 06:20
#define MAX(x, y, r) {int rtemp=(((x)>(y)) ? x : y);\
                      r=rtemp; }

Функция должна сравнивать параметры x и y и присваивать r значение большего. Как можно её реализовать так, чтобы всё не ломалось при передаче следующих параметров:

int R = 14;
int a = 5;
int b = 6;
MAX(a,b,R++);

Выводит такую ошибку:

lvalue required as left operand of assignment|
Answer 1

Чтобы понять ошибку стоит знать, что оператор постинкремента возвращает значение до увеличения значения аргумента. Это значение временное и не может быть использовано в качестве левой части выражения присваивания.

Если уж всё же так сильно хочется добавить ++ к R, можно использовать преинкремент ++R. Это выражение увеличит значение R и вернёт ссылку на переменную. Смысла в этом немного, т.к. в эту переменную сразу же запишется результат макроса, но по крайней мере код будет компилироваться. В общем же случае, никакой инкремент для задачи присваивания максимума вовсе не нужен.

Вполне будет работать вариант MAX(a, b, R);

На основании уточнения в комментарии я делаю вывод, что речь должно идти всё же об постикременте аргументов, задающих входящие значения, а не результат.

И проверка проваливается фактически на вызове вида:

MAX(a, b++, R);

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

#define MAX(x, y, r) {int X = (x); int Y = (y); r = X > Y ? X : Y; }
Answer 2

Суть задачи состоит в том, чтобы использовать именно макрос

Необходимо присвоить переменной R значение, в данном случае, b.

#define max(a,b)    (((a)>(b)) ? (a) : (b))
#define maxr(a,b,r) r = (((a)>(b)) ? (a) : (b))
int R = 14;
int a = 5;
int b = 6;
R = max(a,b);
maxr(a,b,R);
R++;  // :)
READ ALSO
Code::Blocks - GDB не видит точек останова в проекте CMake

Code::Blocks - GDB не видит точек останова в проекте CMake

Продолжая знакомиться с Code::Blocks наткнулся на непонятное поведениеЕсли проект создан с помощью CMake - GDB не видит точек останова в проекте, так...

151
String, null и “”

String, null и “”

Мне нужно найти метод, который будет преобразовывать

126
Static в методах

Static в методах

Такая ошибка:

141
Глюк при работе с Java

Глюк при работе с Java

Windows XP Professional SP3 jdk17

140