【问题标题】:I think there's a slight mistake that my C++ textbook is giving me about switch statement我认为我的 C++ 教科书给了我关于 switch 语句的一个小错误
【发布时间】:2014-04-18 03:12:13
【问题描述】:
#include <iostream>

using namespace std;

int main()
{

    int grade;
    int aCount;
    int bCount;
    int cCount;
    int dCount;
    int fCount;

    cout << "Enter the letter grades." << endl
        << "Enter the EOF character to end input." << endl;

    while ((grade = cin.get()) != EOF)
    {

        switch (grade)
        {
        case 'A':
        case 'a':
            aCount++;
            break;

        case 'B':
        case 'b':
            bCount++;
            break;

        case 'C':
        case 'c':
            cCount++;
            break;

        case 'D':
        case 'd':
            dCount++;
            break;

        case 'F':
        case 'f':
            fCount++;
            break;

        case '\n':
        case '\t':
        case ' ':
            break;

        default:
            cout << "Incorrect letter grade entered." << "Enter a new grade." << endl;
            break;
        }
    }

    cout << "\n\nNumber of students who received each letter grade:"
        << "\nA: " << aCount
        << "\nB: " << bCount
        << "\nC: " << cCount << "\nD: " << dCount << "\nF: " << fCount << endl;

    system("PAUSE");
    return 0;
}

这是我的 C++ 教科书提供的准确代码。当我通过复制这些代码然后编译来练习这些 switch 语句代码时,我的 Visual Studio 2010 express keep 给我一个错误,说“aCount is being used without assignment...”这同样适用于 fCount。该程序应从键盘读取从 A 到 F 的任何字母,然后递增识别的任何字母。我认为代码中的某处应该有 cin>>grade 但我没有找到。顺便说一句,“cin.get()”可以当cin>>grade吗??

【问题讨论】:

  • 只需将整数初始化为某个值;你可能想要0;在 C++11 中 int aCount{};,否则你可以只使用 int aCount = 0;
  • 是的,问题不在于 switch 语句。这是switch语句使用的变量缺乏初始化。这就是“......使用而不被分配”的意思。

标签: c++ visual-studio-2010


【解决方案1】:

当你声明你的变量时,试着像这样给它们赋值 0:

int grade = 0;
int aCount = 0;
int bCount = 0;
int cCount = 0;
int dCount = 0;
int fCount = 0;

这将确保您实际上在使用变量之前为其分配了一个值。

然后尝试运行它,我敢打赌它可以工作!

【讨论】:

  • 那么cin呢?
  • cin 保证会初始化grade(假设至少有一个等级),但在此之前将其初始化为 0 并没有什么坏处。
  • @Max:不,一个东西只能初始化一次。你说的是任务。
  • @LightnessRacesinOrbit:我会接受更正。我实际上是尽量不要太非正式,结果不知何故马虎了。
【解决方案2】:

建议您初始化正在使用它的变量。有些编译器甚至不会在编译前给你一个警告,而是为你的未初始化变量分配一些“垃圾值”。

在这种情况下将变量初始化为 0 就足够了(就像其他用户提到的那样)。

    int grade=0;
    int aCount=0;
    int bCount=0;
    int cCount=0;
    int dCount=0;
    int fCount=0;

对了,“cin.get()”可以当cin>>grade吗??

这取决于你想如何使用它。 cin.get 可用于提取:

  • 单个字符
  • 多个字符并将它们存储为 c 字符串(字符数组)或
  • 将它们存储到流缓冲区对象中

来自输入流。

您可能意识到cin.get 不能接受数字,所以如果您接受字符或字符串的输入,那没问题。但是以后,如果你想让它接受数字,只需使用cin &gt;&gt; number

使用 cin.get() 的示例

char cStr[50];
cin.get(cStr,5); //It will take n-1 characters
cout << cStr;

//Input: abcde
//Output: abcd

【讨论】:

  • 我不知道有任何编译器拒绝警告未初始化的变量。不过,您通常必须确保打开警告。
  • @LightnessRacesinOrbit 大多数编译器现在都会提供警告,但一些较旧的编译器,如仍在某些大学广泛使用的“Quincy”,即使您从“设置警告”,也不会为未初始化的变量提供警告。默认”为“全部”。
  • 从未听说过。如果对初学者有用的话,它似乎已经有将近十年的历史了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多