kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 rlbond
rlbond
Вопрос

Различия между условными операторами в C и C++

Я где-то читал, что оператор ?: в C немного отличается от оператора в C++, что есть какой-то исходный код, который работает по-разному в обоих языках. К сожалению, я нигде не могу найти этот текст. Кто-нибудь знает, в чем заключается эта разница?

46 2009-07-04T17:41:43+00:00 2
Программирование
c++
c
conditional-operator
Решение / Ответ
 goldPseudo
goldPseudo
4-го июля 2009 в 5:55
2009-07-04T17:55:51+00:00
Дополнительно
Источник
Редактировать
#9228634

Условный оператор в C++ может возвращать l-значение, в то время как C не допускает подобной функциональности. Следовательно, в C++ законно следующее:

(true ? a : b) = 1;

Чтобы повторить это в C, вам придется прибегнуть к if/else или работать со ссылками напрямую:

*(true ? &a : &b) = 1;

Также в C++ операторы ?: и = имеют одинаковый приоритет и группируются справа налево, так что:

(true ? a = 1 : b = 2);

является корректным кодом на C++, но без круглых скобок вокруг последнего выражения вызовет ошибку на C:

(true ? a = 1 : (b = 2));
 goldPseudo
goldPseudo
Редактировал ответ 27-го января 2017 в 5:40
69
0
CB Bailey
CB Bailey
4-го июля 2009 в 5:54
2009-07-04T17:54:58+00:00
Дополнительно
Источник
Редактировать
#9228633

Основное практическое различие заключается в том, что в C оценка ?: никогда не может привести к l-значению, а в C++ может.

Есть и другие различия в его определении, которые имеют мало практических последствий. В C++ первый операнд преобразуется в bool, в C он сравнивается с 0. Это аналогично разнице в определении ==, != и т.д. между C и C++.

В C++ также существуют более сложные правила для вывода типа выражения ?: на основе типов второго и третьего операндов. Это отражает возможность определяемых пользователем неявных преобразований в C++.

Пример кода. Действительный C++; недействительный C.

extern int h(int p, int q);

int g(int x)
{
        int a = 3, b = 5;

        (x ? a : b) = 7;

        return h( a, b );
}

gcc выдает ошибку: "error: invalid lvalue in assignment" при компиляции как C, но код компилируется без ошибок при компиляции как C++.

Edit: Хотя ?: не может вернуть l-значение в Си, возможно, удивительно, что грамматика для ?: такова:

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

Это означает, что a ? b : c = d разбирается как (a ? b : c) = d, хотя (из-за правила 'не l-значения') это не может привести к корректному выражению.

C++ изменяет грамматику следующим образом:

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

Хотя расширение, позволяющее условному выражению быть l-значением в некоторых ситуациях, сделало бы a ? b : c = d допустимым без изменения грамматики, новое изменение грамматики означает, что выражение теперь допустимо, но с другим значением a ? b : (c = d).

Хотя у меня нет никаких доказательств этого, мое предположение, что поскольку изменение грамматики не могло нарушить совместимость с существующим кодом на языке Си, более вероятно, что новая грамматика будет создавать меньше сюрпризов с такими выражениями, как:

make_zero ? z = 0 : z = 1;
CB Bailey
CB Bailey
Редактировал ответ 4-го июля 2009 в 7:57
22
0
Похожие сообщества 9
pro.cxx
pro.cxx
5 992 пользователей
C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. No Ads, offtop, flood 2. Полные правила тут https://t.me/ProCxx/259155 Объявления о вакансиях,эвентах - в лс @AlexFails или @MasterZiV
Открыть telegram
supapro.cxx
supapro.cxx
5 026 пользователей
Чат для тех, кто немного знает C++, простые вопросы по C++, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат-флудилка — @fludpac /прогерские вопросы – @pro_prog 🚫flood, pron, spam; ✅УВАЖАЙТЕ ДРУГ ДРУГА!
Открыть telegram
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
1 393 пользователей
Лекции: www.youtube.com/playlist?list=PLRDzFCPr95fL_5Xvnufpwj2uYZnZBBnsr Практика: cs.mipt.ru/cpp_algo Спонсировать: www.paypal.me/tkhirianov Онлайн компилятор https://godbolt.org
Открыть telegram
Чат конференции C++ Russia
Чат конференции C++ Russia
1 205 пользователей
Канал конференции: @cpprussia_channel Ближайшая конференция — C++ Russia 2023, 11–12 мая · Online Оффлайн — 23–24 мая · Москва Билеты: https://tinyurl.com/CPPRussia2023 Саппорт: @JUGConfSupport_bot
Открыть telegram
Android NDK (C++) — русскоговорящее сообщество
Android NDK (C++) — русскоговорящее сообщество
783 пользователей
Общаемся на темы, посвященным Android-разработке на C++. Обмен новостями, опытом и наработками. + Про Android: @android_ru + Про iOS: @ios_ru + Канал Android: @pandroidtoday_ru + Вакансии: @mobile_jobs Рекомендуем отключить уведомления.
Открыть telegram
C++ для самых маленьких и отчаяных
C++ для самых маленьких и отчаяных
564 пользователей
Лоу левел (по среднему IQ участников) чатик По продвижению вакансий писать @vertver Флудилка чата - @hckcxx
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией