Специальная функция toSquare в C

0

Я имею дело с очень странной задачей для моего университета. Цель состоит в том, чтобы написать реализацию для функции, которая работает следующим образом:

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. Спасибо за все идеи и решения! ура

  • 0
    Кто сказал, что 2 + 4 напечатано? Это просто комментарий. toSquare не должно ничего печатать. То, что делает вызывающий код, не имеет значения при написании функции.
  • 3
    Близкие избиратели: Может быть, прочитайте еще раз. Совершенно ясно, что его смущает.
Показать ещё 4 комментария
Теги:
macros

2 ответа

3

Правильный ответ включает в себя следующие два принципа:

  1. Используйте макросы для строкования: это то, для чего предназначен оператор # препроцессора.
  2. Используйте скрытые круглые скобки для управления расширением аргументов. Заметим, что (2+4) * 2+4 равно 16. Поэтому заключите первый операнд с круглыми скобками, но не второй!

Это дает следующий макрос:

#define toSquare(x)    \
    std::cout << #x << " to square is " << (x) * x << std::end;

Вот рабочий пример.

-3

Решение в 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;
}
  • 2
    Это в любом случае не производит никакого вывода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню