2014-04-30 66 views
1

这是一个学术问题,而不是我真正担心表现的问题。我只是很好奇而已。在我的编程经验中,我也学会了编译器在一半时间内只有智能。铸造值型常量

我有一个静态类,其中定义了一个常量int,我需要用另一个整数除该常量。现在,我需要从该部门返回的浮动值,所以我不能将它们都作为整数保留。

const int CONSTANTINTEGER = 69; 
int integer = 0; 
float floatValue = 0f; 

for(integer = 0; integer < CONSTANTINTEGER; integer++) { 
    float floatValue = integer/(float)CONSTANTINTEGER; 
    //use floatValue for algorithm..... 
} 

现在,我的问题:是编译器足够聪明来代替(float)CONSTANTINTEGER创造一个恒定的浮动还是它转换为浮动每一个循环的整数?

+0

看起来像它会投入每次迭代,就像在一个循环内声明一个变量似乎它会被重新创建,并且每次迭代都会超出范围。但是,老实说,我不确定 –

+2

您可以编译它,然后在ILSpy中查看已编译的程序集。如果你看IL,你会看到它在哪里演出。 – Amy

+0

@Amy:或者说,它不是*在做演员,因为它*是一个常量。它需要每次都将'integer'转换为'float',而不是'CONSTANTINTEGER'。如果您不同意,请随时添加更多细节的答案,我们可以更仔细地看。 –

回答

4

语言规范可以帮助我们在这里。部分中的C#5规范规定的7.19:

常量表达式必须是null文本或与以下类型之一的值:为sbyte,字节,短,USHORT,INT,UINT,长,ULONG,炭,float,double,decimal,bool,object,string或任何枚举类型。仅允许下列构造在常量表达式:

  • ...
  • 转换表达式,提供的目标类型是上面列出的类型之一。

...

只要表达式满足上述要求,该表达式在编译时进行评价。即使表达式是包含非常量结构的较大表达式的子表达式,情况也是如此。

您也可以通过查看IL,在这种情况下有验证此:

IL_000a: ldc.r4  69. 

时,它加载的除法运算除数。