Hat ^ 运算符 vs Math.Pow()
Hat ^ operator vs Math.Pow()
仔细阅读了 ^ (hat) operator and the Math.Pow() 函数的 MSDN 文档,我没有发现明显的区别。有吗?
很明显,一个是函数,另一个被认为是运算符,例如这行不通:
Public Const x As Double = 3
Public Const y As Double = Math.Pow(2, x) ' Fails because of const-ness
但这将:
Public Const x As Double = 3
Public Const y As Double = 2^x
但是它们产生最终结果的方式有区别吗?例如,Math.Pow()
会做更多的安全检查吗?或者一个只是另一个的别名?
找出答案的一种方法是检查 IL。对于:
Dim x As Double = 3
Dim y As Double = Math.Pow(2, x)
IL 是:
IL_0000: nop
IL_0001: ldc.r8 00 00 00 00 00 00 08 40
IL_000A: stloc.0 // x
IL_000B: ldc.r8 00 00 00 00 00 00 00 40
IL_0014: ldloc.0 // x
IL_0015: call System.Math.Pow
IL_001A: stloc.1 // y
还有:
Dim x As Double = 3
Dim y As Double = 2 ^ x
IL 也是:
IL_0000: nop
IL_0001: ldc.r8 00 00 00 00 00 00 08 40
IL_000A: stloc.0 // x
IL_000B: ldc.r8 00 00 00 00 00 00 00 40
IL_0014: ldloc.0 // x
IL_0015: call System.Math.Pow
IL_001A: stloc.1 // y
IE 编译器已将 ^
转换为对 Math.Pow
的调用 - 它们在运行时是相同的。
仔细阅读了 ^ (hat) operator and the Math.Pow() 函数的 MSDN 文档,我没有发现明显的区别。有吗?
很明显,一个是函数,另一个被认为是运算符,例如这行不通:
Public Const x As Double = 3
Public Const y As Double = Math.Pow(2, x) ' Fails because of const-ness
但这将:
Public Const x As Double = 3
Public Const y As Double = 2^x
但是它们产生最终结果的方式有区别吗?例如,Math.Pow()
会做更多的安全检查吗?或者一个只是另一个的别名?
找出答案的一种方法是检查 IL。对于:
Dim x As Double = 3
Dim y As Double = Math.Pow(2, x)
IL 是:
IL_0000: nop
IL_0001: ldc.r8 00 00 00 00 00 00 08 40
IL_000A: stloc.0 // x
IL_000B: ldc.r8 00 00 00 00 00 00 00 40
IL_0014: ldloc.0 // x
IL_0015: call System.Math.Pow
IL_001A: stloc.1 // y
还有:
Dim x As Double = 3
Dim y As Double = 2 ^ x
IL 也是:
IL_0000: nop
IL_0001: ldc.r8 00 00 00 00 00 00 08 40
IL_000A: stloc.0 // x
IL_000B: ldc.r8 00 00 00 00 00 00 00 40
IL_0014: ldloc.0 // x
IL_0015: call System.Math.Pow
IL_001A: stloc.1 // y
IE 编译器已将 ^
转换为对 Math.Pow
的调用 - 它们在运行时是相同的。