我不明白以下示例之间输出是双重的根本原因。就以下而言:
为什么int除以double会导致double?
#include <stdio.h>
int main(int agrc, char **argv)
{
double d;
int a=5,b=2;
d = (double)a/b;
printf("d= %G\n",d); // outputs 2.5
d = a/(double)b;
printf("d= %G\n",d); // outputs 2.5
}
答案 0 :(得分:4)
来自C standard, section 6.3.1.8: Usual arithmetic conversions:
首先,如果任一操作数的相应实数类型为long double, 另一个操作数在不更改类型域的情况下转换为a 对应的实数类型为long double的类型。
否则,如果任一操作数的相应实数类型是double,则另一个 操作数在不更改类型域的情况下转换为其类型的类型 相应的实际类型是双倍。
否则,如果任一操作数的相应实数类型为float, 另一个操作数在不更改类型域的情况下转换为a 相应的实数类型为float的类型。
否则,将对两个操作数执行整数提升。
因此,如果算术运算符的一个操作数是int
而另一个是double
,则标准声明结果表达式的类型为double
。
答案 1 :(得分:1)
演员阵容优先于分区,double
和int
之间的操作会产生double
答案 2 :(得分:1)
由于评估中的必要性,如果某个分区的操作数之一是双数据类型,则另一个操作数会自动提升为计算方法。在您的示例中,这是因为显式强制转换的运算符优先级高于divison。
如果您只想投射除法的结果,您可以这样做:
Shopware()->Events()->notify(
'Shopware_Plugins_HttpCache_InvalidateCacheId',
array(
'cacheId' => 'a14',
)
);
确保首先执行整数除法,然后执行显式转换为double。
答案 3 :(得分:1)
对于@dbush的优秀答案的附加上下文,重要的是要注意该标准指定对于包含不同类型的所有算术类型转换,该转换是从两种类型中较小的一种到最大的:
来自 C11的汇总 - 6.3.1.8常规算术转换
:1st:如果任一操作数的实数类型是long double,另一个是 转换为长双 第二:否则如果真实类型 操作数是double,另一个是double 第三:否则 如果任一操作数的实数类型为float,则另一个操作数转换为 浮
然后继续指定如何以类似的方式进行整数促销......