2011-04-25 76 views
8

我想確保我的C++師的返回類型的理解,C++ - 劃分的類型?

int/int => return is int? 

float/float => return is which type? float? 

double /double => return is double? 

int/double => return is double? 

int/float => return is float? 

請糾正我,如果我錯了。

謝謝

回答

8

所有這些都是正確的。以下是C++ 03標準所述(§5/ 9):

許多期望算術或枚舉類型操作數的二元運算符以相似的方式導致轉換和產出結果類型。目的是產生一個共同的類型,這也是結果的類型。

  • 如果操作數是long double型的,其它應被轉換爲long double:該模式如下被稱爲通常的算術轉換,其被定義。
  • 否則,如果任一操作數是double,則另一個應轉換爲double
  • 否則,如果任一操作數是float,則另一個應轉換爲float
  • 否則,積分促銷(4.5)應在兩個操作數上執行。
  • 然後,如果任一操作數是unsigned long,則另一個應轉換爲unsigned long
  • 否則,如果一個操作數是long int和其他unsigned int,那麼如果一個long int可以表示unsigned int的所有值,則unsigned int應被轉換爲long int;否則兩個操作數都應轉換爲unsigned long int
  • 否則,如果任一操作數是long,則另一個應轉換爲long
  • 否則,如果任一操作數是unsigned,則另一個應轉換爲unsigned

[注:否則,剩下的唯一情況是,兩個操作數是int]

1

你在所有情況下都是正確的。涉及至少一個浮點類型的操作規則是,如果任一類型爲long double,則結果爲long double;否則,如果任一類型爲double,結果爲double,否則結果爲float

兩個int之間的算術運算產生一個int結果。

其他類型之間的規則稍微複雜一些,可以取決於實現;對於幾乎所有的操作,整數升級意味着操作數被提升爲至少產生一個大小爲int大小的結果的大小類型。

1

僅考慮三種類型(floatdoubleint):

  • 如果任何操作數是double,那麼結果將是double
  • 否則,如果任何操作數是float,那麼結果將是float
  • 否則結果將是int
+1

是第二顆子彈打算成爲「如果別人」?無論哪種方式,前兩個子彈的順序都是倒退的,你忘了長雙倍。 – 2011-04-25 16:43:57

+0

@Eric:尼斯點。編輯它。 – Nawaz 2011-04-25 16:45:36

0

結果將被鍵入(如果規則存在)的分配。如果你有int x = dY + iZ;然後升級會導致加法結果爲double,但是當它被賦值給x時,它將被轉換爲int。谷歌「在C++中的變量提升」瞭解更多細節。

4

operator/對於基本數據類型(就像大多數(如果不是全部的話)基本類型的運算符一樣)返回其兩個操作數中最強類型。

因此,您所有問題的答案是肯定的。


一般來說,浮點類型比整數更大幅度和unsigned比簽署強...

定義>爲「強於」,我們可以說:

長雙> double> float> unsigned long> long> unsigned int> int> unsigned short> short> unsigned char> char

+0

你確定你沒有'unsigned T'和'T'嗎? – 2011-04-25 16:54:51

+0

@克里斯答:哼,是的。 '無符號T'比'T'強。另請參閱@ildjarn回答。 – peoro 2011-04-25 16:57:38

+0

謝謝,我學到了一些東西。 +1 – 2011-04-25 16:58:44

0

粗略地說,在C++中,在任何情況下,兩個操作數都轉換爲「最大」類型操作前的兩個操作數類型是exe cuted。請參閱MSDN Standard Arithmetic Conversions