false时布尔赋值为204

Dus*_* E. 2 c++

我有一个叫做Symbol代表变量的对象.符号具有布尔属性usedinitialized as false.如果要求它解决一个函数以显示它已被使用,则此条件将更改为true.出于某种原因,当Symbol未使用且used永远不会更改为true时,它返回值204而不是false.

这是SymbolTable.h,我定义了一个符号:

class SymbolTable  {
public:
    SymbolTable() {}
    void insert(string variable, double value);
    double lookUp(string variable) ;
    bool unusedVar() ;
private:
    struct Symbol  {
    Symbol(string variable, double value)
    {
        this->variable = variable;
        this->value = value;
        bool used = false;//This is my boolean flag
    }
    string variable;
    double value;
    bool used;
};
...
Run Code Online (Sandbox Code Playgroud)

每当我从SymbolTable中查找一个值插入一个等式时,我就设置used为true:

double SymbolTable::lookUp(string variable)  {
    for (int i = 0; i < elements.size(); i++) {
        if (elements[i].variable == variable) {
        elements[i].used = true;//Right here it changes to true
        return elements[i].value;
    }
...
Run Code Online (Sandbox Code Playgroud)

后来,当我试图检测是否仍然是假的时候它不会工作.当我打印used它的值打印204!

bool SymbolTable::unusedVar() {// returns error if Var is not used
int count = 0;
for (int i = 0; i < elements.size(); i++) {
    std::cout << "Variable: " << elements[i].variable << " was " << elements[i].used << std::endl;
    if ( !elements[i].used ) {
        std::cout << "Warning: A variable was not used" << std::endl;
        return true;
    }
}
return false;
}
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

leg*_*s2k 8

为什么会发生这种情况?

两个原因:

  1. SymbolTable::Symbol::used未在构造函数中初始化SymbolTable::Symbol(string, double),而是初始化局部变量.

    bool used = false;//This is my boolean flag- 行开头的bool使它成为一个新的局部变量的声明,隐藏成员变量used; 删除它将引用成员变量bool.或者,就像Hans在评论中提到的那样,替换那条线this->used = false;也会解决它.

  2. 您没有启用该std::boolalpha标志,因此仅std::cout将布尔值打印为整数; 因此,底层整数值被打印出来; 在这种情况下,它是未初始化的随机值(204).

这应该解决它:

struct Symbol {
    Symbol(string variable, double value) : variable(variable), value(value), used(false)
    {
    }
...

std::cout << "Variable: " << elements[i].variable << " was " << std::boolalpha << elements[i].used << std::endl;
Run Code Online (Sandbox Code Playgroud)

在构造函数中,我使用了初始化列表,而不是成员分配,这更好.在打印代码中,我用于std::boolalpha打印布尔值truefalse代替整数.