Кто-нибудь хочет объяснить, почему эти два кода имеют разные результаты?
VB.NET v4.0
Dim p As Integer = 16
Dim i As Integer = 10
Dim y As Integer = p / i
//Result: 2
С# v4.0
int p = 16;
int i = 10;
int y = p / i;
//Result: 1
Кто-нибудь хочет объяснить, почему эти два кода имеют разные результаты?
VB.NET v4.0
Dim p As Integer = 16
Dim i As Integer = 10
Dim y As Integer = p / i
//Result: 2
С# v4.0
int p = 16;
int i = 10;
int y = p / i;
//Result: 1
Когда вы смотрите на IL-код, создаваемый этими двумя фрагментами, вы поймете, что VB.NET сначала преобразует целочисленные значения в двойные, применяет деление, а затем округляет результат до того, как он преобразуется обратно в int32 и сохраняется в у.
С# ничего не делает.
Код 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
Код С# 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, чтобы сделать целое число, отмените косую черту:
Dim y As Integer = p \ i
в противном случае он расширяется до плавающей запятой для деления, а затем принудительно возвращается к int
после округления при назначении y
.
VB.NET целочисленный оператор разделения - \
, а не /
.
"Дивизия выполняется по-разному в С# и VB. С#, как и другие языки на основе C, обрезает результат деления, когда оба операнда являются целыми литералами или целыми переменными (или целыми константами). В VB вы должны использовать оператор целочисленного деления (\
), чтобы получить аналогичный результат.
В С# целочисленное деление применяется с /
, когда числитель и деноментор являются целыми числами. Принимая во внимание, что в VB.Net '/' результат разложения с плавающей запятой, поэтому для целочисленного деления в VB.Net используйте \
. Посмотрите на сообщение MSDN.