我正在使用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();
}
答案 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编译的程序产生了正确的输出。