未初始化的局部变量

时间:2014-06-30 03:00:52

标签: c++ variables local undefined-behavior

我收到的错误是:

  

错误c4700:使用了单元化的局部变量'aCount'

(以及bCountcCountdCountfCount)。这是C++ How to Program: Late Objects Version (7th Edition) by Deitel and Deitel我逐字复制的一个例子,不明白为什么它不起作用)请帮忙。谢谢。

编辑:谢谢大家的回复!

#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;

}

2 个答案:

答案 0 :(得分:4)

int aCount;

这可以将aCount声明为整数,您可能知道。但是,由于变量具有自动存储持续时间(与大多数非全局和非静态变量一样),因此它具有的值是未知的,并且假定它具有任何有意义值的程序是错误的。实际上,使用该值可能会导致代码中不相关的部分停止工作。这总结为undefined behaviour

现在下次你对这个变量做任何事情都在交换机中:

aCount++;

这做了一些事情:

  1. 阅读aCount的值。该计划现在立即出现问题。
  2. 增加该值。
  3. 将增加的值存储在aCount中。
  4. 即使这种情况从未发生过,您也会在输出后再次从aCount读取。这需要读取值,这再次使程序错误。所有的赌注都在这里,它可以做任何想做的事。

    其他计数也是如此。你的编译器试图通过告诉你你正在做一些危险的事情来帮助你。要修复它,请为变量赋予初始值:

    int aCount = 0;
    //etc
    

    †​​这可以有specific exceptions

答案 1 :(得分:1)

int aCount = 0;

int aCount; 
aCount = 0;

两者都有效!!