#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|
Чтобы понять ошибку стоит знать, что оператор постинкремента возвращает значение до увеличения значения аргумента. Это значение временное и не может быть использовано в качестве левой части выражения присваивания.
Если уж всё же так сильно хочется добавить ++
к 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; }
Суть задачи состоит в том, чтобы использовать именно макрос
Необходимо присвоить переменной 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++; // :)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Продолжая знакомиться с Code::Blocks наткнулся на непонятное поведениеЕсли проект создан с помощью CMake - GDB не видит точек останова в проекте, так...