为什么我的第一个 "if" 语句不管输入如何执行?

Why is my first "if" statement executing regardless of input?

这是有问题的程序,非常短小精悍:

// Lab 5 Exercise 1
// Financial Aid Program
//
// Written by: Jared T. Fisher

#include <iostream>
#include <string>
using namespace std;

int main()
{
    long int _income; // declaring the variables
    char yesNo;

    cout << "Are you an undergrad student?"  ; // determining if they are an undergrad or not.
    cin >> yesNo;

    if ((yesNo = 'N') || (yesNo = 'n'))
    {
        cout << "You do not qualify for financial aid.";
    }

    else if ((yesNo = 'Y') || (yesNo = 'y'))
    {
        cout << "What is your current yearly income?";
        cin >> _income;

        if (_income <= 15000 && _income >= 0) // determining which aid they qualify for.
        {
            cout << "You qualify for 00 of financial aid";
        }
        else if (_income > 15000)
        {
            cout << "You qualify for 0 of financial aid";
        }
        else
        {
            cout << "Your income must be greater than or equal to 0. Please close the program and try again.";
        }
    }

    else
    {
        cout << "Your inputted value must be either 'y' or 'n'. Please close   the program and try again.";
    }

    cout << endl << endl;
    return 0;
} // end function main()

总之,

  1. 如果用户输入 'n' 或 'N',他们会立即被告知他们不符合条件。

  2. 如果用户输入'y'或'Y',然后会询问他们的年收入,并据此计算出资格。

  3. 如果用户输入的不是这些输入,他们会收到一条错误消息。

然而,当我运行这个程序时,无论我输入'n'、'y'还是"marshmallow",它总是returns:

"You do not qualify for financial aid." 

好像我输入了'n'或'N'。我的代码有什么问题?

将第一个 if 语句修改为

if ((yesNo == 'N') || (yesNo == 'n'))

= 是赋值运算符,而 == 是比较运算符。

避免这种情况的一种方法是通过设置相关标志,编译器将在这种情况下发出警告。避免它的另一种方法是编写代码并更仔细地查看。

您应该使用比较运算符“==”而不是赋值运算符“=”

if ((yesNo == 'N') || (yesNo == 'n'))
{
    cout << "You do not qualify for financial aid.";
}

if 语句包含赋值(yesNo = 'N' 等),如果 yesNo 非零,则计算结果为 true 并执行分支。

要更正此问题,if 应包含相等性测试 ==;

if ((yesNo == 'N') || (yesNo == 'n'))

您可能会对其他 if 语句执行相同的操作。一如既往,编译时使用最高警告级别,编译器通常会捕捉到这种情况并向您发出警告。

一般情况下可以在if条件下赋值,但一般不建议这样做,容易导致错误代码。

如前所述,if 语句无效 if ((yesNo = 'N') || (yesNo = 'n')) 而不是 if ((yesNo == 'N') || (yesNo == 'n'))

另一种防止此类错误的有用保护措施是养成使用 const 值作为 == 运算符的第一个操作数的编码习惯,即 if (('N' == yesNo) || ('n' == yesNo))

虽然这个编码规则一开始并不明显,但是比较运算符中的任何错误(这是一种相当常见的键入错误)都会导致编译器错误error: lvalue required as left operand of assignment,无论编译器警告配置如何