Разница между операторами "&&" и "и"
Я видел альтернативные операторы (например, 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. и в будущих стандартах тоже.