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

If statement without '&&' works?

int n = 5;    
if(2<=n<=20) 
 {
  cout << "hello";
 }

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

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

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

这两个都是 <= 20,因此条件实际上始终为真。


请注意,上面假设 nint 或其他原始数字类型。如果 n 是用户定义的 class 且 operator <= 重载,关联性位仍然为真,但是关于隐式转换的部分可能适用也可能不适用,基于 return 该重载运算符的类型和语义。

你的意思可能是

if (2 <= n && n <= 20) 

C++ 和 C 组 2 <= n <= 20(2 <= n) <= 20;子表达式为 0(C++ 中的 false)或 1(true),它们都小于或等于 20,因此整个表达式为 1(true)。对于 any 原始非指针类型 n,包括浮点 NaN,都是如此。

第一个比较2 <= n首先被评估。此 returns true,可转换为 int。来自 conv.integral#2:

If the source type is bool, the value false is converted to zero and the value true is converted to one.

一旦 true 转换为 10,下一个比较是 1 <= 200 <= 20,这始终为真。因此输出。

2<=n<=20 将被执行为 (2<=n)<=20.

2<=n 结果为 01,具体取决于 n.

的值

0<=201<=20 为真,因此 cout 将被执行,与 n.

的值和类型无关

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