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

Я думаю, что этот код может работать после того, как изменение ориентации вступит в силу

Display getOrient = getWindowManager().getDefaultDisplay();

int orientation = getOrient.getOrientation();

переопределить функцию Activity.onConfigurationChanged (Configuration newConfig) и использовать newConfig, direction, если вы хотите получать уведомление о новой ориентации перед вызовом setContentView.

46
задан rlbond 4 July 2009 в 17:41
поделиться

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));
69
ответ дан 26 November 2019 в 20:24
поделиться

Принципиальное практическое отличие состоит в том, что в 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 выдает ошибку: «ошибка: недопустимое lvalue в присваивании» при компиляции как 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;
22
ответ дан 26 November 2019 в 20:24
поделиться
Другие вопросы по тегам:

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