C#:(float)(x/y)和x /(float)y之间有区别吗?

lys*_*cid 2 c# floating-point casting

我想知道以下表达式是否相同(在C#中):

float x = ... ;
int y = ... ;

var result = (float) (x / y);

Versus:

var result = x / (float)y;
Run Code Online (Sandbox Code Playgroud)

我在哪里可以阅读有关此特定主题的更多信息

我感兴趣的是:

  1. 这些总会产生相同的结果吗?
  2. 一个选项的执行效率是否高于另一个选项?

Jon*_*eet 9

是的,他们的行为方式相同.事实上,你可以使用:

var result = x / y;
Run Code Online (Sandbox Code Playgroud)

要么

float result = x / y;
Run Code Online (Sandbox Code Playgroud)

C#4规范的第7.8.2节显示了哪些除法运算符是可用的 - 并且没有float operator /(float, int)运算符.取而代之的是,C#编译器使用从隐式转换intfloat,并使用float operator /(float, float)运营商.

这只是正常的操作符重载分辨率(规范部分7.3.4)和隐式数字转换(规范部分6.1.2).

如有疑问请咨询规格.我有一个网页,其中包含不同版本的链接 ; C#5规范与VS 2012捆绑在一起,但现在没有单独的下载.


Den*_*aub 7

完全没有区别.生成的IL代码完全相同:

以下是IL Disassembler为两种变体返回的内容:

// Code size       16 (0x10)
.maxstack  2
.locals init ([0] float32 x,
         [1] int32 y,
         [2] float32 result)
IL_0000:  nop
IL_0001:  ldc.r4     1.5
IL_0006:  stloc.0
IL_0007:  ldc.i4.1
IL_0008:  stloc.1
IL_0009:  ldloc.0
IL_000a:  ldloc.1
IL_000b:  conv.r4
IL_000c:  div
IL_000d:  conv.r4
IL_000e:  stloc.2
IL_000f:  ret
Run Code Online (Sandbox Code Playgroud)