Задать вопрос
Andrey2008
@Andrey2008
DevRel в PVS-Studio

Что печатает этот код?

В одном из проектов нашёл забавный фрагмент кода, содержащий ошибку. На эту ошибку обратил внимание анализатор PVS-Studio. Но я вначале ему не поверил. Мне показалось, что анализатор ошибся и уже подумал о том, чтобы запустить отладчик. Присмотрелся чуть внимательнее. А нет, действительно ошибка!

Я немного изменил код и, используя ICQ, отослал пример четырём знакомым программистам. И попросил написать, что напечатает код приведённый ниже. Все четверо дали вначале неправильные ответы.

Предлагаю попробовать, сможете ли вы дать правильный ответ. Что печатает на экране этот код?

cout << (sizeof(char *) == 8) ? "64-bit" : "32-bit";

Предлагаю проверить себя. Напишите свой ответ, а потом уже смотрите другие комментарии и правильный ответ.
  • Вопрос задан
  • 3026 просмотров
Подписаться 5 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 7
@vScherba
Если бы в обыденной жизни спросили, я бы ошибся, но т.к. сразу понятно, что тут вопрос с подковыркой удалось ответить правильно :-)
Ответ написан
Комментировать
bobermaniac
@bobermaniac
Прочитал фрагмент кода. Появилось чувство, что проблема с приоритетами. Так и вышло.
Ответ написан
Комментировать
@gribozavr
Просто используйте clang:
$ ./Debug+Asserts/bin/clang -fsyntax-only /tmp/zzz.cc
/tmp/zzz.cc:7:33: warning: operator '?:' has lower precedence than '<<'; '<<' will be evaluated first [-Wparentheses]
  cout << (sizeof(char *) == 8) ? "64-bit" : "32-bit";
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/tmp/zzz.cc:7:33: note: place parentheses around the '<<' expression to silence this warning
  cout << (sizeof(char *) == 8) ? "64-bit" : "32-bit";
                                ^
  (                            )
/tmp/zzz.cc:7:33: note: place parentheses around the '?:' expression to evaluate it first
  cout << (sizeof(char *) == 8) ? "64-bit" : "32-bit";
                                ^
          (                                          )
/tmp/zzz.cc:7:35: warning: expression result unused [-Wunused-value]
  cout << (sizeof(char *) == 8) ? "64-bit" : "32-bit";
                                  ^~~~~~~~
2 warnings generated.
Ответ написан
AxisPod
@AxisPod
Сам на собственном опыте помню, что при использовании тернарного оператора, условие и действия надо заключать в скобки, т.к. приоритет тернарного оператора ниже чем оператора ротации.
Ответ написан
Комментировать
@tbd
и ещё в обратную сторону интересно выглядит когда без скобок:
true ? std::cout : std::cerr << "????";
Ответ написан
Комментировать
Andrey2008
@Andrey2008 Автор вопроса
DevRel в PVS-Studio
Смотрю сейчас по Google.com/analytics, что достаточно много народу пошли по ссылке смотреть правильный ответ. А здесь в комментариях пусто. Видать запугал я всех статьями, что в Си++ всё не так просто… :-)

Не стесняйтесь. Забавно ведь.
Ответ написан
Комментировать
@vScherba
Напечатает то же самое, что эквивалент: cout << (sizeof(char *) == 8). Приоритет "<<" выше, чем "?:".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы