2016-04-10 51 views
0

我正在试图制作一个模仿Bjarne Stroustrup的C++书籍中的代码示例的程序。这是使计算器能够解析需要评估的更长表达式的初始方法。 我不在乎运营商的优先权只是,我想了解我目前的代码所遇到的问题。那就是:为什么这个程序需要3行输入?

#include <iostream> 
using namespace std; 

int main() { 
    cout << "Expression: "; 
    int lval = 0; //left-hand value 
    int rval; // right-hand value 
    char op; 
    cin >> lval; //read leftmost operand 
    while (cin>>op) { //read operator and righ-hand operand repeatedly 
    cin >> rval; 
    switch (op) { 
    case '+': 
     lval += rval; //add: lval = lval+rval 
     break; 
    case '-': 
     lval -= rval; //subtract: lval = lval-rval 
     break; 
    case '*': 
     lval *= rval; //multiply: lval =lval*rval 
     break; 
    case '/': 
     lval /= rval; // divide: lval = lval/rval 
     break; 
    default: // not another operator: print result 
     cout << "Result: " << lval << '\n'; 
     return 0; 
    } 
    } 
return 0; 
} 

当我编译并运行程序,我总是需要添加输入的两个额外的线路,例如:

$ ./calculator 
>Expression: 1+2+3 
> 
> 
[I can keep pressing enter as many times as I wish until I type in 2 more lines] 
>l 
>l 
>Results: 6 

程序为何这样的行为?为什么cin>>op在读取\n字符时返回false?

它混淆了我,因为我复制了while(cin>>op)部分从书。

+1

你有两个问题,'CIN >> op'永远不会提取'\ N'因为空白被它抛弃,所以你必须输入的东西,这不是运营商之一,以终止您的循环。第二个问题是,即使没有找到操作符,您也总是读取右侧的操作数。这就是为什么你必须输入两行 – melak47

回答

2

因为您正在读取每个迭代的cin>>opcin>>rval,并且此读取操作将阻止,直到用户输入某个值。所以,除非你输入一些其它的值,然后按回车两个这样的行会阻塞,这解释了为什么,写作表达,不管以后你按多少时间进入它将在>> operator将无法​​读取新行字符(“\ n”)等待您输入另外两个值(第一个值开始非运算符值,以便执行默认的switch语句)以获得结果。

你可以使用cin.get()得到运营商,因为它也读出了新线和读取开关语句中RVAL为每个操作员,以避免这一点。

cout << "Expression: "; 
    int lval = 0; //left-hand value 
    int rval; // right-hand value 
    char op; 
    cin >> lval; //read leftmost operand 
    while (cin.get(op)) { //read operator and righ-hand operand repeatedly 
    switch (op) { 
    case '+': 
     cin >> rval; 
     lval += rval; //add: lval = lval+rval 
     break; 
    case '-': 
     cin >> rval; 
     lval -= rval; //subtract: lval = lval-rval 
     break; 
    case '*': 
     cin >> rval; 
     lval *= rval; //multiply: lval =lval*rval 
     break; 
    case '/': 
     cin >> rval; 
     lval /= rval; // divide: lval = lval/rval 
     break; 
    default: // not another operator: print result 
     cout << "Result: " << lval << '\n'; 
     return 0; 
    } 
    } 
+0

非常感谢你的回答,并向我展示'cin.get()'函数。 – goncalotomas

4

对于while循环的每次迭代,需要两个输入(cin >> opcin >> rval),这包括最后一个切换到default的情况。这就是为什么你必须输入另外两行。

相关问题