c++ - 你能解释一下 bool 如何控制循环吗?

标签 c++ loops while-loop boolean cin

我是 C++ 的初级程序员(目前),我有一个概念性问题。

我正在尝试过滤 cin 输入以确保它是 01-04 之间的一位或两位整数,如果不是,则产生错误并要求新的输入。

我还使用 map 为用户提供选项列表,根据有效 选择,通过多种方法中的任何一种路由输入(整数)以生成相关结果,但我会在其他地方询问这个问题的更具体版本。

我在 http://www.cplusplus.com/forum/beginner/26821/ 找到了一段代码那是为了验证输入。我有点明白,除了在 while 循环中设置 boolean 条件的地方。因为我不理解它,所以很难编辑或确保我正确地操作它。

示例代码如下:

int main()
{
    int num;
    bool valid = false;

    while (!valid)
    {
        valid = true; //Assume the cin will be an integer.

        cout << "Enter an integer value: " << endl;
        cin >> num;

        if(cin.fail()) //cin.fail() checks to see if the value in the cin
                    //stream is the correct type, if not it returns true,
                    //false otherwise.
        {
            cin.clear(); //This corrects the stream.
            cin.ignore(); //This skips the left over stream data.
            cout << "Please enter an Integer only." << endl;
            valid = false; //The cin was not an integer so try again.
        }
    }

    cout << "You entered: " << num << endl;

    system("PAUSE");
    return 0;

这是我的代码(完整的代码,以提供上下文)。我不认为它是完整的,我只是想确保我使用的是正确的 boolean 值。

float _tmain(float argc, _TCHAR* argv[])
{
    bool validInput = !true;

    map<string,int> Operations;
    Operations.insert(pair<string, int>("Addition", 01));
    Operations.insert(pair<string, int>("Subtraction", 02));
    Operations.insert(pair<string, int>("Multiplication", 03));
    Operations.insert(pair<string, int>("Division", 04));

    cout << "Welcome to OneOpCalc, what operation would you like to perform?" << endl;

    for(map<string, int>::iterator ii=Operations.begin(); ii!=Operations.end(); ++ii)
    {
        cout << (*ii).second << ": " << (*ii).first << endl;
    }

    while (!validInput)
    {
        cin >> operatorSelection;

        if (cin.fail() || operatorSelection < 4 || operatorSelection > 1)
        {
            cout << "Error: Invalid selection. Please choose a valid number." << endl << endl;
            cin.clear();
            cin.ignore();
        }
    }
}

while (!valid) 是指“当 validfalse 时”吗?在我的脑海里,它在说“虽然 valid!valid”,但显然,这永远是错误的。

编辑:感谢大家的回答,我正在仔细查看。我不断得到的一个答案过于笼统;我明白那个 !不是,我理解使用它翻转 bool 的概念。然而,隐含的逻辑含义让我感到困惑。在任何给定的语句中,我习惯于将 !valid 视为翻转 valid 值的一种方式;不测试条件。这是使用它来测试欺骗我的条件的语法。换句话说,编写 while(!valid) 对我来说是字面上的 while(NOTvalid),而不是 while(valid==false)。我无法让自己理解为什么在这种情况下,!valid 被视为一个条件,而不仅仅是位翻转。

最佳答案

循环(和 ifs)由 bool 类型的表达式控制. 在 while ( !valid ) , 表达式为 !valid , 运营商 未应用于变量的值 valid . while ( !valid )表示(字面意思)而表达 !valid (这意味着“无效”)是真的。

对于其余部分,您正在复制的代码非常糟糕。我不会 如果我是你,就以它为例。

至于你自己的代码:

  • _tmain对微软来说非常特别。你不想 用它。如果您编写控制台应用程序,只需使用 main . (同样的事情适用于 _TCHAR,而不是 char。)

  • 都不是_tmain也不main可以返回 float .返回 main 的类型应始终为 int .我不太熟悉 _tmain , 但它要么是 intvoid . (可能是 int ,如果 你在控制台模式程序中。)

  • !truefalse .总是。 (编程不同于 现实世界。没有可能。)为什么要更多 比必要的复杂?

  • 根本不需要标志变量。你 可以只写:

    cin >> 运算符选择; while (!cin || operatorSelection > 4 || operatorSelection < 1) { //...

  • 如果出现错误,您目前只会忽略一个 特点。您可能想要忽略直到并包括 行结束。 ( std::cin.ignore( std::numeric_limits<std::streamsize>::max() ); .

  • 并且您的 if 中的条件将始终为真。 (见我的 上面的版本。)你希望在哪里找到一个数字 既不小于也不大于 1?

关于c++ - 你能解释一下 bool 如何控制循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18129174/

相关文章:

python - 在 Qt C++ 应用程序中创建 python 解释器小部件的简单方法?

c++ - Qt 响应子 QWidget 中的 keyPressEvent

c++ - 在 C++ 中使用 const ArrayType 或 ConstArrayType typedef 具有 const 元素的数组

php - 如何将sql查询与php数组结合起来?

javascript - JavaScript 中循环的性能问题

c - 如何找到输入的长度

while-loop - ASP Classic,循环查询并发送电子邮件

c++ - 使用 Boost Spirit/Fusion 轻松解析带有枚举字段和 STL 容器的结构

javascript - 数组中的 indexOf 行为不正确

php - 使用 PHP 将另一个数据添加到 json 数组