2012-10-26 106 views
2

我写了一个代码来检查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 

我不明白,为什么会出现从原始代码去掉括号后,如此大的差别?

回答

7

没有外括号,(int)只适用于a
因此,您最终会将正整数乘以截断整数,并且类型推断将var转换为double

使用括号,转换适用于乘法结果。因此,整个结果被截断,并且类型推断将var转换为int


因此,改变vardouble会对任一示例中没有任何影响。 (在第二种情况下,它将会分配截短intdouble变量)

更改varint会变成第二示例成编译错误。

+0

谢谢..我明白了:) – Afaq

2

括号prioryty

var z=(int)(a*b);//(a*b) cast to int 
var z=(int)a*b;//a cast to int and myltiply with b 
0

谈话操作()的优先级高于乘法的优先级设置更大。 在第一种情况下你有:

double tmp = a*b; 
int z = (int)tmp; 

和在第二:

int tmp = (int)a; 
double z = tmp * b; 
0

在线路

var z=(int)a*b; 

一个被转换成一个int被相乘之前它。所以它会是14 * 26.12。在第二种情况下,您将乘以a * b并在之后将结果转换为int。