Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save anonymous/e283dc88e55f9f441ac8b870204dc5c4 to your computer and use it in GitHub Desktop.
Save anonymous/e283dc88e55f9f441ac8b870204dc5c4 to your computer and use it in GitHub Desktop.
Правила запису операндів в операторі if

Правила запису операндів в операторі if - Основные операторы



Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. Но знаете ли вы все секреты тернарного оператора? Какие потенциальные опасности сопряжены с его использованием и какие, казалось бы не связанные с его прямым предназначением, возможности в нем таятся? Эта статья дает вам возможность проверить свои знания и, возможно, узнать что-то новое. Начнем с небольшого теста. Тест Скомпилируется ли следующий код? Какие потенциальные опасности скрываются в использовании тернарного оператора? В чем их причина? Какие неожиданные использования тернарного оператора приходят вам в голову? Его называют " conditional expression ". Ну а так как это expression , выражение, то как у каждого выражения, у него должен быть тип и value category. Собственно, ответив на вопросы какой тип и value category у тернарных операторов в каждом из первых семи вопросов теста, мы легко решим поставленные задачи. Здесь начинается самое интересное. Оказывается типом тернарного оператора будет наиболее общий тип его двух последних операндов. Что значит наиболее общий? Это легче всего пояснить на примерах. У int и short общим типом будет int. У A и B в следующем фрагменте общим типом будет также int. Вполне могут быть ситуации, когда общего типа нет. С типом тернарного оператора мы немного разобрались. Осталось решить вопрос с value category. Тут действует следующее правило: Если же нет, то lvalue. Теперь когда мы знаем то, что мы знаем, мы легко ответим на первые 7 вопросов. Преобразования типов не происходит, а lvalue вполне можно присваивать значение. Здесь происходит преобразование типов. А rvalue , как известно, нельзя присваивать. Все мы так делали не раз. В данном фрагменте из-за того, что 2ой и 3ий операнд имеют разные типы, происходит преобразование к наиболее общему типу. В данном случае int. В этом вопросе кроется еще одна особенность тернарного оператора. А именно, вычисляется только тот операнд из второго и третьего, до которого доходит поток выполнения. Соответственно, значения переменных a, b и с будут 2, 2, 1. Например, в списке инициализации конструктора. Вы не может написать так: Как известно, нельзя объявлять не инициализированную ссылку, поэтому следующий фрагмент не скомпилируется: String "dcba" ; Как нам уже известно, второй и третий операнд тернарного оператора приводятся к наиболее общему типу. В лучшем случае программа упадет при попытке в дальнейшем использовать s. В худшем будет выдавать неверные результаты, вызывая недовольство у заказчика и головную боль у программиста. А это, в свою очередь, можно использовать, например, для определения приводится ли один тип к другому. Необычным здесь, пожалуй является лишь то, что он используется не по прямому назначению, то есть не для выбора одного значения из двух в зависимости от условия. Python авторов , 1,8k публикаций. Программирование 2,9k авторов , 6,5k публикаций. Разработка мобильных приложений 1k авторов , 2,8k публикаций. Open source 1k авторов , 2,3k публикаций. Алгоритмы 1,3k авторов , 2,3k публикаций. Машинное обучение авторов , публикаций. Разработка веб-сайтов 4,1k авторов , 9,6k публикаций. Разработка под Linux авторов , публикаций. Информационная безопасность 2,4k авторов , 6,4k публикаций. Qt авторов , публикации. Яндекс открывает технологию машинного обучения CatBoost 3,8k Добавить в закладки Куликов Александр rpz карма. Слава Богу, не помню, чтобы мне попадалось такое выражение хотя саму конструкцию "?: Тот самый случай, когда лучше пару лишних IF. И овцы останутся целы. В статье приведен тот случай, когда условие нужно выкинуть: Под всеми платформами и компиляторами скомпилируется? Моя платформа Java, там подобная ересь вообще не скопмилируется: И, как мне кажется, это очень читаемо выглядит. Там как раз множественные числа в тексте так обходились. А то я тоже завис на таком извращении. А за такое в продакшене ТехДиректор по репе не настучит? Этот топик не о продакшене, а о возможностях тернарного оператора. Но в принципе, иногда надо бывает выполнить что-то подобное, обычно делается так. Заставлять компилятор размещать переменные в памяти, только ради того, чтобы не писать лишний if. И вдобавок, возможно, разрушить оптимизацию изменив значение неизвестно какой переменной. Там проблема не с тернарным оператором а с классом строки. То что тернарный оператор может работать как lvalue знал, а то что это поведение определяется общим типом — нет. Я бы еще упомянул про опасности связанные с низким приоритетом тернарного оператора, которые с успехом были раскрыты в одном из постов PVS Studio. Ну и про то, что части оператора являются точками следования, тоже стоило сказать. Интересно, почему я не могу пользоваться тегом? Может быть потому что статья про использование тернарного оператора и вместо пары 0 и 1 можно поставить 4 и 9? Часто пользуетесь в своем коде подобным? Знать это хорошо, но знание ради знания это онанизм. Вы не рассказали о самой интересной и малоизвестной фиче тернарного оператора — возможности использовать throw в нем. Приведите, пожалуйста, пример того, где это может быть оправдано. Да, этот код можно написать с if. И он, наверное, будет так понятнее. Но с моей точки зрения это нехорошая практика. Выражение должно быть однозначное. Изначальный смысл тернарного оператора — выбор значения тогда как условной конструкции — выбор ветви выполнения. Здесь же смешались в кучу кони, люди. Да, это компактнее, но стоит ли экономить на одном условии? По своей сути это ничуть не лучше, чем выражение из недавней статьи про JavaScript: В constexpr функциях, чтобы можно было ловить различные ошибки в переданных аргументах на этапе компиляции. Подробнее можно посмотреть тут: Ну и заодно, при разговоре об общих типах, не вредно упомянуть о том, что void является допустимым типом операндов. А это точно не будет генерировать код при отключенном логере? Метки лучше разделять запятой. Муда брака 12,4k Интересные публикации Хабрахабр Geektimes. Как снизить риски GT. Бот для Telegram за 48 часов на Perl или как купить кошачий корм не выходя из чата. Яндекс открывает технологию машинного обучения CatBoost. Как устроено расписание электричек. Занимательные факты о бетоне GT. Cisco Meeting Server — теперь вся видео-конференц-связь из одного места. Ночные контактные линзы для тех, кто не носит очки, но боится при этом коррекции GT. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.


Ганаш под мастику
Схемы применения асд 2ф
Инструкция if-elif-else, проверка истинности, трехместное выражение if/else
Образец о расторжении брака в украине
Телефоны похожие на айфон 6 по дизайну
Стих на день рождения на азербайджанском языке
Стих о внучке красавице
Магазины ростов на дону где можно
Распространение чужих фотографий статья
Лимфоузлы подмышками причины
Огурец зозуля f1 описание
Таблица сил по физике 7 класс
Тернарная условная операция
Как очистить диск с хр
В турции какое море средиземное
Контрольная работа теория организации
Лицензионные договоры на промышленные образцы
Характеристика принципа прочности обучения
Условный оператор ?:
Samsung galaxy ace инструкция
Правила и условия соблюдения здорового питания
Скачать талеб динамическое хеджирование на русском
Образец заявления в бухгалтерию на перечисление алиментов
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment