Использование оператора & и && - PullRequest
0 голосов
/ 06 марта 2011

Тот же вопрос касается | и ||.

Для чего нужны операторы & и &&? Единственное, о чем я могу подумать, это

Побитовое окончание для базовых типов int (но не с плавающей точкой / десятичных дробей) с использованием &
логическое короткое замыкание для bool / функций, которые возвращают bool. Обычно используется оператор &&.

Я не могу вспомнить какие-либо другие случаи, когда я его использовал.
Кто-нибудь знает другое использование?

-edit- Чтобы уточнить, я спрашиваю о любом языке. Я видел, как DateTime использует «-» для возврата временного интервала, строки используют «+» для создания новых строк и т. Д. Я не помню ни одного пользовательского типа данных, использующего && и &. Поэтому я спрашиваю, для чего они (разумно) могут быть использованы? Я не знаю пример.

Ответы [ 6 ]

2 голосов
/ 06 марта 2011

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

  • && - логическое AND.Используется в логических выражениях, таких как операторы if.
  • || - логическое ИЛИ.Используется в логических выражениях, таких как if операторы.
  • & - побитовое AND.Используется для AND битов обоих операндов.
  • | - побитовое ИЛИ.Используется для OR битов обоих операндов.

Однако, они не гарантированно будут такими.Поскольку каждый язык определяет свои собственные операторы, эти строки могут быть определены как что-либо на другом языке.

Из вашего редактирования вы, похоже, используете C #.Приведенное выше описание подходит для C #: | и & также являются условными операторами (в зависимости от контекста).

Что касается того, что вы говорите о DateTime и операторе +не имеет отношения к другим операторам, которых вы упомянули, и их значению.

1 голос
/ 06 марта 2011

Если вы спрашиваете обо всех языках, тогда я не думаю, что разумно говорить о «операторе &».Маркер & может иметь всевозможные значения на разных языках, оператор и т. Д.

Например, только в C есть два различных оператора & (унарный адрес и двоичный битовый-и).Unary & в C и связанных с ним языках - единственный пример, о котором я могу сразу подумать, об использовании, с которым я столкнулся, которое соответствует вашим критериям.

Однако C ++ добавляет перегрузку операторов, чтобы они могли означать все, что выкак для пользовательских классов, и, кроме того, символ & имеет значение в объявлениях типов.В C ++ 0x маркер && имеет значение и в объявлениях типов.

Язык, аналогичный APL или J, может "разумно" использовать оператор &, чтобы означать почти все, посколькуне стоит ожидать, что код на этих языках будет иметь какое-либо сходство с языками, подобными Си.Не уверен, что один из этих двух действительно использует & или &&.

Что означает «разумно» для перегрузки бинарного оператора & в C ++ - дело вкуса -обычно это будет что-то, аналогичное побитовой &, потому что значения, представленные вашим классом, могут каким-то образом рассматриваться как последовательность битов.Однако не обязательно, если это имеет смысл в данной области.Обычно довольно «неразумно» использовать перегрузку & только потому, что & не используется.Но если ваш класс представляет собой нечто довольно сложное в математике, и вам нужен третий бинарный оператор после + и *, я полагаю, вы начнете осматриваться.Если вы хотите получить что-то с более низким приоритетом, чем +, двоичный файл & является кандидатом.Я не могу пока думать о каких-либо структурах в абстрактной алгебре, которые хотят такого, но это не значит, что их нет.

Перегрузка operator&& в C ++ умеренно антисоциальна, так какв незагруженной версии оператора коротких замыканий и в перегруженных версиях нет.Программисты C ++ привыкли писать выражения типа if (p && *p != 0), поэтому, перегружая operator&&, вы фактически возитесь с управляющей структурой.

Перегрузка унарных operator& в C ++ чрезвычайно антисоциальна.Это мешает людям брать указатели на ваши объекты.IIRC есть некоторые неловкие случаи, когда обычные реализации стандартных шаблонов требуют от своих параметров шаблона, что унарный operator& приводит к указателю (или, по крайней мере, очень похожему на указатель предмету).Это не задокументировано в требованиях к аргументу, но практически или полностью неизбежно, когда разработчик библиотеки приходит к реализации шаблона.Таким образом, перегрузка наложит ограничения на использование класса, который не может быть выведен из стандарта, и для этого должна быть очень веская причина.

[Править: что я не зналкогда я писал это, но теперь знаю, что создатели шаблонов могли обойти необходимость использовать унарный operator& с параметрами шаблона, когда стандарт не указывает, что & делает для этого типа (т.е. все они),Вы можете делать то, что делает boost::addressof:

reinterpret_cast<Foo*>(&reinterpret_cast<char&>(foo))

Стандарт не требует большого количества reinterpet_cast, но, поскольку мы говорим о стандартных шаблонах, они точно знают, что он делает вреализации, и в любом случае законно интерпретировать объект как символы.Я думаю, что это гарантированно сработает - но если нет, то реализация может гарантировать, что она действительно работает, если необходимо написать полностью соответствующие стандартные шаблоны.

Но, если ваша реализация не идет на эти длины, чтобы избежать вызоваперегружен operator&, оригинальная проблема остается.]

1 голос
/ 06 марта 2011

Поскольку ваш предыдущий вопрос об этих операторах касался C #, я предполагаю, что этот вопрос тоже.

Обычно вы хотите использовать версию условных операторов с коротким замыканием, чтобы избежать ненужных операций. Если значение первого операнда достаточно для определения результата, второй операнд не нужно оценивать.

Когда условие основано на истинности предыдущего условия, работают только операторы короткого замыкания, например, проверка нуля и сравнение свойств:

if (myObj != null && myObj.State == "active")

Использование оператора & в этом случае не помешает вычислению второго операнда и вызовет исключение нулевой ссылки.

Операторы без короткого замыкания полезны, когда вы хотите, чтобы оба операнда всегда оценивались, например, когда они имеют побочный эффект:

if (DoSomeWork() & DoOtherWork())

Использование оператора && предотвратит вызов второго метода, если первый вернул false.

& и | также являются бинарными операторами, но так как операторы || и && не являются, нет никакой двусмысленности при использовании их в качестве бинарных операторов.

0 голосов
/ 06 марта 2011

C использует & в качестве унарного оператора для любых типов данных для получения адреса данных

например:

int i = 5;
cout<<&i;//print the address of i

Некоторые языки позволяют вам переопределять такие операторы, заставляя их делать что угодно!

0 голосов
/ 06 марта 2011

Если это Javascript, тогда посмотрите на этот ответ: Использование короткого замыкания && в качестве оператора if?

Там также есть краткое обсуждение использования C #.

В Java есть еще несколько операторов, таких как | =: Что означает "| =" в Java?

0 голосов
/ 06 марта 2011

Очень общий вопрос, и я предполагаю, что вы говорите на Java, C # или другом подобном синтаксисе. В VB это эквивалент + на строках, но это другая история, которую я предполагаю.

Насколько я знаю, ваше утверждение верно, если вы говорите на языке C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...