Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: #define abs(x) (x>=0) ? x:-x
1
  1  Петров Владимир Рудольфович, 14 сентября 2023 г. 13:58:36
      --><!-- ---> <img src=xxx:x onerror=javascript:alert(1)> -->
--><!-- --\x00> <img src=xxx:x onerror=javascript:alert(1)> -->
--><!-- --\x21> <img src=xxx:x onerror=javascript:alert(1)> -->
--><!-- --\x3E> <img src=xxx:x onerror=javascript:alert(1)> -->
  2  Петров Владимир Рудольфович, 14 сентября 2023 г. 13:57:49
      '`"><\x3Cscript>javascript:alert(1)</script>
  3  Петров Владимир Рудольфович, 14 сентября 2023 г. 13:55:44
      <a href="https://ya.ru">test</a> [b]test[/b]
  4  Егоров Илья Валерьевич, 10 октября 2019 г. 18:16:20
      Поправка к предыдущему: #include, конечно же, а не #import.
Можно также упомянуть, что #define используется для определения флагов и затем проверки их через #ifdef / #if / ..., позволяя в одном исходнике сочетать коды для разных платформ, но это уже тема полезности препроцессора как такового в промышленной разработке.
  5  Егоров Илья Валерьевич, 10 октября 2019 г. 17:47:03
      Более подробно:

Макросы — это фича, которую дает препроцессор. Препроцессор ничего не знает о языке, он умеет работать только с текстом => он не умеет складывать, вычитать, прочие преобразования делать. Вы даже можете использовать препроцессор вне компилятора для обработки текстов любого рода, на любых языках: поищите в сети filepp, если заинтересует (все те же #define, #import и подобные, что и для Си, но юзабельно хоть даже для Java).

Соответственно, #define используется для замены одного текста на другой, не более того. Наглядный пример:
#include <iostream>
#define BEGIN int main() { using namespace std;
#define END return 0;}
#define PRINT(x) cout << (x) << endl

BEGIN
PRINT("Hello, World!");
END
  6  Странник, 10 октября 2019 г. 17:34:00
      Про inline не знал, спасибо за разъяснение.
  7  Егоров Илья Валерьевич, 10 октября 2019 г. 17:16:01
      Макрос напрямую подставляет значение в указанную вами формулу.
Т.е. вы получаете при подстановке: (5-9>=0) ? 5-9:-5-9.
Заметьте, что в конце вы отрицаете не результат вычитания, а лишь первый член.
Поэтому при использовании макросов старайтесь использовать скобки (но лучше вообще не используйте макросы и обходитесь простыми функциями с модификатором inline).
Вот этот уже будет работать корректно: #define abs(x) ((x)>=0) ? (x):-(x)
  8  Странник, 10 октября 2019 г. 15:52:45
      Кто-нибудь мог бы объяснить, почему данная конструкция работает не корректно?
Пример: abs(5-9)
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru