Ответы с форумов MSDN

C# - Инкремент внутри выражения

Date: 24.11.2016 7:39:48


int x = 3;
x += x++;
Console.WriteLine(x.ToString());
Console.ReadKey();

В IL превращается в:

  .entrypoint
  // Code size       29 (0x1d)
  .maxstack  4
  .locals init ([0] int32 x)
  IL_0000:  ldc.i4.3 		//Push num of type int32 onto the stack as int32. 
  IL_0001:  stloc.0 		//Pop a value from stack into local variable 0.
  IL_0002:  ldloc.0 		//Load local variable 0 onto stack. В стеке:3
  IL_0003:  ldloc.0 		//Load local variable 0 onto stack. В стеке:3|3
  IL_0004:  dup 		//Duplicate the value on the top of the stack. В стеке:3|3|3
  IL_0005:  ldc.i4.1 		//Push num of type int32 onto the stack as int32. В стеке:3|3|3|1
  IL_0006:  add 		//Add two values, returning a new value. В стеке:3|3|4
  IL_0007:  stloc.0 		//Pop a value from stack into local variable 0. В стеке:3|3
  IL_0008:  add 		//Add two values, returning a new value. В стеке:6
  IL_0009:  stloc.0 		//Pop a value from stack into local variable 0.
  IL_000a:  ldloca.s   x	//Load address of local variable with index indx.
  IL_000c:  call       instance string [mscorlib]System.Int32::ToString()
  IL_0011:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0016:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
  IL_001b:  pop
  IL_001c:  ret
Т.е. полученная четверка просто отбрасывается? Мда. Я догадывался, что сложные выражения использовать плохо, но не знал что настолько...

Message 1070

Date: 24.11.2016 11:23:03

https://msdn.microsoft.com/en-us/library/36x43w8w.aspx

"The second form is a postfix increment operation. The result of the operation is the value of the operand before it has been incremented."

выполняться то он выполняется, но толку 0. постфиксный инкремент возвращает значение ДО инкремента, оно и идет в следующую операцию.

в листинге IL видно, как четверка честно вычисляется до операции суммирования и помещается в переменную 0, но потом перезаписывается 6-кой


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub