VB.NET与C#整数除法

Max*_*ich 80 .net c# vb.net operators division

有人想解释为什么这两段代码表现出不同的结果?

VB.NET v4.0

Dim p As Integer = 16
Dim i As Integer = 10
Dim y As Integer = p / i
//Result: 2
Run Code Online (Sandbox Code Playgroud)

C#v4.0

int p = 16;
int i = 10;
int y = p / i;
//Result: 1
Run Code Online (Sandbox Code Playgroud)

Chr*_*ian 83

当您查看这两个片段产生的IL代码时,您将意识到VB.NET首先将整数值转换为双精度,应用除法,然后在将结果转换回int32并存储在y中之前对结果进行舍入.

C#没有这个.

VB.NET IL代码:

IL_0000:  ldc.i4.s    10 
IL_0002:  stloc.1     
IL_0003:  ldc.i4.s    0A 
IL_0005:  stloc.0     
IL_0006:  ldloc.1     
IL_0007:  conv.r8     
IL_0008:  ldloc.0     
IL_0009:  conv.r8     
IL_000A:  div         
IL_000B:  call        System.Math.Round
IL_0010:  conv.ovf.i4 
IL_0011:  stloc.2     
IL_0012:  ldloc.2     
IL_0013:  call        System.Console.WriteLine
Run Code Online (Sandbox Code Playgroud)

C#IL代码:

IL_0000:  ldc.i4.s    10 
IL_0002:  stloc.0     
IL_0003:  ldc.i4.s    0A 
IL_0005:  stloc.1     
IL_0006:  ldloc.0     
IL_0007:  ldloc.1     
IL_0008:  div         
IL_0009:  stloc.2     
IL_000A:  ldloc.2     
IL_000B:  call        System.Console.WriteLine
Run Code Online (Sandbox Code Playgroud)

VB中的"正确"整数除法需要向后斜杠:p\i

  • 一个简单问题的令人耳目一新的答案. (17认同)
  • 我们*可以*查看[VB语言规范](http://msdn.microsoft.com/en-us/library/ms234437.aspx)或[手册](http://msdn.microsoft.com/en -us /库/ 0e16fywh.aspx).在VB``中总是表示浮点除法,而`\\`表示整数除法.恕我直言,通过阅读手册而不是阅读编译器生成的IL,学习VB的速度更快. (6认同)
  • @Sandeep:我认为他们不会改变这种行为,因为它不仅在VB.NET中运行,而且在以前的版本中也是如此.这意味着VB程序员习惯了这种行为,他们实际上期望它. (4认同)

Mar*_*ell 78

在VB中,要进行整数除法,请反斜杠:

Dim y As Integer = p \ i
Run Code Online (Sandbox Code Playgroud)

否则它会扩展到浮点进行除法,然后int在分配时强制回到舍入后y.

  • +1."此行为是设计"[VB 10语言规范](http://msdn.microsoft.com/en-us/library/ms234437.aspx)第11.13.6节 (3认同)

Ode*_*ded 16

VB.NET 整数除法运算符\,没有/.


lan*_*nce 8

"C#和VB中的分区执行方式不同.C#与其他基于C的语言一样,当两个操作数都是整数文字或整数变量(或整数常量)时截断分割结果.在VB中,必须使用整数除法运算符(\)得到类似的结果."

资源