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

我不明白为什么从原始代码中删除括号后会有这么大的区别?

4

4 回答 4

7

没有外括号,强制转换仅(int)适用于a
因此,你最终将一个截断的整数乘以一个普通的双精度数,然后类型推断var变成double.

使用括号,强制转换适用于乘法的结果。因此,整个结果被截断,类型推断var变成int.


因此,更改vardouble对这两个示例都没有影响。(在第二种情况下,它将截断分配int给一个double变量)

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

于 2012-10-26T14:07:04.863 回答
2

括号设置优先级

var z=(int)(a*b);//(a*b) cast to int
var z=(int)a*b;//a cast to int and myltiply with b
于 2012-10-26T14:08:00.087 回答
0

会话操作的优先级()大于乘法优先级。在第一种情况下,您有:

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

第二:

int tmp = (int)a;
double z = tmp * b;
于 2012-10-26T14:09:42.507 回答
0

在行中

var z=(int)a*b;

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

于 2012-10-26T14:10:29.610 回答