为什么无论输入如何,我的第一个 "if" 语句都会执行?

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

本文关键字:语句 if 执行 第一个 我的 输入 为什么      更新时间:2023-10-16

这就是正在讨论的程序,非常简短和甜蜜:

// 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 $1000 of financial aid";
        }
        else if (_income > 15000)
        {
            cout << "You qualify for $500 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'还是'棉花糖',它总是返回:

"You do not qualify for financial aid." 

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

if语句包含赋值(yesNo = 'N'等),并且给定yesNo非零,它的求值为true并执行分支。

为了纠正这个错误, if应该包含相等性测试== ;

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

您可能会对其他if语句执行相同的操作。与往常一样,以最高的警告级别编译,并且编译器通常会捕获并警告您这种情况。

通常,可以在if条件下进行赋值,但通常不建议这样做,因为它很容易导致错误的代码。

修复第一个if语句

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

=是赋值操作符,==是比较操作符。

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

应该使用比较运算符'=='而不是赋值运算符'='

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

如前所述,if语句无效if ((yesNo = 'N') || (yesNo = 'n'))代替if ((yesNo == 'N') || (yesNo == 'n'))

另一种防止这种类型错误的有效保护是采用将const value作为==操作符的第一个操作数的习惯,即if (('N' == yesNo) || ('n' == yesNo))

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