VB.NET 与 C# 整数除法 [重复]

VB.NET vs C# integer division [duplicate]

提问人:Maxim Gershkovich 提问时间:5/16/2011 最后编辑:BoltClockMaxim Gershkovich 更新时间:10/9/2013 访问量:12628

问:

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

VB.NET v4.0

Dim p As Integer = 16
Dim i As Integer = 10
Dim y As Integer = p / i
//Result: 2

C# v4.0

int p = 16;
int i = 10;
int y = p / i;
//Result: 1
C# .NET vb.net 运算符 部门

评论

7赞 BoltClock 5/16/2011
似乎在 VB.NET,在两个 s 上产生一个 stackoverflow.com/questions/1953164/...,然后被压扁成一个 .p / iIntegerDoubleInteger
2赞 Ian Horwill 3/29/2012
如果你在 VB.NET 中工作,你真的应该打开Option Strict - 那么编译器会因为精度的损失而产生错误。

答:

78赞 Marc Gravell 5/16/2011 #1

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

Dim y As Integer = p \ i

否则,它将扩展为除法的浮点数,然后在分配给 时强制返回舍入后。inty

评论

3赞 MarkJ 5/16/2011
+1.“此行为是设计使然” VB 10 语言规范第 11.13.6 节
0赞 SteveCinq 8/31/2018
为什么这没有在 c# 中实现让我感到困惑;清晰、简洁、有用。可能“他们”只是不喜欢 VB 有一些优雅的想法!
16赞 Oded 5/16/2011 #2

VB.NET 整数除法运算符是 ,而不是 。\/

8赞 lance 5/16/2011 #3

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

84赞 Christian 5/16/2011 #4

当您查看这两个代码段生成的 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

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

VB 中的“正确”整数除法需要一个反斜杠:p \ i

评论

17赞 Rick Sladkey 5/16/2011
对一个简单问题的令人耳目一新的复杂答案。
0赞 Sandeep G B 5/16/2011
+1.感谢您:)整齐地解释它。只是想知道 Microsoft 是否计划在 .net 的未来版本中中和这些特定于语言的东西?
4赞 Christian 5/16/2011
@Sandeep:我不认为他们会改变这种行为,因为它不仅在 VB.NET 中是这样工作的,而且在以前的版本中也是如此。这意味着 VB 程序员已经习惯了这种行为,他们实际上也期望这样做。
6赞 MarkJ 5/16/2011
我们可以看看 VB 语言规范手册。在 VB 中,始终表示浮点除法,“\”表示整数除法。恕我直言,通过阅读手册而不是通过阅读编译器生成的 IL 来学习 VB 会更快。/
-4赞 FIre Panda 5/16/2011 #5

在 C# 中,当分子和分母都是整数时,将应用整数除法。然而,在 VB.Net 中,'/' 会导致浮点除法,因此对于整数除法 VB.Net 使用 .请看这篇 MSDN 帖子/\

评论

1赞 Cody Gray - on strike 5/16/2011
不,这是不正确的。有关详细信息,请参阅其他答案。
0赞 Cody Gray - on strike 5/16/2011
(回应回答者在现已删除的评论中提供的这一理由。1)不适用;它没有解释问题中讨论的行为。2)我为什么要关心互联网上的其他人有同样的误解?无论如何,我不能对这个答案投反对票。3) 即使这是正确的,-1 表示复制和粘贴他人答案中的内容而不注明出处。
0赞 FIre Panda 5/16/2011
我很久以前看到了这篇文章,所以我对它感到厌烦,显然不可能记住你在互联网上读到的任何内容的链接。
0赞 Cody Gray - on strike 5/16/2011
那么就不可能记住在你的答案中使用它的确切措辞。无论如何,既然你已经更新了你的答案以匹配@Oded的答案,我真的不确定它有什么作用。
1赞 FIre Panda 5/16/2011
好吧,我接受我应该在发布之前验证答案。