我正在学习 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/