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

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

2 ответа

Решение

Условный оператор в C++ может возвращать lvalue, тогда как 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));

Принципиальное практическое отличие состоит в том, что в C оценка?: Никогда не может привести к значению l, где, как в C++, это может.

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

В C++ также существуют более сложные правила для определения типа выражения?: На основе типов 2-го и 3-го операндов. Это отражает возможность пользовательских неявных преобразований в 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 генерирует ошибку: "ошибка: недопустимое значение в присваивании" при компиляции как C, но код компилируется без ошибок при компиляции как C++.

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

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),

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

make_zero ? z = 0 : z = 1;
Другие вопросы по тегам