Разница между операторами "&&" и "и"

Я видел альтернативные операторы (например, and, or, not и т.д.) при просмотре cppreference.

Это альтернативы "нормальным" операторам, например &&, ||, ! и т.д.

Я рассмотрел сборку для кода, который использует && и and. Обе версии сгенерировали ту же сборку.

Код:

#include <iostream> 

int n = 1;
int main()
{
// if(n > 0 && n < 5)
   if(n > 0 and n < 5)
   {
       std::cout << "n is small and positive\n";
   }
}

Итак, мои вопросы:

  • В чем разница между операторами && и and?
  • Где и когда я использую and над &&?
  • Если нет никакой разницы, то почему С++ вводит альтернативные операторы (например, and, or, not и т.д.)?

Ответ 1

В чем разница между && и операторы?

Нет 1. "Альтернативный" аспект этих операторов означает, что их можно использовать для построения точных выражений из семантической перспективы.

Где и когда я использую & over &?

Это во многом вопрос предпочтения. Я слишком привык к &&, чтобы не использовать его, но могу понять, может ли кто-нибудь найти and более читаемый.

почему С++ вводит альтернативные операторы?

С++ был разработан, чтобы быть доступным на множестве наборов символов и платформ. Триграфы, как указал Вирсавия, являются еще одним примером такой возможности. Если набор символов не позволит записать && (скажем, потому что у него просто не было и символа), то все равно можно получить альтернативное представление. В настоящее время, во многом спорный.


<суб > 1 Собственно, после дальнейшего размышления мой ответ на ваш первый вопрос может быть уточнен. Существует небольшое отсутствие эквивалентности, относящееся к тому, как анализируются токены. && не требует пробела для разбора в виде отдельного токена, а and. Это означает:

void foo(bool b1, bool b2) {
  if(b1&&b2) { // Well formed
  }

  if(b1andb2) { // ill formed, needs spaces around `and`
 }
}

суб >

Ответ 2

and, or, not, & c. являются примерами альтернативных операторов.

Полный список см. http://en.cppreference.com/w/cpp/language/operator_alternative; вступительный абзац является смыслом:

Исходный код С++ (и C) может быть записан в любом не-ASCII 7-битном набор символов, который включает в себя набор символов ISO 646: 1983. Однако несколько операторов С++ и пунктуаторы требуют символов, которые находятся за пределами кода ISO 646: {,}, [,], #, \, ^, |, ~. Быть возможность использования кодировок символов, где некоторые или все эти символы не существует (например, немецкий DIN 66003), С++ определяет следующее альтернативы, состоящие из символов, совместимых с ISO 646.

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

Триграфы, например, явно прекращены из С++ 17. Вы можете увидеть and & c. и в будущих стандартах тоже.