在下面的代码片段中,为什么
int a = 7;
int b = 3;
double c = 0;
c = a / b;
c
的值最终为2,而不是预期的2.3333。如果a
和b
是双精度浮点数,则答案会变成2.333。但是,既然c
已经是一个双精度浮点数,那么它难道不应该可以使用整数吗?
那么为什么int/int=double
不起作用呢?
在下面的代码片段中,为什么
int a = 7;
int b = 3;
double c = 0;
c = a / b;
c
的值最终为2,而不是预期的2.3333。如果a
和b
是双精度浮点数,则答案会变成2.333。但是,既然c
已经是一个双精度浮点数,那么它难道不应该可以使用整数吗?
那么为什么int/int=double
不起作用呢?
这是因为您正在使用整数除法版本的 operator/
,它接受两个 int
并返回一个 int
。 要使用返回 double
的 double
版本中的至少一个,int
必须明确转换为 double
。
c = a/(double)b;
a
和b
都明确地转换成double
类型,但其实这并不重要。 - John Diblingstatic_cast<>
对我来说总是显得拖沓冗长。在原始数据类型的情况下,很难将static_cast<>
和reinterpret_cast<>
混淆。 - Chad La Guardiastatic_cast
,而是使用C风格的转换。在这里使用C++风格的转换没有任何好处,只会使代码变得更加混乱。算术类型的转换正是C风格转换非常适合的情境,并且比其他转换更为恰当。 - AnT stands with Russiadouble(b)
来瞒过那些反对使用 C 风格类型转换的人。他们并不总是能意识到这是一种转换,因为它看起来和一个显式构造函数调用一样。 - Steve Jessopint
强制转换为 double 可以正常工作。但是为什么呢?我对用户定义类型感到困惑。当我们重载运算符时,左变量(对象)决定调用哪个类的运算符。INT obj; obj/3;
这里 /
是针对 obj 类调用的,而不是针对 3。 - Asif Mushtaq这里是:
a) 两个 int
相除总是执行整数除法。因此,在您的情况下,a/b
的结果只能是一个 int
。
如果您想保持 a
和 b
为 int
,但又要完全除以它们,您必须将它们中的至少一个强制转换为 double: (double)a/b
或 a/(double)b
或 (double)a/(double)b
。
b) c
是一个 double
,所以它可以在赋值时接受一个 int
值:将自动将 int
转换为 double
并分配给 c
。
c) 请记住,在赋值时,等号右侧的表达式首先计算(根据规则 a 上述,而不考虑等号左侧的变量),然后赋值给等号左侧的变量(根据规则 b 上述)。我相信这完成了整个过程。
除非特别说明(我只能想到一种情况),C++会从表达式本身完全确定表达式(或子表达式)的含义。您对表达式结果的操作并不重要。
在您的情况下,表达式a/b
中没有看到任何double
;所有内容都是int
。因此,编译器使用整数除法。只有在获得结果后,它才考虑如何处理结果,并将其转换为double
。
&funcname
的值取决于你将其强制转换为哪种类型。 - Steve Jessopa / b
,它独立于该子表达式之外的任何内容进行解释。语言不关心您稍后将结果分配给double
。a / b
是整数除法。其他任何事情都无关紧要。您将看到这个原则在语言规范的许多角落中得到了遵循。这就是C++(和C)的工作方式。void foo(int);
void foo(double);
void (*p)(double) = &foo; // automatically selects `foo(fouble)`
这是一种情况,左侧的赋值/初始化会影响右侧的行为。(此外,对数组的引用初始化可以防止数组类型衰减,这是类似行为的另一个例子。)在所有其他情况下,右侧完全忽略左侧。
c
是一个double
类型的变量,但它被赋予的值是一个int
类型的数值,因为它来自两个int
类型数值的除法运算,这会产生“整数除法”(舍弃余数)。所以在代码行c=a/b
中发生了以下步骤:
a/b
,并创建一个类型为int
的临时变量。double
类型,然后赋值给c
。值得注意的是,a/b
的值是在没有考虑上下文的情况下确定的(即没有考虑它被赋值给double
类型的变量)。
/
运算符可用于整数除法或浮点除法。由于您提供了两个整数操作数,因此它执行整数除法,然后将结果存储在双精度变量中。< /p >
出于上述原因,您需要将'a'或'b'之一转换为double类型。另一种方法是使用:
double c = (a+0.0)/b;
分子被(隐式)转换为double,因为我们已经加上了一个double,即0.0。
c = static_cast<double>(a) / b;
或者你可以直接创建它:
或者使用 static_cast 进行类型转换:
c = 7.0 / 3;