int n = 5;
if (2<=n<=20)
{
cout << "hello";
}
В приведенном выше коде он не выдает ошибку, он работает успешно и выдает «привет» в качестве вывода.
Но мы должны использовать && в таком уравнении.
Кто-нибудь может это объяснить?
Re: «выдает «привет» в качестве вывода» — для определенных значений n, но не ограничиваясь значениями в диапазоне [2..20]. Попытайся.
n является целым числом.





<= является левоассоциативным в C++, поэтому выражение анализируется как ((2 <= n) <= 20). 2 <= n относится к типу bool, который может неявно преобразовываться в int: true преобразуется в 1, а false преобразуется в 0.
Оба они являются <= 20, поэтому условие эффективно всегда верно.
Обратите внимание, что вышеприведенное предполагает, что n является int или другим примитивным числовым типом. Если n является определяемым пользователем классом с перегруженным operator <=, бит ассоциативности по-прежнему остается истинным, но часть о неявных преобразованиях может применяться или не применяться в зависимости от типа возвращаемого значения и семантики этого перегруженного оператора.
Изменится ли что-нибудь, когда n станет другим примитивным типом, например double?
@Gassa Нет, но это изменится, если n будет типом класса. Ответ расширен.
@Angew: это верно для любого примитивного типа n, включая NaN с плавающей запятой.
@Bathsheba Да, NaN по-прежнему имеет числовой тип. Это не сработает для указателей.
@Angew: Хороший вопрос. Проголосуйте.
Вы, вероятно, имеете в виду
if (2 <= n && n <= 20)
C++ и группа C 2 <= n <= 20 как (2 <= n) <= 20; подвыражение равно 0 (false в C++) или 1 (true), оба из которых меньше или равны 20, следовательно, все выражение равно 1 (true). Это верно для примитивного типа без указателя Любыеn, включая NaN с плавающей запятой.
Первое сравнение 2 <= n оценивается первым. Это возвращает true, который можно преобразовать в int. Из усл.интеграл#2:
If the source type is
bool, the valuefalseis converted to zero and the valuetrueis converted to one.
Как только true преобразуется в 1 или 0, следующим сравнением будет 1 <= 20 или 0 <= 20, что всегда верно. Отсюда и выход.
Nitpick: 2 <= n тоже может быть false.
@Gassa В целом верно, но в вопросе: «[...] и выдает «привет» в качестве вывода».
Как я понимаю, это потому, что верно второе сравнение, а не первое.
Подождите, сейчас я это увидит, вы конечно правы :)
2<=n<=20 будет выполняться как (2<=n)<=20.
2<=n приводит к 0 или 1, в зависимости от значения n.
0<=20 и 1<=20 верны, поэтому cout будет выполняться независимо от значения и типа n.
n может быть объектом класса с перегруженными операторами, где 2<=n приводит к чему-то (объекту к классу или значению >21), что по сравнению с <=20 приводит к false. В этом случае выхода не будет.
независимо от типа n ? я не уверен в этом
Не подскажете, что это за
n, этоint?