Я где-то читал, что оператор ?:
в C немного отличается от C++, что есть некоторый исходный код, который работает по-разному на обоих языках. К сожалению, я не могу найти текст нигде. Кто-нибудь знает, в чем состоит эта разница?Условные различия операторов между C и C++
ответ
Условный оператор на C++ может возвращать значение lvalue, тогда как C не позволяет использовать аналогичные функции.Таким образом, следующее является легальным в C++:
(true ? a : b) = 1;
Чтобы повторить это в C, вам придется прибегнуть к, если/иначе, или иметь дело со ссылками непосредственно:
*(true ? &a : &b) = 1;
Кроме того, в C++, ?:
и =
операторы equal precedence and group right-to-left, такие, что:
(true ? a = 1 : b = 2);
действует C++ код, но будет выдавать ошибку в C без скобок вокруг последнего ехр ression:
(true ? a = 1 : (b = 2));
Основное практическое отличие состоит в том, что в C оценка?: Никогда не может привести к l-значению, где, как и в C++, оно может.
Существуют и другие отличия в его определении, которые имеют мало практических последствий. В C++ первый операнд преобразуется в bool, в C он сравнивается с 0. Это аналогично различию в определении ==,! = И т. Д. Между C и C++.
В C++ существуют более сложные правила для вывода типа выражения?: На основе типов 2-го и 3-го операндов. Это отражает возможность пользовательских неявных преобразований в 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, может быть удивительно грамматику для: это:
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
Это означает, что a ? b : c = d
разбирает, как (a ? b : c) = d
, даже если (из-за к правилу 'не l-value') это не может привести к действительному выражению.
C++ изменяет грамматику следующим образом:
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
В то время как расширение, чтобы условное выражение, чтобы быть л-значением в некоторых ситуациях сделали бы a ? b : c = d
действительные без изменения грамматики, новые средства изменений грамматики что выражение теперь действует, но с другим значением a ? b : (c = d)
.
Хотя у меня нет никаких доказательств этого, мое предположение о том, что, поскольку изменение грамматики не могло нарушить совместимость с существующим C-кодом, более вероятно, что новая грамматика создаст меньше сюрпризов с такими выражениями, как:
make_zero ? z = 0 : z = 1;
Неправильная часть ответа, описывающая C-анализ. В грамматике C LHS оператора '=' не может содержать оператор, не заключенный в круглые скобки '?:'. Предлагаемый '(a? B: c) = d' -разбор невозможен. В грамматике C 'a? b: выражение c = d' вообще не разбирается. Любой компилятор, который интерпретирует его как '(a? B: c) = d', делает это на свой страх и риск. (Как правило, это происходит в гибридных компиляторах C/C++, которые пытаются унифицировать грамматику C и C++ под капотом.) Формально в этом нет проблем, так как недопустимый код по-прежнему отклоняется. Но сообщение «не lvalue» вводит в заблуждение. – AnT
В C, 'a? b: c = d' - просто синтаксическая тарабарщина, некорректная последовательность токенов. Это не выражение. Утверждение, что он присваивает значение non-lvalue, неверно, так как здесь нет «присвоения». – AnT
- 1. Различия между '' и '' C
- 2. Каковы различия между препроцессорами C и C++?
- 3. Различия между классами в C и C++
- 4. Различия между struct в C и C++
- 5. Различия между C# «var» и C++ «auto»
- 6. Различия между C++ 03 и C++ 14
- 7. Различия между компиляторами C++
- 8. Различия между Java и C# и .NET
- 9. Различия между Pthread в C vs C++
- 10. Различия между scanf и getchar в C
- 11. Различия между Python и C++ Конструкторы
- 12. C: Различия между strchr() и index()
- 13. Различия между C++ OOP и PHP OOP
- 14. Различия LdapConnection между JAVA и C#
- 15. Rijndael различия между C# и Java
- 16. Различия между VS2013 и Ubuntu C++
- 17. Различия между объектной моделью C++ и Java
- 18. Различия в производительности между Python и C
- 19. C: различия между указателем полукокса и массивом
- 20. Различия между регулярными выражениями C# и JavaScript?
- 21. Различия между C# асинхронном и Java ExecutorService
- 22. Различия между стандартным C и современных компиляторов
- 23. Побитовые операторы - различия между C++ и Java
- 24. Различия между кодом и отдельным классом C#
- 25. различия между StringBuilder в Java и C#
- 26. Различия между указателями и переменными в C?
- 27. C# Различия между Результатом и Продолжением С
- 28. Сериализация - различия между C++ и Java
- 29. C# Различия между двумя списками
- 30. C# найти различия между изображениями
В C вы могли бы написать * (true? & A: & b) = 1 вместо – finnw
@finnw: полезно. обновил мой ответ соответственно. – goldPseudo
Второе отличие заключается не в порядке операций, а в отношении приоритета оператора. – Barmar