Příkaz je:
i = 0;
pole[i++] = ++i; /* JAK SE VYHODNOTI TENTO PRIKAZ? */
Hustý. Mě to přijde jasný. Do pole na indexu 1 ulož 1. A ve výsledku je i = 2. Takhle bych ten výraz chápal, a cokoliv jiné mi přijde divné.
Což ale samozřejmě vůbec nic neznamená, a C se nemusí řídit tím jak to chápu já :-)
C je jazyk z kompilátorové doby kamenné. V době, kdy vznikalo, se překládalo velice přímočaře do instrukcí z našeho pohledu velice obskurních architektur.

Třeba takové pdp-11 AFAIK umělo postinkrement jako součást adresy v rámci instrukce.
Ta podezřelá konstrukce musí udělat dvě věci : spočítat adresu a spočítat hodnotu. Pro oboje může mít daná architektura nějaké specializované instrukce. Takže v té době dávalo smysl ten jazyk navrhnout tak, aby ty instrukce šlo použít. Specifikované je pořadí vyhodnocení
hodnot, ale
vedlejší efekty se prostě provedou někdy během toho. Jisté je akorát to, kdy už budou určitě hotové.
Když tohle přeložíte v clangu, tak bude dokonce vyhazovat warningy.
V C jsou i divnější věci. Inty třeba vůbec nemusí být reprezentované dvojkovým doplňkem. Z dnešního pohledu je to už kapku úlet. Takže mimálně nové verze C++ se to snaží trochu učesat. (Např.
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2218.htm)
Třeba přetečení integerů je a bude stále nedefinovaná operace. Kdyby překladač musel počítat s přetečením integerů, pak nemůže dělat spoustu (z našeho pohledu samozřejmých) aritmetických úprav výrazů. Ale past na začátečníky to teda je.