2016-04-10 50 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的情況。這就是爲什麼你必須輸入另外兩行。

相關問題