0
int main() { return !0'0.*-+!!""; }

Что возвращает данная программа и почему?

ueber
  • 55
  • 2
  • а куда собеседуетесь? – KoVadim Aug 16 '21 at 15:00
  • https://ru.stackoverflow.com/q/477156/456978 – ueber Aug 16 '21 at 15:01
  • И что, у вас какие-то мысли есть? Какая-то конкретная часть непонятна? – HolyBlackCat Aug 16 '21 at 15:03
  • @HolyBlackCat https://ru.meta.stackoverflow.com/q/11656/456978 – ueber Aug 16 '21 at 15:04
  • я сегодня чувствую уже буду третью задачу на собеседование решать. Вот интересно, уже в гугл взяли или только в майкрософт? или это я кому то помогаю туда попасть:) – KoVadim Aug 16 '21 at 15:05
  • @ueber Тот вопрос видел, с автором не согласен. – HolyBlackCat Aug 16 '21 at 15:05
  • 1
    так там другой вопрос. – KoVadim Aug 16 '21 at 15:05
  • 1
    ох, боюсь закроют вопрос... @ueber - хотите ответ - пишите куда собеседуетесь/собеседуете – KoVadim Aug 16 '21 at 16:29

1 Answers1

2

Происходит вот что:

int main() {

return static_cast<int>(!0.0) * -+static_cast<int>(!!""); }

0'0. - это число типа double, которое равно нулю. Символ ' можно использовать для разделения разрядов числа (добавлено в C++14), он игнорируется компилятором (cм. Floating point literal).

Далее, к этому числу применяется логическое отрицание, что даёт 1. Подробнее, про логическое отрицание над числом см. тут: What happens when you logical not a float?.

Далее, "" - пустая строка, к которой применяется операция двойного логического отрицания. И после приведения к int, получается 1.

Затем, выполняются унарные операции + и - для получившейся единицы, что в результате даёт -1.

Ну и наконец, выполняется произведение первой 1 и второй -1, в результате получаем всё ту же -1.

zed
  • 9,132
  • 1
    теперь точно автор вопрос не ответит – KoVadim Aug 16 '21 at 16:31
  • Рекомендую посмотреть: Как написать хороший ответ? ("Отвечайте на хорошо заданные вопросы"), и На какие темы здесь можно задавать вопросы? ("Домашние задания надо выполнять самостоятельно"). – HolyBlackCat Aug 16 '21 at 17:38
  • @HolyBlackCat если вот это был хороший вопрос: https://ru.stackoverflow.com/questions/477156 то что не так здесь? – zed Aug 16 '21 at 17:45
  • @zed Хмм. Как я понимаю: там спрашивают про ровно одну фичу языка. Готов поверить, что не очень широко известную. В случае с лямбдой, ты или знаешь что это, или не знаешь. А тут - вопрос про кучу отдельных маленьких фич. ТС мог бы хотя бы попробовать что-то сам решить. Ну хоть какими-то мыслями поделиться. – HolyBlackCat Aug 16 '21 at 18:07
  • @HolyBlackCat Нет, вопрос ровно из той же категории - написан набор бессмысленных символов (на первый взгляд), который как-то работает. И для новичка, разминировать такое выражение действительно сложно. – zed Aug 16 '21 at 18:13
  • Наш "новичок" уже собеседования проходит. :/ – HolyBlackCat Aug 16 '21 at 18:15
  • 1
    "Далее, "" - пустая строка, к которой применяется операция..." -- точнее, операция применяется к указателю (const char *) на пустую строку, а затем, получившийся тип bool приводится к int – avp Aug 16 '21 at 21:15