如何使布尔语句中定义的变量在主程序中工作? P>好,所以我对编程和C++很陌生,我一直在尝试使用布尔语句来扩展类内赋值,从而为程序提供用户多条路径。我想知道如何获得布尔语句中定义的值,以便在较低的//处理区域之外使用

如何使布尔语句中定义的变量在主程序中工作? P>好,所以我对编程和C++很陌生,我一直在尝试使用布尔语句来扩展类内赋值,从而为程序提供用户多条路径。我想知道如何获得布尔语句中定义的值,以便在较低的//处理区域之外使用,c++,C++,问题:在利率=利率/12;问题是,Xcode告诉我变量“interestRate”在这里使用时可能未初始化 cout << "To figure out the interest rate on your deposit, please type whether your money is in a 'CD', 'Savings', 'Checking' or 'IRA' account." << endl; char CD; char Savings; char

问题:在利率=利率/12;问题是,Xcode告诉我变量“interestRate”在这里使用时可能未初始化

    cout << "To figure out the interest rate on your deposit, please type whether your money is in a 'CD', 'Savings', 'Checking' or 'IRA' account." << endl;
char CD;
char Savings;
char Checking;
char IRA;

if (cin.get (CD))
{
    interestRate = 0.01;
}
if (cin.get(Savings))
{
    interestRate = 0.01;
}
if (cin.get(Checking))
{
    interestRate = 0.08;
}
if (cin.get(IRA))
{
    interestRate = 0.08;
}

//Processing
interestRate = interestRate / 12;
time = years * 12;
amountSaved = deposit *((pow(1 + interestRate, time) - 1) / interestRate);
interestRate = (interestRate * 100) * 12;

由于interestRate没有默认值,因此会出现此警告。如果no If条件的计算结果为true,则该变量实际上未初始化。在声明变量时,尝试给它一个默认值,或者将if语句结构更改为一个处理我提到的情况的结构。这将解决警告问题。

若要直接回答您的问题,您可能已将利率定义为类似于:

double interestRate;
如果没有给定值,则像double这样的内置类型的默认值根本不会被初始化。如果您的If条件都不成立,则永远不会设置interestRate。然后在计算利率/12时使用它的值。这是不明确的行为,是不好的。编译器真的很有帮助

为了防止出现这种情况,所有可能的代码路径都需要给interestRate一个值。例如,如果您希望忽略无效输入并使用默认值,则可以初始化它,并像现在一样构造检查

这样一来,你的代码就不会像你想象的那样工作了。您似乎想要实际输入一个字符串,并根据几个选项检查其值。您现在要做的是让用户为您持有的每张支票输入一个字符,然后设置读取成功时的利率,在正常情况下,该利率应始终为单个字符

您需要的可能是单个字符串和if-else链:

std::string accountType;
if (!(std::cin >> accountType)) {
    //unsuccessful read
}

if (accountType == "CD" || accountType == "Savings") {
    interestRate = 0.01;
} else if (accountType == "Checking" || accountType == "IRA") {
    interestRate = 0.08;
} else {
    //invalid input
}

另外,从用户的角度来看,输入ira与输入ira的作用相同,因此将输入字符串转换为一个大小写可以让您仅与小写或大写字符串进行比较。

您还可以使用查找表查找利率:

struct Entry
{
  std::string account_name;
  double      interest_rate;
};

Entry Interest_Rates[] =
{
  {"CD", 0.01},
  {"Savings", 0.01},
  {"Checking", 0.08},
  {"IRA", 0.08},
};
static const unsigned int number_of_account_types =
    sizeof(Interest_Rates) / sizeof(Interest_Rates[0]);

//...
std::string account_name;
cin >> account_name;
double interest_rate = 0.0005;
for (unsigned int i = 0; i < number_of_account_types; ++i)
{
  if (account_name == Interest_Rates[i].account_name)
  {
     interest_rate = Interest_Rates[i].interest_rate;
     break;
  }
}

如果它没有被初始化,那么你的if语句就不会被触发。在此之前,您只需要一个interestRate=0。请发布可测试代码。顺便说一下,char类型只包含一个字母。您告诉用户输入CD、储蓄或支票;每封信都不止一个字母。您需要std::string来容纳多个字母。此外,在C++中搜索C++转换ToLoWar,在比较之前将文本转换为所有小写。你只需要先小心确保条目存在。@chris:你根本不需要小心。op[]将为您创建一个默认的初始化条目,如果它在请求时不存在。@LightnessRacesinOrbit,别管我了。我想检查一下,如果找不到费率,您是否真的将输入作为密钥来执行某些操作,但无论如何,您都需要进行检查,除非当用户输入不受支持的帐户类型时,默认费率为0。具有讽刺意味的是,这个被接受的答案几乎纠正了问题中的每一个问题,除了一个实际被问到的问题。我们需要一个利率声明,它需要一个初始化器来消除警告。@LightnessRacesinOrbit,我真的没有这样做来帮助未来的访问者,谢谢。我认为一般来说,对未来访问者最好的帮助是回答这个问题:P现在好多了:+1