Stroustrup Calculator生成NaN而不是预期值

时间:2012-02-15 08:06:00

标签: c++ calculator nan

我正在使用CodeBlocks 10.05与GNU GCC编译器一起完成Stroustrup的“编程:使用C ++的原理和实践”作为一个完整的初学者。我在练习调试计算器程序时遇到困难,因为任何数字输入都会以NaN结尾。我尝试使用here找到位于this header的解决方案,并发现它产生相同的结果 - 例如,输入以下内容(;用于打印结果):

  

2.2;

产生输出:

  

= nan

运行使用Visual Studio 2010编译的相同代码生成了一个程序,该程序提供了预期的输出:

  

= 2.2

我缩减并修改了程序以使用固定输入测试计算器的primary()函数,并发现如果以下两行被注释掉,CodeBlocks会产生预期的输出;如果没有,输出是= nan。造成这种情况的原因是什么?

#include "../std_lib_facilities.h"

class Token {
    public:
    char kind;        
    double value;     
    //string name;          
    Token(char ch)    
        :kind(ch), value(0) { }
    Token(char ch, double val)     
        :kind(ch), value(val) { }
    //Token(char ch, string n) :kind(ch), name(n) { }
};


const char number='8';

double primary()
{
    Token t = Token(number,2.2);
    switch (t.kind) {

    case number:
        return t.value;
    default:
        error("primary expected");
    }
}

int main()
{
    cout<<primary();
}

2 个答案:

答案 0 :(得分:0)

我们不得不猜测实际的类型(字符串,错误)。但是,由于错误,您无法初始化所有构造函数中的所有类成员。试试这个:

#include <string>
#include <iostream>

static void error(const std::string& s)
{
    std::cerr << "Error: " << s << "\n";
    std::terminate();
}

class Token {
    public:
        char kind;        
        double value;     
        std::string name;          
        Token(char ch)    
            :kind(ch), value(0), name() { }
        Token(char ch, double val)     
            :kind(ch), value(val), name() { }
        Token(char ch, std::string n) :kind(ch), value(0), name(n) { }
};


const char number='8';

double primary()
{
    Token t = Token(number,2.2);
    switch (t.kind) {

        case number:
            return t.value;
        default:
            error("primary expected");
    }
}

int main()
{
    std::cout<<primary();
}

答案 1 :(得分:0)

这是GCC 4.4.1的一个问题。用GCC 4.6.1编译的程序产生了正确的输出。