使用 std::cin 读取布尔值并输入十进制数作为输入 [duplicate] 时出现令人惊讶的结果

Surprising results when reading a bool with std::cin and entering decimal numbers as input [duplicate]

提问人:user22526026 提问时间:9/9/2023 最后编辑:Jan Schultkeuser22526026 更新时间:9/9/2023 访问量:56

问:

我正在学习变量。我了解到非零值是被考虑的,当我曾经赋值给 时,结果是 ,正如预期的那样。但是当我使用时,结果是.为什么?booltruecin2booltrue0.1false

我尝试过其他数字,例如 、.我的理解是,当绝对值为 时,结果是 ,否则。我不知道这是否正确,但如果正确,那么如何将其与“非零值为真”规则相协调?1.1-1.10.5-0.5>= 1truefalse

C++ 布尔值 visual-studio-2022 iostream cin

评论

1赞 Jesper Juhl 9/9/2023
stackoverflow.com/questions/588004/......
3赞 HolyBlackCat 9/9/2023
@JesperJuhl 这无关紧要。OP 尝试将十进制数转换为布尔值。>>
1赞 M.M 9/9/2023
该行为就像使用 a 一样,如果值为 ,则 bool 为 false,否则为 true。即小数点是输入的结尾>>long0

答:

4赞 HolyBlackCat 9/9/2023 #1

我了解到非零值被认为是真的

这仅适用于在代码中执行的转换,而不适用于 。此处介绍了如何读取标量类型。std::cin >>std::cin >>

对于 ,它读取单个值(因此,如果传递小数,它将停止读取)。如果是 ,则结果为 ,否则为 。但是,如果数字既不是也不是,它还会设置一个错误标志,您应该检查该标志:boollong.0falsetrue01

#include <iostream>

int main()
{
    bool b = false;

    if (std::cin >> b)
        std::cout << "success, b=" << b << '\n';
    else
        std::cout << "failure, b=" << b << '\n';
}

对于 和 ,这将分别打印 和。例如 或者,这将打印 。01success, b=0...=12-1failure, b=1

如果您使用 std::boolalpha,则不会发生任何操作,而是需要字符串或(如果您使用非默认语言环境,则需要其他字符串)。truefalse