- PVSM.RU - https://www.pvsm.ru -
Хотел бы начать перевод с маленького опроса. Вопрос к .NET разработчикам пишущим на языке программирования C#.
Опрос в конце перевода.
Сегодня я смотрел внутренний список разработчиков языка C#. Один из вопросов был о поведении выражения «x += x++», а именно, каким должно быть правильное поведение. Я думаю этот вопрос более чем интересный, поэтому решил посвятить ему запись в своем блоге. Но для начала, НИКОГДА НЕ ПИШИТЕ ТАКОЙ КОД.
ОК, мы можем начать…
Используем следующий код для примера:
int x = 3;
x += x++;
Первое, что делает компилятор, когда видит код z += y это преобразует его в z = z + y. Это, очевидно верно, для операторов +=, -=, *=, /=.
ОК, это было просто. Теперь, мы можем просто посчитать значение такого выражения:
x = x + x++;
Этот код дает такой же результат, что и код:
x = x + x;
Однако, он дает различный результат с кодом:
x = x++ + x;
который в свою очередь дает одинаковый результат с кодом:
x = x + ++x;
Как бы такое поведение не сводило вас с ума, оно действительно имеет место быть. Но для начала ответим на вопрос: какая разница между x++ и ++x? x++ возвращает значение x текущему выражению, а затем увеличивает его на единицу. ++x увеличивает значение x на единицу и затем возвращает увеличенное значение текущему выражению. Принимая во внимание вышесказанное (и учитывая, что C# обрабатывает выражения слева на право), мы можем понять, почему предыдущий код работает именно так.
int x = 3;
x = x + x++;
Компилятор будет подсчитывать это выражение следующим образом:
Теперь посмотрим, что будет в результате такого кода:
int x = 3;
x = x++ + x;
Теперь рассмотрим такой код:
int x = 3;
x = x + ++x;
Я надеюсь, теперь все ясно. Кстати, в языке С++ поведение такого выражения не определено.
Так почему же мы определили поведение такого выражения? Почему мы не говорим об ошибке или почему не происходит предупреждения во время компиляции?
Имеет ли значение, какой из предыдущих вариантов является правильным? Не совсем, потому что ВЫ НЕ ДОЛЖНЫ ПИСАТЬ ТАКОЙ КОД!
Автор: timyrik20
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/40201
Ссылки в тексте:
[1] Источник: http://habrahabr.ru/post/188888/
Нажмите здесь для печати.