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

时间:2015-10-14 09:35:58

标签: c++ if-statement nested

这是有问题的节目,非常简短和甜蜜:

// 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. 如果用户输入除这些输入以外的任何内容,则会收到错误消息。

  4. 然而,当我运行这个程序时,无论我输入'n','y'还是“marshmallow”,它总是返回:

    "You do not qualify for financial aid." 
    

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

4 个答案:

答案 0 :(得分:1)

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

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

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

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

通常,分配可以在if条件下完成,但通常不建议,因为它很容易导致错误的代码。

答案 1 :(得分:0)

将第一个if语句修复为

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

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

避免这种情况的一种方法是通过设置相关标志,编译器将在这种情况下发出警告。避免它的另一种方法是编码和仔细观察。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如前所述,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,无论编译器警告配置是什么