为什么我的第一个 "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()
总之,
如果用户输入 'n' 或 'N',他们会立即被告知他们不符合条件。
如果用户输入'y'或'Y',然后会询问他们的年收入,并据此计算出资格。
如果用户输入的不是这些输入,他们会收到一条错误消息。
然而,当我运行这个程序时,无论我输入'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
,无论编译器警告配置如何
这是有问题的程序,非常短小精悍:
// 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()
总之,
如果用户输入 'n' 或 'N',他们会立即被告知他们不符合条件。
如果用户输入'y'或'Y',然后会询问他们的年收入,并据此计算出资格。
如果用户输入的不是这些输入,他们会收到一条错误消息。
然而,当我运行这个程序时,无论我输入'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
,无论编译器警告配置如何