2

假设我有一个依赖于两个单独输入的 while 循环。在情况一中,while 循环将采用值 1,而在情况二中,它应该采用 !cin.eof()。有没有办法可以有效地做到这一点?为了更简洁:

string hello;
cin >> hello;

if(hello == "one")
{
    //make the while loop depend on value 1
}
else if(hello == "two")
{
    //make the while loop depend on value !cin.eof()
}

while(/*depends on above conditional*/)
{}

我不想做类似的事情:

if(hello == "one)
{
     while(1){}
}
else if(hello == "two")
{
     while(!cin.eof){}
}

因为 while 循环在每种情况下基本上都做同样的事情。

4

6 回答 6

3

为了可读性和凝聚力,我认为您应该将循环的内容移动到一个单独的函数中:

void DoSomething() { /* ... */ }

// ...
if(hello == "one)
{
    while(1){ DoSomething(); }
}
else if(hello == "two")
{
    while(!cin.eof){ DoSomething(); }
}

更容易看出不同的while循环在做同样的事情,但它们的条件不同。

于 2013-03-27T21:15:36.320 回答
2

只需使用 or ( ||) 作为 while 循环中的条件。设置第一个条件if(hello == "one")。现在你有一个 while 循环,如果其中一个条件是true.

bool value = hello == "one";
while (value || !cin.eof) {}
于 2013-03-27T20:38:51.457 回答
2

我相信你正在寻找这样的东西:

while((hello == "one") || (hello == "two" && !cin.eof)) {
}

这段代码会做你想做的,因为它检查'是变量“一”吗?如果是这样,请继续执行。如果不是,它会检查:变量是“二”吗?如果是这样,它将检查cin.eof.

如果两者都不是,则循环不会执行。(&& 1省略第一个条件,因为它总是“真”,等于和无限循环)

编辑:

为了简化事情,您可能需要考虑此代码(如评论中所建议):

bool HelloIsOne = (strcmp(hello, "one") == 0);
bool HelloIsTwo = (strcmp(hello, "two") == 0);

while(HelloIsOne || HelloIsTwo && !cin.eof) {
}

我在上一个示例中放置的括号实际上是不必要的,因为&&绑定比 强||,但它们有助于代码的总体清晰度。

于 2013-03-27T20:38:57.520 回答
0

如果您使用的是 C++11:

#include <functional>

auto check = (hello == "one") ? []() bool -> { return 1; } :
                                []() bool -> { return !cin.eof(); };
while(check) {
};
于 2013-03-27T21:10:10.237 回答
0

这个怎么样:

    switch(hello)
    {
        case 'one':
        {
            for(; 1; );
            {
            // your loop here
            }
            break;
        }
        case 'two':
        {
            for(;!cin.eof; )
            {
            // your other loop here
            }
            break;
        }
        default:
        {
            cout << " shouldnt get here unless bad user input" << endl;
            break;
        }
    }
于 2013-03-27T22:44:52.873 回答
-1

你可以这样做:

#include <iostream>
#include <string>

using namespace std;
int main()
{
    string hello;
    cin >> hello;
    while(hello=="one"?1:(!cin.eof()))
    {
        //do stuff
    }
    return 0;
}

它检查字符串hello是否为“one”,如果为真,while则为 is的条件1,否则!cin.eof()为您想要的。

于 2013-03-27T20:42:08.303 回答