Я имею дело с очень странной задачей для моего университета. Цель состоит в том, чтобы написать реализацию для функции, которая работает следующим образом:
int z = 3;
toSquare(2);
toSquare(6);
toSquare(Incr(z));
toSquare(2+4);
/* result :
2 to square is 4.
6 to square is 36.
Incr(z) to square is 16.
2+4 to square is 16.
*/
Я думал об использовании макросов, как вы видите в строке 10. "2 + 4" было напечатано против ожидаемого (?) 6, поэтому это может быть сделано с использованием опции макроса #, но я не знаю, как справиться с этим toSquare ( 2 + 4), а результат - 2 + 4 до 16. Спасибо за все идеи и решения! ура
Правильный ответ включает в себя следующие два принципа:
#
препроцессора.(2+4) * 2+4
равно 16. Поэтому заключите первый операнд с круглыми скобками, но не второй!Это дает следующий макрос:
#define toSquare(x) \
std::cout << #x << " to square is " << (x) * x << std::end;
Вот рабочий пример.
Решение в C с использованием макроса TOSQUARE
:
#define TOSQUARE(x) ((x)*(x))
int main()
{
int z = 3;
TOSQUARE(2);
TOSQUARE(6);
TOSQUARE(Incr(z));
z = TOSQUARE(2+4);
return 0;
}