或者操作员不工作

时间:2013-10-30 18:18:34

标签: c++ or-operator

当我进入开始然后程序输出else功能,即使我符合标准,我已尝试使用&&同样,它仍然无法正常工作。任何答案都将不胜感激。

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

int main ()
{
    float timer;
    bool end;
    std::string input;

    end = false;

    cout << "Enter start then a number to count down from" << ".\n";

    while (end == false){
        cin >> input;

        if (input.find("end" || "End") != std::string::npos)
        end = true;

        else if (input.find("start" || "restart" || "Start" || "Restart") != std::string::npos)
        {
            cin >> timer;

            while (timer>0){
                timer -= 0.1;

                Sleep(100);

                cout << timer << ".\n";
            }

            cout << "Finished! Enter restart then another number to perform another countdown, or enter end to close the program" << ".\n";
        }

        else
        cout << "Enter start" << ".\n";
    }

    return 0;
}

8 个答案:

答案 0 :(得分:4)

替换

if (input.find("end" || "End") != std::string::npos)

使用:

if (input.find("end") != std::string::npos || input.find("End") != std::string::npos)

与您的其他if类似。

你的表达意味着什么似乎很明显,但是当你把它分解时它真的没有意义。 find需要一个字符串,"end" || "End"不是字符串。

答案 1 :(得分:2)

逻辑或运算符,||仅适用于布尔表达式。

例如,如果你有

bool A = true
bool B = false
bool C = A||B;  

比您将bool C设置为True。它只需要2个布尔值,如果其中任何一个布尔值为真,则返回true。这都是合乎逻辑的或确实如此。

您可能想尝试类似

的内容
if (input.find("end") != std::string::npos || input.find("End") != std::string::npos)

答案 2 :(得分:1)

||仅适用于逻辑布尔表达式。

从标准(重点是我的):

  

5.15逻辑OR运算符[expr.log.or]

     

||运算符组从左到右。 操作数在上下文中都转换为bool (第4条)。如果其任一操作数为true,则返回true,否则返回false

因此在input.find("end" || "End")中,它会尝试将"end""End"转换为bool。运营商||也会返回bool


这里要解决您需要更换的问题:

if (input.find("end" || "End") != std::string::npos)

通过

if ( input.find("End") != std::string::npos ||
     input.find("End") != std::string::npos )

并在第二个find中执行相同操作。

答案 3 :(得分:1)

C ++根本不起作用。当你写

input.find("end" || "End") != std::string::npos

编译器会看到逻辑或两个非空的const char指针,这会产生布尔值true。然后将其解释为char,其值为1'\1'),然后在字符串中搜索 - 当然不是您的意图。如果您想知道string是否在一组字符串中,您可以使用:

static std::set<std::string> s = { "end", "End" };
s.find( input ) != s.end();

虽然可能不是世界上最有效的代码,但是使用C ++ 11编译器,你也可以将它压缩成一行,如下所示:

if( std::set<std::string>{ "end", "End" }.count( input ) ) {
    // found...
}

答案 4 :(得分:0)

 if (input.find("end" || "End") != std::string::npos)
 //             ^^^^^^^^^^^^^^

此处未正确使用||运算符。右边的表达式将返回true,因为它不为零,然后返回它。所以声明解析为input.find("end")。您需要在那里使用两个单独的条件语句:

 if (input.find("end") != std::string::npos ||
     input.find("End") != std::string::npos)

答案 5 :(得分:0)

我建议使用正则表达式来代替这样的事情: regex

答案 6 :(得分:0)

函数调用的参数

input.find("end" || "End") 

具有bool类型,表示字符串文字“end”或/和字符串文字“End”的地址的addess不等于零。很明显,两个字符串文字都有不等于零的地址。所以这个电话相当于

input.find(true) 

编译器找到一个最适合此参数的重载函数find。这个功能是

find(charT,c,size_tipe pos = 0);

值true被隐式转换为值charT(1),函数尝试在字符串中查找值为1的char。

答案 7 :(得分:0)

有一个解决方法:

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

int main()
{
    float timer;
    bool end;
    std::string input;

    end = false;

    cout << "Enter start then a number to count down from" << ".\n";

    while (end == false) {
        cin >> input;

        if (input.find("end") != std::string::npos | input.find("End") != std::string::npos)
            end = true;

        else if (input.find("start") != std::string::npos | input.find("Start") != std::string::npos | input.find("restart") != std::string::npos | input.find("Restart") != std::string::npos)
        {
            cin >> timer;

            while (timer > 0) {
                timer -= 0.1;

                Sleep(100);

                cout << timer << ".\n";
            }

            cout << "Finished! Enter restart then another number to perform another countdown, or enter end to close the program" << ".\n";
        }

        else
            cout << "Enter start" << ".\n";
    }

    return 0;
}

应该像这样的if (input.find("end") != std::string::npos | input.find("End")!= std::string::nposif (input.find("end") != std::string::npos || input.find("End")!= std::string::npos而不是if (input.find("end" || "End") != std::string::npos)一样,您可以使用逻辑或按位或。