2012-12-01 59 views
14

是否一個浮點數據類型(例如double)的存在確保所有+, - ,*,/,%等數學運算假設雙操作數?是否有一個雙重提升方程中的每個整數?

如果故事比這更復雜,是否有描述這些規則的資源?我不應該問這樣的問題,並且當方程的結果是double時,總是明確地投下intdouble。以下是我正在考慮的一些等式。我故意沒有在我的系統上編譯和運行,因爲這是可能依賴於編譯器的東西。

int a(1), b(2), c(3); 
double d(4.); 
double result1 = a + b/d + c; // equal to 4 or to 4.5? 
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?  
double result3 = a/b + d; // equal to 4 or to 4.5? 
+2

考慮操作的順序。如果需要,每個操作都會促進。 – JCooper

+0

明白了,所以每個操作都有兩個操作數(大部分),如果一個是'float'而另一個是'int',那麼'int'會被提升爲float。 –

+2

@LexFridman是的,類似的東西。 – 2012-12-01 20:46:54

回答

27

我故意沒有在我的系統上編譯和運行,因爲這是可能依賴編譯器的東西。

這是不是編譯器相關。 C++明確定義了order of these operations以及它們如何轉換。

轉換髮生的方式取決於操作的順序。

double result1 = a + b/d + c; // equal to 4 or to 4.5? 

在這個例子中,分割首先發生。因爲這是一個用double分隔的int,所以編譯器通過將int轉換爲double來處理這個問題。因此,b/d的結果是雙倍的。

C++所做的下一件事是將a添加到b/d的結果中。這是一個添加到double的int,所以它將int轉換爲double並添加,導致double。 c發生同樣的事情。

double result3 = a/b + d; // equal to 4 or to 4.5? 

在本例中,首先處理除法。 ab都是整數,所以沒有轉換完成。 a/b的結果是int類型,且爲0.

然後,將結果添加到d。這是一個int加double,所以C++將int轉換爲double,結果是double。

即使該表達式中存在雙精度型,首先計算a/b,雙精度值則意味着什麼都沒有,直到執行達到雙精度值。因此,發生整數除法。

我發現促銷和轉換規則非常複雜。通常整型數字(short,int,long)被提升爲浮點數(float,double)。但事情因尺寸差異和標誌而變得複雜。

有關轉換的詳細信息,請參閱this question

8

難道一個double,促進每一個int的公式,double嗎?

不可以。只有單個操作的結果(關於優先級)。

double result1 = a + b/d + c; // equal to 4 or to 4.5? 

4.5。

double result2 = (a + b)/d + c; // equal to 3 or to 3.75? 

3.75。

double result3 = a/b + d; // equal to 4 or to 4.5? 

4.

1

一般而言,如果用二元運算的一個操作數是浮點,另一個是整數,該整數被轉換爲浮點,並且結果被浮點。

在具有多個子表達式的複合表達式中,使用您可能知道的優先規則單獨處理每個運算符。因此,在a*b + c*d,a*b被評估,並且c*d被評估,並且結果被加在一起。無論在c*da*b中都沒有影響,反之亦然。

當然,C++很複雜,用戶定義的操作符可能有其他行爲。

定義規則的權威性資源是C++標準。該標準相當大且技術性強。您可能首選首先檢查C標準。有關標準的鏈接,請參閱this answer。任何關於C或C++的好書都應該描述默認的類型轉換和表達式評估。

2

,必須考慮各運營商的優先級,你必須考慮像一個解析器:

double result1 = a + b/d + c; // equal to 4 or to 4.5? 

這就像一個+(B/d)+ C,因爲「/」經營者具有最大的precedence.Then首先這兩個操作中的哪一個並不重要,因爲浮點操作數位於中間,它「感染」了其他操作數並使其成爲雙倍,因此它是4.5。

double result2 = (a + b)/d + c; // equal to 3 or to 3.75? 

同樣在這裏,它像((A + B)/ d)+ C,所以a + b爲3,即3成爲一個浮點數因爲被提升翻一番,因爲是d的股息,這是雙倍的,所以它是0.75 + 3,即3.75。

double result3 = a/b + d; // equal to 4 or to 4.5? 

這就像(A/B)+ d,所以A/B是零,d是4,所以它的4 解析器使得優先順序所有的操作,這樣你就可以知道到底是什麼將是表達的結果。

相關問題