2011-04-25 56 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