<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://t8.lbstr.eu/index.php?action=history&amp;feed=atom&amp;title=%2B%2Bi_%2B_%2B%2Bi</id>
	<title>++i + ++i - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://t8.lbstr.eu/index.php?action=history&amp;feed=atom&amp;title=%2B%2Bi_%2B_%2B%2Bi"/>
	<link rel="alternate" type="text/html" href="https://t8.lbstr.eu/index.php?title=%2B%2Bi_%2B_%2B%2Bi&amp;action=history"/>
	<updated>2026-11-03T04:27:31Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://t8.lbstr.eu/index.php?title=%2B%2Bi_%2B_%2B%2Bi&amp;diff=21&amp;oldid=prev</id>
		<title>127.0.0.1: /* Реализации */ Forth</title>
		<link rel="alternate" type="text/html" href="https://t8.lbstr.eu/index.php?title=%2B%2Bi_%2B_%2B%2Bi&amp;diff=21&amp;oldid=prev"/>
		<updated>2020-05-26T06:39:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Реализации: &lt;/span&gt; Forth&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{архив}}&lt;br /&gt;
{{drama}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:KYB-001.jpg|thumb]]&lt;br /&gt;
&amp;lt;code &amp;quot;c&amp;quot;&amp;gt;int i = 5;&lt;br /&gt;
i = ++i + ++i;&amp;lt;/code&amp;gt; — типичный [[код]]-[[майндфак]] для программистов.&lt;br /&gt;
&lt;br /&gt;
== Строгое описание происходящего ==&lt;br /&gt;
В данном примере происходит неоднократное изменение переменной в пределах одной [[:w:Точка следования|точки следования]], такая ситуация описывается в стандартах C и С++ как [[:w:Неопределённое поведение|UB]]. Иными словами, даже попытки ответить на этот вопрос иначе как «UB» демонстрируют недостаточную квалификацию отвечающего. Другое дело, что после «UB» можно указать некоторые подробности, и мы этим займёмся, поскольку не утоленное вовремя любопытство приводит к драмам в обсуждении.&lt;br /&gt;
&lt;br /&gt;
Конкретно неопределённость в этой, как некоторым кажется, кристально ясной конструкции в данном случае заключается в том, что, согласно стандартам С и С++, побочные эффекты (то есть инкремент в данном случае) могут быть применены в &amp;#039;&amp;#039;любой&amp;#039;&amp;#039; удобный для компилятора момент между двумя {{Acronym|точками следования|sequence points}}. Конструкцию &amp;lt;code&amp;gt;i = ++i + ++i;&amp;lt;/code&amp;gt; компилятор вправе понять и как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tmp=i; tmp++; i = tmp; tmp++; i += tmp;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и как&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tmp=i; tmp++; tmp++; i = tmp + tmp;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и какими-нибудь другими способами. Нужна такая свобода для проведения низкоуровневых оптимизаций в обычных случаях типа &amp;lt;code&amp;gt;a = ++b + ++c;&amp;lt;/code&amp;gt;, дабы между делом сэкономить пару тактов на халяву.&lt;br /&gt;
&lt;br /&gt;
Хотя, оптимизатор тут вообще ни при чём. Дело в том, что наше интуитивное понимание работы этого кода основывается на том, что прединкремент возвращает &amp;#039;&amp;#039;значение&amp;#039;&amp;#039;, получившееся после прибавления единицы. На самом же деле любой нормальный прединкремент возвращает не получившееся значение, а &amp;#039;&amp;#039;ссылку&amp;#039;&amp;#039; на эту же переменную. Поэтому мы складываем не числа, а две одинаковые ссылки, то есть переменную &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; саму с собой! Иными словами происходит буквально следующее:&lt;br /&gt;
&lt;br /&gt;
# Левый &amp;lt;code&amp;gt;++i&amp;lt;/code&amp;gt; прибавляет единицу к i и возвращает ссылку на неё. I  = 6.&lt;br /&gt;
# Правый &amp;lt;code&amp;gt;++i&amp;lt;/code&amp;gt; прибавляет ещё одну единицу к i и также возвращает ссылку на неё. I = 7.&lt;br /&gt;
# Оператор сложения разыменовывает ссылки, получая &amp;lt;code&amp;gt;i = i + i&amp;lt;/code&amp;gt;. Так как после второго шага I = 7, то извлекается именно это число, давая выражение &amp;lt;code&amp;gt;i = 7 + 7&amp;lt;/code&amp;gt;, откуда и получается 14.&lt;br /&gt;
&lt;br /&gt;
== Нельзя, но если всё-таки сделаем? ==&lt;br /&gt;
Почему нельзя, мы уже видели (даже наиболее «альтернативно одаренные» не возьмутся оспаривать, что это ведет ко глюку). Однако всякий [[Нерд|пытливый ум]], несомненно, изучит этот глюк в поисках того, &amp;#039;&amp;#039;&amp;#039;как именно&amp;#039;&amp;#039;&amp;#039; может сглючить данный код, &amp;#039;&amp;#039;&amp;#039;в какую сторону&amp;#039;&amp;#039;&amp;#039; стандарты языка допускают маневры компилятора, а в какую — таки нет.&lt;br /&gt;
&lt;br /&gt;
Варианты «правильного» ответа колеблются между 13 и 14, хотя на [[LISP]]е ([http://darky2000.livejournal.com/72865.html?thread=129185#t129185 пруф]) анонимусы вроде как получили 12, 13 [[Медиа:Пруф1255123.JPG|(пруф)]], а на [[Python|Питоне]] вообще 10 (поскольку там вообще нет оператора инкремента ++). [[КО|Результат зависит от последовательности операций]]. Там, где результат 13, сначала вычисляется первый инкремент, на место первого операнда идёт 6, вычисляется второй инкремент, туда идет 7, и результаты складываются: 6+7=13. 14 можно получить, вычислив оба инкремента, а потом уже сумму. Таким образом, этот трюк хорошо использовать для [[Shit bricks|ошеломления]] [[быдлокодер]]ов, уверенных в непогрешимости своего уютненького язычка.&lt;br /&gt;
&lt;br /&gt;
Вообще, по определению предынкремент выполняется &amp;#039;&amp;#039;&amp;#039;до&amp;#039;&amp;#039;&amp;#039; вычисления выражения. Если считать ++i + ++i одним выражением, то мы должны выполнить два инкремента, потом вычислить выражение и получить 14. Если считать каждый ++i выражением, а сумму — выражением, принимающим результаты других выражений как аргументы, то, с точки зрения логики и математики, ничего таки не изменится, а вот компилятор, вычислив одно слагаемое (имеет право — самостоятельное выражение ведь!), упустит тот момент, что при вычислении второго такого же самостийного слагаемого первое тоже, сцуко, подло изменилось. Указать синтаксисом, где начинается и заканчивается выражение, невозможно — скобки задают приоритет внутри выражения. «Выражение» — другая инстанция. Например, в А=(В=С+14) есть выражение С+14, результат которого присваивается В, причем присваивание — тоже является выражением, и его результат присваивается А. И никакие скобки не могут побудить ЭТО стать одним выражением. Разъединить выражение, напротив, можно: (a=++i) + (b=++i), что напрямую задает вычисление a, вычисление b и только потом вычисление суммы a+b. Это, теоретически, должно детерминировать значение a+b как 13 (если компилятор настолько строго выдерживает формальные определения языка), но зато содержит UB относительно значений a и b, поскольку оптимизировать порядок вычисления a и b компилятору никто не запрещает (см. точки следования). Очевидно, что значение (a=++i) / (b=++i) по этой причине вообще не детерминировано.&lt;br /&gt;
&lt;br /&gt;
== Оно на башорге ==&lt;br /&gt;
&lt;br /&gt;
=== Исходная цитата ===&lt;br /&gt;
{{Цитата|pre=1|text=KoloDen&lt;br /&gt;
&lt;br /&gt;
Привет, я общительный пацан, люблю поболтать, особенно с классными девченками. Но, чтобы поговорить со мной, ответьте на простую задачку анти-спам бота. Вот она:&lt;br /&gt;
int i = 5;&lt;br /&gt;
i = ++i + ++i;&lt;br /&gt;
Вопрос: Чему равно i?&lt;br /&gt;
&lt;br /&gt;
Stefmania 14&lt;br /&gt;
&lt;br /&gt;
KoloDen Гы. Признайся, ты не девченка, а 40-летний одмин, да?|{{Borquote|212679}}}}&lt;br /&gt;
&lt;br /&gt;
=== Последствия ===&lt;br /&gt;
11 мая 2007 года случилось страшное — была заапрувлена вышеприведенная цитата. С тех пор разнокалиберные [[Быдлокодер|&lt;br /&gt;
программисты]] потеряли покой и сон. Дело в том, что в зависимости от используемого языка программирования данное выражение может давать и 13, и 12, и еще [[больше 9000]] вариантов ответа.&lt;br /&gt;
&lt;br /&gt;
{{NSFW|title=Вот одно из множества обсуждений|content=&amp;amp;nbsp;&lt;br /&gt;
{{Цитата|pre=1|text=Anhen, 11.05.2007 14:03:27:&lt;br /&gt;
KoloDen&lt;br /&gt;
Привет, я общительный пацан, люблю поболтать, особенно с классными девченками. Но, чтобы поговорить со мной, ответьте на простую задачку анти-спам бота. Вот она:&lt;br /&gt;
int i = 5;&lt;br /&gt;
i = ++i + ++i;&lt;br /&gt;
Вопрос: Чему равно i?&lt;br /&gt;
&lt;br /&gt;
Stefmania&lt;br /&gt;
14&lt;br /&gt;
&lt;br /&gt;
KoloDen&lt;br /&gt;
Гы. Признайся, ты не девченка, а 40-летний хрен одмин, да?&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:03:54:&lt;br /&gt;
хм 8-)&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:06:01:&lt;br /&gt;
что хм?&lt;br /&gt;
13 или 14?&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:06:32:&lt;br /&gt;
бля я завис.&lt;br /&gt;
то что 14 это точно&lt;br /&gt;
а вот почему я не могу понять&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:07:43:&lt;br /&gt;
тогда откуда ты знаешь что точно 14?&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:09:18:&lt;br /&gt;
бля 8-)&lt;br /&gt;
я понял&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:09:26:&lt;br /&gt;
сцуко, хитро 8-)&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:09:27:&lt;br /&gt;
ну?&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:09:48:&lt;br /&gt;
ну?!?!&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:09:48:&lt;br /&gt;
откуда знаю что 14:&lt;br /&gt;
perl -e &amp;quot;$i = 5; $i = ++$i + ++$i; print $i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:10:08:&lt;br /&gt;
почему 14:&lt;br /&gt;
пришлось открывать вижи и смотреть асмовый код&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:10:12:&lt;br /&gt;
и?&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:11:39:&lt;br /&gt;
когда вычисляется выражение, сначала вычисляются его операнды&lt;br /&gt;
но оператор ++i - это не i + 1, а i += 1&lt;br /&gt;
то есть сначала к i прибавляется 1, потом к i еще раз прибавляется единица а потом к i прибавляется i получается 7+7, то есть 14&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:12:33:&lt;br /&gt;
черт&lt;br /&gt;
красиво!&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:13:32:&lt;br /&gt;
а вот в пхп 13&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:39:02:&lt;br /&gt;
пхп сосет 8-)&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:39:21:&lt;br /&gt;
пхп логичен&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:40:06:&lt;br /&gt;
в данном случае - правильный ответ 14, он согласуется с логикой, а вот 13 — нет&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:40:39:&lt;br /&gt;
имхо 13 логичнее&lt;br /&gt;
(5+1) + (5+1)+1&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:48:04:&lt;br /&gt;
еще раз.&lt;br /&gt;
++i это не i + 1&lt;br /&gt;
это так же логично как обман зрения. только здесь не обман зрения, а инерция мышления&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:49:24:&lt;br /&gt;
i += 1 это i = i+1&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:50:10:&lt;br /&gt;
да&lt;br /&gt;
&lt;br /&gt;
DarkMist, 14:51:22:&lt;br /&gt;
исходный statement выглядит так:&lt;br /&gt;
i = ( i += 1, i ) + ( i += 1, i )&lt;br /&gt;
в этом случае все смотриться логично, aren&amp;#039;t you?&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:58:45:&lt;br /&gt;
я остановила работу всего джавского отдела&lt;br /&gt;
&lt;br /&gt;
Anhen, 14:58:52:&lt;br /&gt;
сидят пытаются получить 14&lt;br /&gt;
&lt;br /&gt;
DarkMist, 15:00:27:&lt;br /&gt;
на жабе шо ле 8-)?&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:00:59:&lt;br /&gt;
ага&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:01:07:&lt;br /&gt;
у них 13&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:01:13:&lt;br /&gt;
и куча теорий&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:02:28:&lt;br /&gt;
не знаю, наша контора считает что логика на стороне 13&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:07:09:&lt;br /&gt;
на флексе 13&lt;br /&gt;
подключились дельфисты :))))))&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:07:20:&lt;br /&gt;
бугага&lt;br /&gt;
башорг зло&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:08:49:&lt;br /&gt;
и в сишарпе 13&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:09:13:&lt;br /&gt;
а у дельфистов нет инкрементов&lt;br /&gt;
&lt;br /&gt;
DarkMist, 15:21:28:&lt;br /&gt;
на перле и c++ 14. все остальное от лукавого 8-)&lt;br /&gt;
&lt;br /&gt;
Anhen, 15:22:04:&lt;br /&gt;
мои коллеги просили передать, что ты сволочь и башорг твой блядский тоже&lt;br /&gt;
цытата&lt;br /&gt;
&lt;br /&gt;
DarkMist, 15:23:52:&lt;br /&gt;
8-)))|source=http://darky2000.livejournal.com/72865.html}}}}&lt;br /&gt;
== Реализации ==&lt;br /&gt;
&lt;br /&gt;
=== C и С++ ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Cpp.png|thumb|300px|Демонстрация прекрасной портабельности исходников между компиляторами]]&lt;br /&gt;
&lt;br /&gt;
В этих языках может получиться и 13, и 14, и вообще чёрт-те-что. Разные компиляторы С++ выдают 13 и 14. Это пример неопределённого поведения. Неопределённое поведение — самый типичный для этих языков способ [[выстрелить себе в ногу]].&lt;br /&gt;
&lt;br /&gt;
Более того, один и тот же компилятор может выдавать разные значения в зависимости от опций оптимизатора. Некоторые об этой фигне еще и предупреждают, например gcc -Wall выдает warning: operation on ‘i’ may be undefined.&lt;br /&gt;
&lt;br /&gt;
Даже в одной и той же программе может получаться разный результат:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int i=5,j=5;&lt;br /&gt;
i=++i+ ++i;&lt;br /&gt;
printf(&amp;quot;i=%i j=%i&amp;quot;, i, ++j + ++j); //Вывод: i=14  j=13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот описанный майндфак в квадрате на плюсах:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;int i = 0; int z = ++i + ++i + ++i + ++i;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алсо, в C++17 сабж уже не даёт UB (описали-таки поведение в стандарте), так что правильный ответ — 14 (оба раза). Можно проверить на вышеприведённом коде в любом онлайн компиляторе.&lt;br /&gt;
&lt;br /&gt;
=== [[Java]] ===&lt;br /&gt;
&lt;br /&gt;
В Java получается 13 (первый пре-инкремент увеличивает i на 1 и возвращает 6, второй пре-инкремент увеличивает i на 1 и возвращает 7), и данное поведение жёстко определено, так как в спецификации языка [http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7.1 чётко описан порядок] вычисления (не путать с приоритетом операторов).&lt;br /&gt;
&lt;br /&gt;
=== [[C Sharp|C#]] ===&lt;br /&gt;
&lt;br /&gt;
Как истинный клон Джавы, даёт нам результат с числом 13.&lt;br /&gt;
&lt;br /&gt;
=== [[Apple|Objective-C]] ===&lt;br /&gt;
&lt;br /&gt;
Компилятор clang, который является де-факто стандартом (а других просто нет), предупреждает о Multiple unsequenced modifications to &amp;#039;i&amp;#039;, но исправно возвращает 13.&lt;br /&gt;
&lt;br /&gt;
=== awk ===&lt;br /&gt;
&lt;br /&gt;
Awk, как и Жаба, выдаёт 13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;awk &amp;#039;BEGIN { i=5;j=5;i=++i+ ++i; print i, ++j+ ++j}&amp;#039;&lt;br /&gt;
&lt;br /&gt;
13 13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ActionScript 3.0 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;var test:int = 5;&amp;lt;br /&amp;gt;&lt;br /&gt;
trace(++test + ++test);//13&amp;lt;br /&amp;gt;&lt;br /&gt;
test = 5;&amp;lt;br /&amp;gt;&lt;br /&gt;
trace(test++ + test++);//11&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ActionScript 2.0 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;i=5; trace(++i + ++i);	//13&amp;lt;br/&amp;gt;&lt;br /&gt;
i=5; trace(i++ + i++);	//11&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Perl]] ===&lt;br /&gt;
&lt;br /&gt;
Perl выдает 14:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $i = 5;&lt;br /&gt;
$i = ++$i + ++$i;&lt;br /&gt;
print $i;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pawn ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
main()&lt;br /&gt;
{&lt;br /&gt;
	new i = 5, j = 5;&lt;br /&gt;
	i = ++i + ++i;&lt;br /&gt;
	&lt;br /&gt;
	printf &amp;quot;%d %d&amp;quot;, i, ++j + ++j;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вывод: &amp;lt;code&amp;gt; 13 13 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[PHP]] ===&lt;br /&gt;
&lt;br /&gt;
PHP выдаёт 13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$i = 5;&lt;br /&gt;
$i = ++$i + ++$i;&lt;br /&gt;
echo $i;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[JavaScript]] ===&lt;br /&gt;
&lt;br /&gt;
JavaScript в V8 выдаёт 13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
i = 5&lt;br /&gt;
i = ++i + ++i&lt;br /&gt;
document.write(i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
&lt;br /&gt;
GNU bash 4.1.5 тоже выдаёт 13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
~$ i=5; echo $((++i + ++i))&lt;br /&gt;
13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Forth]] ===&lt;br /&gt;
&lt;br /&gt;
Никаких UB. Слова выполняются строго последовательно. Что написано, то и будет получено. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
5 1+ dup + .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Выдает 12.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
5 1+ dup 1+ + .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Выдает 13.&lt;br /&gt;
&lt;br /&gt;
=== Fortran 90 ===&lt;br /&gt;
&lt;br /&gt;
Ожидаемое 13 (([http://stranichko.org.ua/blog/programming/mindfuck/ а эти товарисчи и инкремент написать нормально не могут]))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
    program mindfuck  &lt;br /&gt;
    integer i  &lt;br /&gt;
    i = 5  &lt;br /&gt;
    i = INC (i) + INC (i)  &lt;br /&gt;
    print *,i  &lt;br /&gt;
    contains  &lt;br /&gt;
    integer function INC (i) &lt;br /&gt;
    integer,intent(inout)::i &lt;br /&gt;
            i=i+1&lt;br /&gt;
            INC = i  &lt;br /&gt;
    end function INC  &lt;br /&gt;
    end program mindfuck  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common [[Lisp]] ===&lt;br /&gt;
&lt;br /&gt;
CLISP 2.49 возвращает 13, поведение определено в спецификации.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lisp&amp;quot;&amp;gt;&lt;br /&gt;
[1]&amp;gt; (defvar i 5)&lt;br /&gt;
I&lt;br /&gt;
[2]&amp;gt; (+ (incf i) (incf i))&lt;br /&gt;
13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Python]] ===&lt;br /&gt;
&lt;br /&gt;
Python выдаёт 10, в нем нет инкремента в таком виде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
i = 5&lt;br /&gt;
i = ++i + ++i&lt;br /&gt;
print i&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но при этом, если реализовать инкремент самим, будет 13:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Foo:&lt;br /&gt;
    def __init__(self, num):&lt;br /&gt;
        self.num = num&lt;br /&gt;
&lt;br /&gt;
    def inc(self):&lt;br /&gt;
        self.num += 1&lt;br /&gt;
        return self.num&lt;br /&gt;
&lt;br /&gt;
i = Foo(5)&lt;br /&gt;
print(i.inc() + i.inc())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Это потому, что интерпретатор вычисляет все по порядку.&lt;br /&gt;
&lt;br /&gt;
Но если чуток подумать и довести все до логического ума, то все таки 14&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Foo:&lt;br /&gt;
    def __init__(self, num):&lt;br /&gt;
        self.num = num&lt;br /&gt;
 &lt;br /&gt;
    def inc(self):&lt;br /&gt;
        self.num += 1&lt;br /&gt;
        return self&lt;br /&gt;
    &lt;br /&gt;
    def __add__(self, right):&lt;br /&gt;
        return Foo(self.num + right.num)&lt;br /&gt;
    &lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        return repr(self.num)&lt;br /&gt;
 &lt;br /&gt;
i = Foo(5)&lt;br /&gt;
print(i.inc() + i.inc())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Visual Basic|VB]] ===&lt;br /&gt;
&lt;br /&gt;
Visual Basic выдаёт 10 тоже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
i = 5&lt;br /&gt;
i = ++i + ++i&lt;br /&gt;
log.WriteLine(&amp;quot;i = &amp;quot; &amp;amp; i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
&lt;br /&gt;
Powershell выдаёт 13:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
$i=5&lt;br /&gt;
$i=++$i + ++$i&lt;br /&gt;
Write-Host $i&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rexx ===&lt;br /&gt;
&lt;br /&gt;
Rexx выдаёт 10&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
i=5          &lt;br /&gt;
i=++i + ++i    &lt;br /&gt;
SAY i          &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delphi ===&lt;br /&gt;
&lt;br /&gt;
В Delphi нельзя присвоить значение результата инкремента, потому что инкремент — не функция, но процедура, посему сия операция будет несовместима по типу, и компилятор откажется собирать программу, ругнувшись [Error] Incompatible types: &amp;#039;Integer&amp;#039; and &amp;#039;procedure, untyped pointer or untyped parameter&amp;#039;&lt;br /&gt;
Однако, если реализовать инкремент как функцию, чтоб она работала именно так, как надо (изменяя переменную, от которой запускается), выдаст 13&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
function MyInc(var i: integer): integer;&lt;br /&gt;
begin&lt;br /&gt;
  inc(i);&lt;br /&gt;
  Result:=i;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  i:=5&lt;br /&gt;
  i:=MyInc(i){Теперь i=6}+MyInc(i){А теперь i=7}; // i:= 6 + 7;&lt;br /&gt;
  Writeln(i); Readln // i= 13;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
В Паскале нет оператора ++, но есть два оператора + (как в математике): бинарный (например, 2+2) и унарный (например, +2). Итого получается: +i — это +5, то есть то же 5; ++i — это +(+5) — ну, если мы очень настаиваем, чтобы у 5 ни в коем случае не меняли знак, почему бы и нет? В итоге, команда математически превращается в +(+5)+(+(+5))=10. Если реализовать инкремент как функцию, выдается 13.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
program ippProblem;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
	i:Cardinal;&lt;br /&gt;
&lt;br /&gt;
function inc(var x:Cardinal):Cardinal;&lt;br /&gt;
begin&lt;br /&gt;
	x := x + 1;&lt;br /&gt;
	inc := x;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
 	i := 5;&lt;br /&gt;
	writeln(inc(i) + inc(i));&lt;br /&gt;
end.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Развитие идеи ==&lt;br /&gt;
&lt;br /&gt;
Утверждается, что есть люди, которым приведённого выражения недостаточно для полной потери церебральной девственности. Такие люди могут захотеть отступить от классики и изучить вопрос последствий выражения&lt;br /&gt;
{{NSFW|title=[[NSFW|Not Safe For &amp;lt;strike&amp;gt;Work&amp;lt;/strike&amp;gt;]] Sanity|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; int i = 0; i += i++ + ++i &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
K&amp;amp;R определил += как разновидность именно оператора присваивания, а не краткую форму записи i=i+…, то есть к инстанции «выражение» относится всё, что справа от +=. Поэтому += можно не бояться, так как предынкремент вычисляется до значения выражения, затем вычисляется выражение, затем — сразу же и никак иначе — постинкремент, а потом уже мы покидаем инстанцию данного выражения и используем его результат по назначению (в данном случае — для операции +=). А вот само выражение по-прежнему UB, потому что разные варианты разбиения его на отдельные инстанции самостоятельных выражений опять по той же схеме дают разные значения.&lt;br /&gt;
&lt;br /&gt;
А ещё можно сделать так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt; static int i = i++ + ++i; &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат — 2 или 1, но хуй кто поймёт.&lt;br /&gt;
}}&lt;br /&gt;
{{NSFW|title=А с помощью Free Pascal Compiler дельфисты могут присоединиться к толпам любителей инкрементов.|content=&lt;br /&gt;
Не получится. Все эти ваши плюсы в строке fpc воспринимает как обычный унарный плюс. Бинарная операция сложения тут ровно одна, в итоге при попытке записать си-подобный вариант&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
program increment_ub;&lt;br /&gt;
var i : Integer;&lt;br /&gt;
begin&lt;br /&gt;
        i := 5;&lt;br /&gt;
        i := ++i + ++i;&lt;br /&gt;
        WriteLn(i);&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
результат ожидаемо оказывается 10.&lt;br /&gt;
&lt;br /&gt;
А если переопределить стандартную процедуру inc() следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
function inc(i:word):word;&lt;br /&gt;
begin&lt;br /&gt;
system.inc(i);&lt;br /&gt;
inc:=i;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
то получим 12. Потому что, в отличие от «++i», аргумент не изменяется. А вот если перед параметром поставить ключевое слово «var», то результат будет 13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Башорг|Мемы Башорга}}&lt;br /&gt;
{{Языки программирования|Программизм}}&lt;/div&gt;</summary>
		<author><name>127.0.0.1</name></author>
	</entry>
</feed>