Answers:
这是因为您使用的是的整数除法版本operator/
,需要2 int
s并返回int
。为了使用double
返回a 的版本,必须将s double
中的至少一个int
显式转换为a double
。
c = a/(double)b;
a
并b
以double
仅出于清楚,但它其实并不重要。
static_cast<>
对我来说似乎总是很长。在原语的情况下,确实没有得到任何危险static_cast<>
和reinterpret_cast<>
混合起来。
static_cast
在这种情况下,我宁愿避免使用C样式的强制转换。在这里使用C ++样式的强制类型转换没有任何好处,并且它们比C样式的强制转换更加混乱。算术强制转换恰好是C样式强制转换非常适合并且实际上比其他强制转换更合适的上下文。
double(b)
。他们并不总是意识到这是一次转换,因为它看起来与显式构造函数调用相同。
除了少数例外(我只能想到一个例外),C ++会根据表达式本身确定表达式(或子表达式)的全部含义。表达式结果的处理无关紧要。在您的情况下,表达式中a / b
没有出现double
;一切都是int
。因此,编译器使用整数除法。只有获得结果后,它才会考虑如何处理并将其转换为double
。
&funcname
取决于您将其强制转换为哪种类型。
在C ++语言中,子表达式的结果永远不会受到周围环境的影响(有一些罕见的例外)。这是该语言认真遵循的原则之一。该表达式c = a / b
包含一个独立的子表达式a / b
,该子表达式独立于该子表达式之外的任何事物进行解释。该语言并不关心您以后将结果分配给double
。a / b
是整数除法。其他没有关系。您将在语言规范的许多角落看到遵循这一原则的方法。这说明了C ++(和C)的工作方式。
我上面提到的异常的一个示例是函数重载情况下的函数指针分配/初始化
void foo(int);
void foo(double);
void (*p)(double) = &foo; // automatically selects `foo(fouble)`
在这种情况下,赋值/初始化的左侧会影响右侧的行为。(此外,对数组的引用初始化可防止数组类型衰减,这是类似行为的另一个示例。)在所有其他情况下,右侧完全忽略左侧。
从技术上讲,这是依赖于语言的,但是几乎所有语言都对该主题进行相同的处理。当表达式中两个数据类型之间的类型不匹配时,大多数语言会尝试=
根据一组预定义的规则将数据强制转换到的一侧,以匹配另一侧的数据。
将两个相同类型的数字(整数,双精度数等)相除时,结果将始终为同一类型(因此,“ int / int”将始终为int)。
在这种情况下,您需要
在计算之后double var = integer result
将整数结果转换为双精度数,在这种情况下,小数数据已经丢失。(大多数语言都会进行这种转换,以防止类型不正确,而不会引发异常或错误)。
如果您想将结果保持为两倍,则需要创建一种情况
double var = double result
最简单的方法是强制将方程式右侧的表达式强制转换为双精度:
c = a/(double)b
整数与双精度数之间的除法将导致将整数强制转换为双精度数(请注意,在进行数学运算时,编译器通常会“转换”为最特定的数据类型,以防止数据丢失)。
翻身之后,a
将结束为双打,现在您可以在两个双打之间进行划分。这将创建所需的划分和分配。
同样,请注意,这是特定于语言的(甚至可能是特定于编译器的),但是几乎所有语言(肯定是我能想到的所有语言)都以相同的方式对待此示例。