Ответ 1
Однако, с точки зрения компьютера, + + 5 быстрее, чем a = a + 5?
Оба одинаковые, сначала (a += 5
) равно второму a = a + 5
.
Вы можете видеть:
Выражение, использующее оператор присваивания
+=
, напримерx += y
, равно эквивалентноx = x + y
, за исключением того, что x оценивается только один раз. Значение оператора + зависит от типов x и y (добавление для числовых операндов, конкатенация для строковых операндов и и т.д.).
Таким образом, это зависит от типа a
, и в тех ситуациях, когда несколько потоков обращаются к вашей переменной a
, вы можете получить разные результаты. Но для большинства других случаев это было бы так же:
Для кода:
static void Main(string[] args)
{
int a = 10;
a += 5;
Console.WriteLine(a);
}
Сборка в режиме выпуска IL-код
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 14 (0xe)
.maxstack 2
.locals init ([0] int32 a)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.5
IL_0005: add
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call void [mscorlib]System.Console::WriteLine(int32)
IL_000d: ret
} // end of method Program::Main
Тот же IL генерируется через код:
static void Main(string[] args)
{
int a = 10;
a = a + 5;
Console.WriteLine(a);
}
IL (тот же):
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 14 (0xe)
.maxstack 2
.locals init ([0] int32 a)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.5
IL_0005: add
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call void [mscorlib]System.Console::WriteLine(int32)
IL_000d: ret
} // end of method Program::Main