これらの2つのコードが異なる結果を示す理由を誰かが説明してくれませんか?
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
これらの2つのスニペットが生成する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
VBでinteger除算を行うには、スラッシュを逆にします。
Dim y As Integer = p \ i
それ以外の場合は、除算のために浮動小数点に展開され、int
に割り当てられた場合は、丸め後にy
に強制的に戻されます。
VB.NET 整数除算演算子 は\
ではなく/
。
「除算はC#とVBでは異なる方法で実行されます。C#は、他のCベースの言語と同様に、両方のオペランドが整数リテラルまたは整数変数(または整数定数)である場合、除算結果を切り捨てます。VBでは、整数除算演算子(\
)でも同様の結果が得られます。」