@nazarovdaniil

Почему в результате выполнения программы j=0 ?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int j = 0;
for (int i = 0; i < 10; i++)
{
j = j++;
}
Console.WriteLine("j="+j);
Console.ReadKey();
}
}
}
  • Вопрос задан
  • 2220 просмотров
Пригласить эксперта
Ответы на вопрос 3
Результат посфиксного икремента - значение аргумента до прибавления 1
То есть код j = j++ можно представить так
int tmp = j;
j = j + 1;
j = temp;


Если посмотреть IL то в j = j++ будет такой код
IL_0006: ldloc.0 // В стек кладем значение j (оно у нас == 0)
IL_0007: dup     // Дублируем в стеке значение j  
IL_0008: ldc.i4.1 // Кладем второй аргумент инкремента (он == 1)
IL_0009: add      // Складываем два верних значения, результат кладем в стек
IL_000a: stloc.0  // Сохраняем в j результат сложения
IL_000b: stloc.0  // Сохраняем в j 0, который получился при dup


Я нарисовал, что получается в стеке. Тут интересен опкод dup, который как раз делает int tmp = j;

d278f75397094999b1cb5f60e8fe6a6d.png
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Потому выберите что-нибудь одно, и вместо j = j++; напишите либо j = j + 1; либо просто j++;
Ответ написан
Комментировать
@mamkaololosha
Это систематическая ошибка инкерментов. Разные компиляторы её обрабатывают по разному.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы