如果没有'&&'语句有效?
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
是重载operator <=
的用户定义类,则关联性位仍然为真,但根据该重载运算符的返回类型和语义,有关隐式转换的部分可能适用,也可能不适用。
2<=n<=20
将作为(2<=n)<=20
执行。
2<=n
的结果是0
或1
,取决于n
的值。
0<=20
和 1<=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
转换为1
或0
,下一个比较是1 <= 20
或0 <= 20
,这总是正确的。因此输出。
相关文章:
- 为什么是0;C++中的有效语句
- 为什么别名声明不是有效的 init 语句(/simple-declaration)?
- 为什么在 C/C++ 中交织 switch/for/if 语句是有效的?
- 为什么这个复合语句作为用大括号和括号括起来的语句序列似乎不是有效的语句表达式
- C++ - 这个条件语句写得正确吗?还是有更有效的写法?
- 是什么使这个以'+'开头的字符串添加成为有效的语句?
- 有没有更有效的方法来替换这些多个 IF 语句?
- 我正在写一个非常简单的字母评分系统,if语句是最有效的吗?
- 循环try..catch ..确保输入有效或使用控制语句
- 如果没有'&&'语句有效?
- 发生错误后我可以使用ODBC语句吗(它有效吗)
- 在连接语句中访问Qt信号的"有效载荷"
- 选择在 Sqlite 数据库中有效,但插入和更新语句不起作用
- C++将向量传递给重载类——有些调用语句有效,有些则无效
- 使用函数指针剪切 if 语句会更有效
- C++ -- 如何使用开关语句和恒量获得有效的货币转换器
- 在同一if语句中检查nullptr和有效索引
- 用c++编写if-then-else语句的更有效方法
- 为什么我的第一个 if 语句有效,但我的 else if 语句在它之后不起作用
- 通过hash_map<字符串 fnPtr>调用函数指针是否比C++中的多个 if/else if/else 语句更有效或更好?