这是有问题的节目,非常简短和甜蜜:
// 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()
总之,
如果用户输入'n'或'N',他们会立即被告知他们没有资格。
如果用户输入“y”或“Y”,则会询问他们的年收入,并计算出资格。
如果用户输入除这些输入以外的任何内容,则会收到错误消息。
然而,当我运行这个程序时,无论我输入'n','y'还是“marshmallow”,它总是返回:
"You do not qualify for financial aid."
好像我输入'n'或'N'。我的代码出了什么问题?
答案 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
,无论编译器警告配置是什么