c++ - Stroustrup 计算器生成 NaN 而不是预期值

标签 c++ calculator nan

我正在学习 Stroustrup 的“编程:使用 C++ 的原理和实践”作为一个完全的初学者,使用 CodeBlocks 10.05 和 GNU GCC 编译器。我被困在调试计算器程序的练习中,因为任何数字输入最终都会是 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();
}

最佳答案

我们不得不猜测实际类型(字符串、错误)。但是,我认为您未能在所有构造函数中初始化所有类成员,这让我感到错误。试试这个:

#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();
}

关于c++ - Stroustrup 计算器生成 NaN 而不是预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9289797/

相关文章:

c++ - 配置 Visual Studio 以使用 Boost.Python 和 Python 3

C++ 对我的命令行计算器进行故障排除

objective-c - 使计算器上的加号/减号按钮起作用的方法

c++ - 函数返回-nan

python - 使用严格的填充限制填充 pandas 数据框

c++ - 将对象移动到 std::vector 时的异常保证

C++,在多个 block 中捕获用户定义的异常

c++ - 实现 C++ 到 lua 观察者模式?

二进制到标准数字?

javascript - 帮助将变量添加到自身和随机数(javascript)