Java (浮动)地板和(浮动)地板之间的差异
谁能告诉我圆括号是如何改变答案的,因为我基本上是在将Java (浮动)地板和(浮动)地板之间的差异,java,c++,casting,Java,C++,Casting,谁能告诉我圆括号是如何改变答案的,因为我基本上是在将m/f的整数值键入浮点。我不明白的是,在m/f周围添加括号是如何改变答案的。在第二种情况下: int m = 10; int f = 3; float r = (float)m/f; // gives 3.333333 as output float r = (float)(m/f); // gives 3.0 as output 您先进行整数除法,然后将其转换为浮点,因此会丢失分数。在第一种情况下,您将m强制转换为浮点,因此最终执行
m/f
的整数值键入浮点。我不明白的是,在m/f
周围添加括号是如何改变答案的。在第二种情况下:
int m = 10;
int f = 3;
float r = (float)m/f; // gives 3.333333 as output
float r = (float)(m/f); // gives 3.0 as output
您先进行整数除法,然后将其转换为浮点,因此会丢失分数。在第一种情况下,您将m
强制转换为浮点,因此最终执行浮点除法
Cub运算符既有C++又有java,但使用除法括号来对它进行评估,首先是。 在C++中,他的行为是由于C++中标准部分草案<代码> 5 > /COD>表达式第10段所包含的通常的算术转换,其中表示:
许多需要算术或枚举类型操作数的二进制运算符会导致转换并产生 结果类型以类似的方式显示。目的是生成一个公共类型,它也是结果的类型。 此模式称为常用算术转换,其定义如下: 并包括以下项目符号: -否则,如果任一操作数为浮点,则另一个操作数应转换为浮点 在Java中,此行为包含在以下内容中: 当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用: 包括: 加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数: 包括: 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float 并包括以下示例:(float)(m/f)
不同之处在于转换为float的内容。在第一种情况下,
m
转换为float
,因此整个表达式成为浮点。在第二个示例中,执行表达式(整数除法),然后转换为浮点,此时保存这些宝贵的有效数字为时已晚。在第一个示例中,m
首先被转换为浮点,然后被除法,这将为您提供一个浮点数。第二个例子,除法是一个整数除法,所以它会给你一个整数,然后转换成一个浮点数
添加括号,更改运算符的优先级。类型转换通常在除法之前应用,但使用括号可以告诉编译器在转换为浮点之前进行除法。(float)m/f
将(float)m
除以f
。因为其中一个操作数是浮点,所以运算符是浮点除法,答案是3.333等
(float)(m/f)
计算(m/f)
并将其强制转换为float。由于两个操作数都是整数,因此运算是整数除法,m/f
是3。然后将3强制转换为浮点,变成3.0。操作顺序:强制转换在除法之前应用,两个整数之间的除法在Java中总是四舍五入(向下)到最接近的整数
int i = 0;
float f = 1.0f;
// First int*float is promoted to float*float, then
()
的目的是什么?什么是关联性?括号改变了求值的顺序,这是您真正需要知道的。
float r = (float)m/f; // Is the same as ((float)m)/f, and because there's a
// float in the division, we keep everything a float.
float r = (float)(m/f); // Is division between two integers, so we round down
// to the nearest integer before casting to a float.