我编写了一个用于检查C#中的类型转换的代码。以下代码:
using System;
class Convert{
public static void Main(){
double a=14.25,b=26.12;
var z=(int)(a*b);
Console.WriteLine("z= "+z);
Console.ReadKey(true);
}
}
给出输出:
z=372
但是当我稍微修改一下代码时,我之前和修改后的z值之间的差异很大。
using System;
class Convert{
public static void Main(){
double a=14.25,b=26.12;
var z=(int)a*b; // Modified part
Console.WriteLine("z= "+z);
Console.ReadKey(true);
}
}
给出输出:
z=365.68
我不明白为什么从原始代码中删除括号后会有这么大的差异?
答案 0 :(得分:7)
如果没有外括号,(int)
演员表仅适用于a
因此,您最终将截断的整数乘以正常的double,类型推断将var
变为double
。
使用括号,强制转换应用于乘法的结果。因此,整个结果会被截断,类型推断会将var
变为int
。
因此,将var
更改为double
对任何一个示例都没有影响。 (在第二种情况下,它会将截断的int
分配给double
变量)
将var
更改为int
会将第二个示例变为编译错误。
答案 1 :(得分:2)
括号设置优先级
var z=(int)(a*b);//(a*b) cast to int
var z=(int)a*b;//a cast to int and myltiply with b
答案 2 :(得分:0)
对话操作()
的优先级大于多重优先级。
在第一种情况下,你有:
double tmp = a*b;
int z = (int)tmp;
和第二名:
int tmp = (int)a;
double z = tmp * b;
答案 3 :(得分:0)
在
行var z=(int)a*b;
a在被乘之前被转换为int。所以它将是14 * 26.12。在第二种情况下,你将a * b相乘并在之后将结果转换为int。