为什么 while(int) 在 int = 0 时结束?

Why does while(int) end when int = 0?

本文关键字:int 结束 while 为什么      更新时间:2023-10-16

我试图在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 声明)

  1. ...作为表达式的条件的值是 表达式,上下文转换为布尔值的语句其他 比开关;

因此,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 );
}