C++ if 语句中的多个条件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9214464/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 12:29:59  来源:igfitidea点击:

Multiple conditions in C++ if statement

c++if-statement

提问by user1200066

I am very new to the concept of programming in C++. I am wanting to have a multi condition if statement using the || (or) and the && (and) in one statement. When I ask my college professor about it. She told it was possible and then insulted my limited knowledge on the subject. All examples I have access to show a multi && statement and only one showing the ||. It does not show them being used together. I would like to learn how to get the line working. I will attach the code I have. The problem area is the last bit of coding.

我对 C++ 编程的概念很陌生。我想要一个使用 || 的多条件 if 语句 (or) 和 && (and) 在一个语句中。当我问我的大学教授这件事时。她说这是可能的,然后侮辱了我对这个主题的有限知识。我有权显示多&& 语句的所有示例,只有一个显示||。它没有显示它们一起使用。我想学习如何让线路工作。我将附上我拥有的代码。问题区域是编码的最后一点。

# include <iostream>
# include <cstring>

using namespace std;

main()
{

    const int maximumHours = 774;
    char customerPackage;
    double hoursUsed = 0,
           packageA = 9.95,
           packageB = 14.95,
           packageC = 19.95,
           overPackageA = 2.00,
           overPackageB = 1.00,
           overTime = 0,
           amountDue = 0,
           excessCharged = 0;

    cout << "Please enter the customer's package: ";
    cin >> customerPackage;

    switch (customerPackage)
    {
        case 'a' :
            cout << "Please enter the number of hours used: ";
                cin >> hoursUsed;
            break;

        case 'A' :
            cout << "Please enter the number of hours used: ";
                cin >> hoursUsed;
            break;

        case 'b' :
            cout << "Please enter the number of hours used: ";
                cin >> hoursUsed;
            break;

        case 'B' :
            cout << "Please enter the number of hours used: ";
                cin >> hoursUsed;
            break;

        case 'c' :
            cout << "Please enter the number of hours used: ";
                cin >> hoursUsed;
            break;

        case 'C' :
            cout << "Please enter the number of hours used: ";
            cin >> hoursUsed;
            break;        
        default: cout << "Error." 
            << " Please enter the customer's purchased package: ";
        cin >> customerPackage;
    }    

    if ( customerPackage ='a' || customerPackage ='A' && hoursUsed >= 10)           
        amountDue = packageA;
        else
            overTime = packageA - hoursUsed;
            excessCharged = overTime * overPackageA;
            amountDue = packageA + excessCharged;
}

回答by Mark B

Your problem is that &&has higher precedence than ||so you need parens. As noted in a comment you also need to use ==instead of assignment (=):

你的问题是它的&&优先级高于||所以你需要括号。如评论中所述,您还需要使用==而不是赋值 ( =):

if ( (customerPackage =='a' || customerPackage =='A') && hoursUsed >= 10)

if ( (customerPackage =='a' || customerPackage =='A') && hoursUsed >= 10)

回答by Jerry Coffin

Others have already helped you with the problem you've noticed. I'll start with a separate problem you apparently haven't noticed (yet):

其他人已经帮助您解决了您注意到的问题。我将从一个您显然还没有注意到(还)的单独问题开始:

    else
        overTime = packageA - hoursUsed;
        excessCharged = overTime * overPackageA;
        amountDue = packageA + excessCharged;

If you want all three of those statements controlled by the else, you need to enclose them in braces to create a compound statement:

如果您希望所有这三个语句都由 控制,则else需要将它们括在大括号中以创建复合语句:

else {
    overTime = packagA - hoursUsed;
    excessCharged = overTime * overPackageA;
    amountDue = packageA + excessCharged;
}

As it stands right now, your code is really:

就目前而言,您的代码实际上是:

    else
        overTime = packageA - hoursUsed;
    excessCharged = overTime * overPackageA;
    amountDue = packageA + excessCharged;

I.e., the computations for excessChargedand amountDueare carried out regardlessof whether the condition in the ifstatement was true or false.

即,无论语句中的条件是真还是假excessChargedamountDue都执行和的计算。if

I'd also note that your switchstatement doesn't really accomplish much:

我还要指出,您的switch声明并没有真正起到多大作用:

switch (customerPackage)
{
    case 'a' :
        cout << "Please enter the number of hours used: ";
            cin >> hoursUsed;
        break;

    case 'A' :
        cout << "Please enter the number of hours used: ";
            cin >> hoursUsed;
        break;

    case 'b' :
        cout << "Please enter the number of hours used: ";
            cin >> hoursUsed;
        break;

    case 'B' :
        cout << "Please enter the number of hours used: ";
            cin >> hoursUsed;
        break;

    case 'c' :
        cout << "Please enter the number of hours used: ";
            cin >> hoursUsed;
        break;

    case 'C' :
        cout << "Please enter the number of hours used: ";
        cin >> hoursUsed;
        break;        
    default: cout << "Error." 
        << " Please enter the customer's purchased package: ";

In particular, you take exactly the same action for all the cases (except the default). You can simplify this a bit by using fall-through cases:

特别是,您对所有情况采取完全相同的操作(默认情况除外)。您可以通过使用失败案例来简化这一点:

switch (customerPackage) {
    case 'a':
    case 'A':
    case 'b':
    case 'B':
    case 'c':
    case 'C':
            cout << "Please enter the number of hours used: ";
            cin >> hoursUsed;
            break;
    default:
         cout << "Error " /* ... */;
}

Alternatively, you might consider something like:

或者,您可以考虑以下内容:

static const char valid[] = "aAbBcC";

if (strchr(valid, userPackage)) {
    cout << "Please enter the number of hours used: ";
    cin >> hoursUsed;
}
else {
    std::cout << "Error: Please enter the customer's purchased package";
    std::cin >> userPackage;
}

Personally, however, I'd structure things a bit differently: first get one valid input, then get the next:

然而,就我个人而言,我的结构有点不同:首先获得一个有效输入,然后获得下一个:

do { 
    std::cout << "Please enter the customer's purchased package (a, b, or c): ";
    std::cin >> userPackage;
} while (!strchr(valid, userPackage));

std::cout << "Please enter the number of hours used: ";
std::cin >> hoursUsed;

if (tolower(customerPackage == 'a') && hoursUsed >= 10)
// ...

回答by Rob?

if ( customerPackage ='a' || customerPackage ='A' && hoursUsed >= 10)

You are soclose to having the right answer. Let me give you two hints:

你是如此接近有正确的答案。让我给你两个提示:

  1. The =operator is not the same as the ==operator. =is the assignment operator. It evaluates its right-hand-side and stores the result in the variable named on its left-hand-side. You want ==, the equality operator. It tests to see if its right-hand side and its left-hand-side are equal.

  2. Use parenthesis ( ... )to enforce your order-of-evaluation intention. You clearly mean to say "If either customerPackage is 'a' or it is 'A', and also hoursUsed is sufficiently large, then ...".

  1. =操作是不一样的==运营商。=是赋值运算符。它评估其右侧并将结果存储在其左侧命名的变量中。你想要==,相等运算符。它测试看它的右手边和它的左手边是否相等。

  2. 使用括号( ... )来强制执行您的评估顺序意图。您显然是想说“如果 customerPackage 是 'a' 或它是 'A',并且 hoursUsed 足够大,那么......”。

Try this line:

试试这一行:

if ( (customerPackage == 'a' || customerPackage == 'A') && hoursUsed >= 10)

回答by Adam Liss

You can use parentheses to specify the order in which the boolean operators are executed. You probably want to evaluate the ||first, so you'd use:

您可以使用括号来指定布尔运算符的执行顺序。您可能想评估第||一个,因此您可以使用:

if ((customerPackage == 'a' || customerPackage == 'A') && hoursUsed >= 10) 

The &&is normally evaluated first by default, because it has higher precedence, so your code is equivalent to this:

&&通常由默认的第一个评价,因为它具有更高的优先级,让你的代码是相同的:

if (customerPackage == 'a' || (customerPackage == 'A' && hoursUsed >= 10))

Also, as noted in the comments, use ==for comparison and =for assignment.

此外,如评论中所述,==用于比较和=分配。

回答by Mr Lister

With the new problem you're having (in the other questionyou asked), you'll need some restructuring.

对于您遇到的新问题(在您提出的另一个问题中),您需要进行一些重组。

if ( (customerPackage == 'b' || customerPackage == 'B') && hoursUsed <= 20)

    amountDue = packageB;

    else
    {
        /* calculations */
    }

is not correct, that should be

不正确,应该是

if ( customerPackage == 'b' || customerPackage == 'B')
{
   if (hoursUsed <= 20)
   {
      amountDue = packageB;
   }
   else
   {
        /* calculations */
   }
}

Otherwise the first statement will only be executed when package=B AND hour=20, otherwise the calculations will be done in all other cases, like when package is A, or C.

否则第一条语句只会在 package=B AND hour=20 时执行,否则将在所有其他情况下进行计算,例如 package 是 A 或 C 时。

Hope this helps!

希望这可以帮助!