Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

x = x

Anna | 18.06.2014 | нет комментариев
Хотел бы начать перевод с маленького опроса. Вопрос к .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  ;

Компилятор будет подсчитывать это выражение дальнейшим образом:

  1. x = (x) x -> 1-й x подсчитывается и возвращает значение 3, x = 3;
  2. x = 3 (x) -> x подсчитывается и возвращает 3, x = 3;
  3. x = 3 (x ) -> x возвращает значение 3 и x возрастает на единицу, x = 4;
  4. x = (3 3) -> выражение 3 3 подсчитывается и возвращает 6, x = 4;
  5. (x = 6) -> x присваивается значение 6 (переписывая предыдущее значение 4).

Сейчас посмотрим, что будет в итоге такого кода:

int x = 3;
x = x     x;
  1. x = (x) x -> x подсчитывается и возвращает значение 3, x = 3;
  2. x = (x ) x -> x возвращает значение 3 и x возрастает на единицу, x = 4;
  3. x = 3 (x) -> x подсчитывается и возвращает значение 4, x = 4;
  4. x = 3 4 -> выражение 3 4 подсчитывается и возвращает значение 7, x = 4;
  5. (x = 7) -> x присваивается значение 7 (переписывая предыдущее значение 4).

Сейчас разглядим такой код:

int x = 3;
x = x     x;
  1. x = (x) x -> 1-й x подсчитывается и возвращает значение 3, x = 3;
  2. x = 3 ( x) -> x увеличивает x на единицу и возвращает 4, x = 4;
  3. x = 3 (x) -> x подсчитывается и возвращает 4, x = 4;
  4. x = 3 4 -> выражение 3 4 подсчитывается и возвращает 7, x = 4;
  5. (x = 7) -> x присваивается значение 7 (переписывая предыдущее значение 4).

Я верю, сейчас все ясно. Кстати, в языке С поведение такого выражения не определено.

Так отчего же мы определили поведение такого выражения? Отчего мы не говорим об ошибке либо отчего не происходит предупреждения во время компиляции?

  • Мы были неправы, мы обязаны получить ошибку либо предупреждение, но сейчас теснее слишком поздно, потому что если мы изменим это поведение, то можем сломать код; ЛИБО
  • Достаточно трудно, сформировать комплект управляющих правил для компилятора, Дабы он был горазд сказать об ошибке в таких необычных случаях; ЛИБО
  • Мы выбираем тратить наше время, работая над вещами, которые подлинно заботят людей взамен сглаживания таких острых углов.

Имеет ли значение, какой из предыдущих вариантов является верным? Не вовсе, потому что ВЫ НЕ ОБ?ЗАНЫ ПИСАТЬ ТАКОЙ КОД!

Чему будет равно значение переменной x позже выполнения дальнейшего кода int x = 3; x = x ;?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 167 человек. Воздержалось 46 человек.

 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB