Я думаю, что этот код может работать после того, как изменение ориентации вступит в силу
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = getOrient.getOrientation();
переопределить функцию Activity.onConfigurationChanged (Configuration newConfig) и использовать newConfig, direction, если вы хотите получать уведомление о новой ориентации перед вызовом setContentView.
Условный оператор в 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
выдает ошибку: «ошибка: недопустимое 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;