Stroustrup Calculator производит NaN вместо ожидаемого значения - PullRequest
3 голосов
/ 15 февраля 2012

Я работаю через "Программирование: Принципы и практика, используя C ++" Страуструпа как новичка, использующего CodeBlocks 10.05 с компилятором GNU GCC.Я застрял в упражнении по отладке калькуляторной программы, потому что любой числовой ввод заканчивался как NaN.Я попробовал его решение, расположенное здесь , с этим заголовком , и обнаружил, что оно дает тот же результат - например, введя следующее (; используется для печати результата):

2,2;

производит вывод:

= nan

Выполнение того же кода, скомпилированного с Visual Studio 2010, привело к программе, которая дает ожидаемый результат:

= 2.2

Я уменьшил и изменил программу для проверки функции primary () калькулятора с фиксированным вводом и обнаружил, что если закомментированы следующие две строкиCodeBlocks производит ожидаемый результат;если нет, то вывод = nan.Что заставляет это случиться?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2015

Это оказалось проблемой с GCC 4.4.1.Программа, скомпилированная с GCC 4.6.1, выдает правильный вывод.

0 голосов
/ 15 февраля 2012

Нам нужно угадать фактические типы (строка, ошибка).Однако мне кажется неправильным , что вам не удалось инициализировать всех членов класса во всех конструкторах.Попробуйте это:

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