2013-10-17 117 views
0

在下面的代碼表達不能因爲編譯器來評估給我一個錯誤C++如何評估涉及雙數據類型模數的數學表達式?

#include <iostream> 
int main() 
{ 
    std::cout<< "Welcome\nto\n\nc++!\n"; 
    // std::cout<< "to c++ ! \n"; 
    double a=2; 
    double b=2; 
    double c=3; 
    double d=4; 
    double e=5; 
    double f=6; 
    double sum; 
    sum=(a*b%c+d/e-f); // error: invalid operand of types double and double to binary operators% 
    std::cout <<"Sum is:" << (float) sum; 
    return 0; 
} 

我知道FMOD(X,Y)函數可在雙打使用,但表達將不會留在同樣,有沒有其他的方式可以做到這一點,或者我需要自己做一個表達式求值器。如果是這樣,怎麼做?我是C++的新手請幫忙,爲什麼編譯器不夠聰明?

+0

你是什麼意思「不會保持不變」?你只需重寫它來使用'fmod()'而不是'%'; [一個是前綴符號,另一個是中綴](http://www.cs.man.ac.uk/~pjj/cs2121/fix.html)。 – DanielKO

+0

,因爲這將改變優先順序,它將在乘以'a * b'之前計算mod'fmod(b,c)',同時在BODMAS中我們從左到右移動 –

+0

通過「重寫它來使用'fmod() ''我的意思是你在保持相同意義的同時重寫。你檢查了我發佈的鏈接嗎?可以將'a + b * c + d'改寫爲'add(add(a,(mul(b,c)),d)'。不要只是推入'fmod',找出評估的順序並且適當地嵌套表達式 – DanielKO

回答

0

一個二元運算符需要兩個(二進制)參數(如函數can),所以表達式5 + 4可以用一些函數add(5, 4)輕鬆寫入。

注意您收到此錯誤信息,關鍵詞:「無效的操作數二元運算%」

所以,當你想用你想fmod(仔細檢查文檔),並決定什麼是左手和右手操作數在你的表達式中。輸出取決於您如何編寫表達式,這裏有兩種可能的方式:

fmod(a*b, c) + d/e-f這是正確的order of precedence您寫的方式。

但是,如果我們假設你想要的一切離開模量是分子,一切模的權利是分母,我們可以把它寫成這樣:

fmod(a*b, c+d/e-f)這不等同於原來的表達。

注意一些documentation這個功能,它說的參數。

在C++中,有一個小小的期望,即程序員有智慧,而不是編譯器。這樣就可以讓程序員更明確地控制代碼的行爲。

+0

隱藏OP缺乏智能並不具有建設性。另外,你的代碼('fmod(a * b,c + d/ef)')不會像原始的那樣評估表達式a * b%c + d/ef'),因爲'%'的優先級高於加法。誰現在缺乏智能? – DanielKO

+0

@DanielKO很難僅根據他們的寫作方式和內容來告訴任何人的智慧,而我試圖解決我在解釋他們時的誤解,我只在這裏回答這個問題,侮辱在哪裏請儘量明確。 – Leonardo