提问人:Maxim Gershkovich 提问时间:5/16/2011 最后编辑:BoltClockMaxim Gershkovich 更新时间:10/9/2013 访问量:12628
VB.NET 与 C# 整数除法 [重复]
VB.NET vs C# integer division [duplicate]
问:
有人愿意解释为什么这两段代码表现出不同的结果吗?
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
答:
78赞
Marc Gravell
5/16/2011
#1
在 VB 中,要进行整数除法,请反转斜杠:
Dim y As Integer = p \ i
否则,它将扩展为除法的浮点数,然后在分配给 时强制返回舍入后。int
y
评论
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 程序员已经习惯了这种行为,他们实际上也期望这样做。
-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
好吧,我接受我应该在发布之前验证答案。
评论
p / i
Integer
Double
Integer