C++ 在if语句中出错的代码
当我将第二个if添加到calculateTotalCarCharge中测试汽车尺寸M,然后尝试测试c的条件时,我得到了M的答案(77.28和167.44),当我真的想要(68.73和148.92)时,它几乎就像代码不知何故进入下一个条件 试验条件C++ 在if语句中出错的代码,c++,C++,当我将第二个if添加到calculateTotalCarCharge中测试汽车尺寸M,然后尝试测试c的条件时,我得到了M的答案(77.28和167.44),当我真的想要(68.73和148.92)时,它几乎就像代码不知何故进入下一个条件 试验条件 Type - Days - Amount C - 3 - 68.73 M - 3 - 77.28 C - 7 - 148.92 M - 7 - 167.44 #包括//用于I/O #包含//用于格式化输出 #包括//用于数学 使用名称空间std;
Type - Days - Amount
C - 3 - 68.73
M - 3 - 77.28
C - 7 - 148.92
M - 7 - 167.44
#包括//用于I/O
#包含//用于格式化输出
#包括//用于数学
使用名称空间std;
//原型
char validateCarChoice();
void displayProgramDescription();
int validateEnumEntry(字符串提示);
双重计算总费用(字符大小,整数天);
//全局常数
const char COMPACT='C';
const char MID='M';
const char FULL='F';
const char SUV='S';
康斯特双紧凑型日均费用=22.91;
施工期双倍中日费用=25.76;
康斯特双倍全价日费=28.87;
const double SUV每日费用=98.88;
// --------------------------------------------------------------------------
//说明:
//输入参数:
//返回:
// ---------------------------------------------------------------------------
int main()
{
//局部常数
const string ENTER_DAYS_rendered=“输入租用天数:”;
常量字符串ENTER_MILES_DRIVEN=“输入行驶里程数:”;
//局部变量
选择字符用户类型;
煤焦粒度;
int daysRented;
双英里驱动;
双重收费;
//调用函数以显示程序描述
displayProgramDescription();
//调用函数以验证用户输入的车辆选择
UserCartypeSelected=validateCarChoice();
//如果选择的车辆类型为suv,则仅提示输入天数
//租用,如果不提示租用天数和行驶里程。
如果(UserCartypeSelected=='S')
{
daysRented=validateEnumEntry(输入租用的天数);
}
其他的
{
daysRented=validateEnumEntry(输入租用的天数);
milesDriven=validateEnumEntry(输入_MILES_DRIVEN);
}
车费=计算总车费(车号,天数);
//删除
cout正如注释中指出的,您正在中的if语句中赋值(carSize='C')和(carSize='M')
。出于兴趣,为什么不在此处的字符上选择一个开关
?看起来分支是相互排斥的,并且您没有在分支中变异carSize
?这可能有助于避免将来出现此类问题:
switch (carSize)
{
case 'C':
if (daysRented < WEEK)
...
break;
case 'M':
// ...
}
但是,您正在将未初始化的变量carSize
传递给calculateTotalCarCharge
函数:
carCharge = calculateTotalCarCharge(carSize, daysRented);
您应该将分配更改为carSize
carSize = validateCarChoice();
然后完全删除usercartypeselected
变量。要检查条件,必须使用:
if(carSize='M')
和
if(carSize='C')
因为当您使用该语句时:
switch (carSize)
{
case 'C':
if (daysRented < WEEK)
...
break;
case 'M':
// ...
}
if(carSize='M')
只将值carSize
分配给'M'
并将在if语句中执行代码。
此条件也适用于if(carSize='C')
或使用switch语句:
switch (carSize)
{
case 'C':
if (daysRented < WEEK)
...
break;
case 'M':
// ...
}
开关(carSize)
{
案例“C”:
如果(天数<周)
...
打破
案例“M”:
// ...
}
在这些与文字的比较中,一个好主意是反转操作数,如果使用单相等而不是双相等,则会引发编译器错误
if (var == 'C') // compiles, runs correctly
if (var = 'C') // compiles, runs incorrectly, results in stackoverflow question
if ('C' == var) // compiles, runs correctly
if ('C' = var) // does not compile, fix this problem immediately
也许使用两个==
会是一个更好的主意……这需要筛选大量代码,而且需要用户交互。我建议您将其简化为一个;这是一项非常有用的技能,并且很有可能您自己会发现错误。特别是if(carSize='C')
和(carSize='M'))
我已经设置了carSize='C'和carSize='M'运行计算并得到0。将其放入switch语句,计算结果为0。还有一个错误-我已经更新了答案。可以使用两个名为carSize的变量吗?一个在validateCarChoice,一个在main?因此,如果我将其传递给calculateTotalCarCharge I,我仍然可以使用usercartypeselectedn停止carSize,对吗?是的,确实如此-变量的作用域是它们在其中定义的函数/方法。好的,谢谢!今晚我将进一步查看我已将其更新为carSize='C'和carSize='M',现在计算为0
if (var == 'C') // compiles, runs correctly
if (var = 'C') // compiles, runs incorrectly, results in stackoverflow question
if ('C' == var) // compiles, runs correctly
if ('C' = var) // does not compile, fix this problem immediately