为什么 while(int) 在 int = 0 时结束?
Why does while(int) end when int = 0?
我试图在C++中找到一个相当于Java的in.hasNextInt的输入,我找到了这个。
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
int myint;
std::cout << "Please enter some integers (enter 0 to end):n";
do {
std::cin >> myint;
myvector.push_back (myint);
} while (myint);
std::cout << "myvector stores " << int(myvector.size()) << " numbers.n";
return 0;
}
但我真的不明白为什么输入循环会在输入为 0 时停止。它有一个while(myint)
循环,这也让我感到困惑,因为myint
是一个整数而不是布尔值。当我们为myint
输入其他内容时,它可以用作布尔值,但我认为 0 仍然被限定为整数。谁能向我解释一下?
int
将隐式转换为bool
。看这里:
值零(对于积分、浮点和无作用域 枚举)和空指针和空指针指向成员 值变为假。所有其他值都变为 true。
myint 输入其他内容时,它可以用作布尔值,但我认为 0 仍然被限定为整数。
我认为这就是你的误解所在。我们不能"为myint
输入其他东西"。它只能保存一个整数值。如果输入流无法解析整数,它不会将任何东西放入myint
,它没有什么可放的。
因此,您无法检查myint
是否包含整数或其他内容,除了整数之外,没有其他东西可以保存。因此,唯一的问题是如何测试整数的真实性。正如您已经被告知的那样,整数可以转换为布尔值。0 为假,其他任何内容均为真。这就是循环条件检查的内容。它只能检查什么。
其他人已经解释了为什么while(myint)
在myint
为0时停止,所以我想让你了解你可以做什么。
首先,您可以在operator>>
上查找返回值:
提取的值或序列不返回,而是直接存储在作为参数传递的变量中。 通过修改内部状态标志来发出错误信号
这意味着您可以使用调用std::cin.good()
来检查您的读取是否有任何问题。然后,当您给它一个不是 int(或空格,operator>>
默认忽略它)的输入时,循环停止。
do {
std::cin >> myint;
if (std::cin.good()) // Keep the last, failed read from inserting a 0
myvector.push_back(myint);
} while (std::cin.good());
希望这能给你一些可以建立的想法。
来自 C++ 17 标准(7.14 布尔转换)
1算术、无作用域枚举、指针或 指向成员的指针类型可以转换为 Bool 类型的 PR值。一个 零值、空指针值或空成员指针值为 转换为假;任何其他值都将转换为 true。对于直接- 初始化 (11.6),类型为 std::nullptr_t 的 prvalue 可以是 转换为布尔类型的 prvalue;结果值为假。
和 (9 声明)
- ...作为表达式的条件的值是 表达式,上下文转换为布尔值的语句其他 比开关;
因此,do-while 语句中的条件等效于
do {
std::cin >> myint;
myvector.push_back (myint);
} while ( myint != 0 );
如果您需要排除值0
将其推送到向量中,则应按以下方式重写循环
while ( ( std::cin >> myint ) and ( myint != 0 ) )
{
myvector.push_back( myint );
}
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 为什么 while(int) 在 int = 0 时结束?
- 无限输入C 计算器要结束计算,需要再进行一个INT
- C++ 指针上的开始/结束 (arr) - 调用 'begin(int**&)' 没有匹配函数
- 将 int 转换为罗马数字,仅在输入零时才结束
- 当一个int的读取在C++中结束时
- c++ int数组在中间以坏数据结束
- 如何在 c++ 中使用 "int promptYN(string reply)" 结束刽子手游戏
- 在<int>代码块结束之前释放分配给 std::vector 的内存的正确方法