如果没有'&&'的语句有效?
If statement without '&&' works?
int n = 5;
if(2<=n<=20)
{
cout << "hello";
}
在上面的代码中,它没有给出错误,它运行成功并给出 "hello" 作为输出。
但是我们必须在这种等式中使用&&
。
谁能解释一下?
<=
在 C++ 中是左关联的,因此表达式被解析为 ((2 <= n) <= 20)
。 2 <= n
是bool
类型,可以隐式转换为int
:true
转换为1
,false
转换为0
.
这两个都是 <= 20
,因此条件实际上始终为真。
请注意,上面假设 n
是 int
或其他原始数字类型。如果 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
转换为 1
或 0
,下一个比较是 1 <= 20
或 0 <= 20
,这始终为真。因此输出。
2<=n<=20
将被执行为 (2<=n)<=20
.
2<=n
结果为 0
或 1
,具体取决于 n
.
的值
0<=20
和 1<=20
为真,因此 cout
将被执行,与 n
.
的值和类型无关
n
可以是具有重载运算符的 class 的对象,其中 2<=n
结果为某物(对象为 class 或值 >21
),与 <=20
相比结果为 false
。在这种情况下,将没有输出。
int n = 5;
if(2<=n<=20)
{
cout << "hello";
}
在上面的代码中,它没有给出错误,它运行成功并给出 "hello" 作为输出。
但是我们必须在这种等式中使用&&
。
谁能解释一下?
<=
在 C++ 中是左关联的,因此表达式被解析为 ((2 <= n) <= 20)
。 2 <= n
是bool
类型,可以隐式转换为int
:true
转换为1
,false
转换为0
.
这两个都是 <= 20
,因此条件实际上始终为真。
请注意,上面假设 n
是 int
或其他原始数字类型。如果 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 valuefalse
is converted to zero and the valuetrue
is converted to one.
一旦 true
转换为 1
或 0
,下一个比较是 1 <= 20
或 0 <= 20
,这始终为真。因此输出。
2<=n<=20
将被执行为 (2<=n)<=20
.
2<=n
结果为 0
或 1
,具体取决于 n
.
0<=20
和 1<=20
为真,因此 cout
将被执行,与 n
.
n
可以是具有重载运算符的 class 的对象,其中 2<=n
结果为某物(对象为 class 或值 >21
),与 <=20
相比结果为 false
。在这种情况下,将没有输出。