如果没有'&&'语句有效?

If statement without '&&' works?

本文关键字:有效 语句 如果没有      更新时间:2023-10-16
int n = 5;    
if(2<=n<=20) 
 {
  cout << "hello";
 }

在上面的代码中,它没有给出错误,它成功运行并给出"hello"作为输出。

但是我们必须在这种等式中使用&&
谁能解释一下?

<=

C++中是左关联的,因此表达式被解析为((2 <= n) <= 20)2 <= n 的类型是 bool 的,它可以隐式转换为 inttrue转换为 1false转换为 0

这两者都是<= 20的,所以这个条件实际上总是为真。


请注意,上述假设nint或其他原始数值类型。如果 n 是重载operator <=的用户定义类,则关联性位仍然为真,但根据该重载运算符的返回类型和语义,有关隐式转换的部分可能适用,也可能不适用。

2<=n<=20将作为(2<=n)<=20执行。

2<=n的结果是01,取决于n的值。

0<=201<=20 为 true,因此将执行cout,与n的值和类型无关。

n可以是具有重载运算符的类的对象,其中2<=n结果为某物(对象为类或值>21(,与<=20结果相比,结果为false。在这种情况下,将没有输出。

你可能的意思

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 。从 conv.integral#2:

如果源类型为 bool ,则值false将转换为零,值true将转换为 1。

一旦true转换为10,下一个比较是1 <= 200 <= 20,这总是正确的。因此输出。