c ++一个有趣的结果

时间:2016-06-30 16:46:30

标签: c++

这段代码不知何故总是加上12142的结论 例如插入12;输出为1212142,插入1 + 2;得到312142

#include "stdafx.h"
#include <iostream>

using namespace std;

class Token
{
public:
    char kind;
    double value;
};

class Token_stream
{
public:
    Token get();
    void putback(Token t);
private:
    bool full{ false };
    Token buffer;
};

void Token_stream::putback(Token t)
{
    buffer = t;
    full = true;
}
Token Token_stream::get()
{
    if (full)
    {
        full = false;
        return buffer;
    }
    char ch;
    cin >> ch;

    switch (ch)
    {
    case ';':
    case 'q':
    case '(': case ')': case '+':
    case '-': case '*': case '/':
        return Token{ ch };
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
    {
        cin.putback(ch);
        double val;
        cin >> val;
        return Token{ '8',val };
    }
    default:
        throw runtime_error("dont true token");
        break;
    }
}
Token_stream ts;

double expres();
double prim()
{
    Token t = ts.get();
    switch (t.kind)
    {
    case '(':
    {
        double d = expres();
        t = ts.get();
        if (t.kind != ')')
        {
            throw runtime_error("))))");
        }
        return d;
    }
    case '8':
        return t.value;
    default:
        throw runtime_error("perm");
    }
}
double term()
{
    double left = prim();
    Token t = ts.get();
    while (true)
    {
        switch (t.kind)
        {
        case '*':
            left *= prim();
            t = ts.get();
            break;
        case '/':
        {
            double d = prim();
            if (d == 0)
            {
                throw runtime_error("/0");
            }
            left /= d;
            t = ts.get();
            break;
        }
        default:
            ts.putback(t);
            return left;
        }
    }
}
double expres()
{
    {
        double left = term();
        Token t = ts.get();
        while (true)
        {
            switch (t.kind)
            {
            case '+':
                left += term();
                t = ts.get();
                break;
            case '-':
                left -= term();
                t = ts.get();
                break;
            default:
                ts.putback(t);
                return left;
            }
        }
    }
}
int main()
{
    double val = 0;
    while (cin)
    {
        Token t = ts.get();
        if (t.kind == 'q') break;
        if (t.kind == ';')
            cout << "=" << val << '/n';
        else
            ts.putback(t);
        val = expres();
    }
    return 0;
}

本代码摘自“编程 - 原理与实践使用C ++”一书

1 个答案:

答案 0 :(得分:8)

看这里:

if (t.kind == ';')
   cout << "=" << val << '/n';

'/n'是字符/后跟字符n,挤进了所谓的&#34;多字符文字&#34;。这些实际上是int s,具有实现定义的值;在你的系统上,显然是12142号。

您的意思是单个字符'\n'

How to draw a backslash

将来,通过构建minimal testcase来找到并解决这样的问题。在这样做的过程中,您最终会得到一个简单地说cout << '/n'并输出12142的测试程序;那时候,如果你还没有发现拼写错误,你就会有一个非常简单的事情要查找和/或询问。

相关问题