Tak jsem si definitivně ujasnil, že jsem pořád začátečník.
Tohle je striktně vzato prapůvodně C++ funkčnost, v původním K&R céčku operátory ++ a -- pokud vím nebyly. Akorát pokud je nepřetěžujete, tak se dávno používají i v čistém C, takže je to zrovna věc, kterou bych zmínil klidně na první lekce nějakého kurzu céčka:
#include <stdio.h>
void main(void)
{
int a=1, b=1;
printf("a==%d, b==%d\n",a,b);
printf("a++==%d, ++b==%d\n",a++,++b);
printf("a==%d, b==%d\n",a,b);
printf("a--==%d, --b==%d\n",a--,--b);
printf("a==%d, b==%d\n",a,b);
}xchaos@utopia:~$ ./hello++
a==1, b==1
a++==1, ++b==2
a==2, b==2
a--==2, --b==1
a==1, b==1
Tohle se chová přesně dle očekávání a je to velmi edukativní pro začátečníky. Ale dovede mi někdo vysvětlit, proč se to chová jinak, pokud se identické výrazy sdruží jako parametry volání jediné funkce? Zejména tu 0 u třetího parametru! Ale i všechno ostatní. Vyhodnocování zprava doleva to zjevně není. Je hodně vtipný, že jsem pokládal za hotovou věc, co to vypíše a ověřoval si to vlastně jen z nudy, a zamýšlel jsem to do sbírky příkladů pro začátečníky. Jenže fskutečnosti vůbec a sám jsem i po 30 letech začátečník!
Mohlo by to souviset asi s nějakýma automatickýma optimalizacema překladadače (?) ale sakra, nemá být základní syntaxe deterministická?
#include <stdio.h>
void main(void)
{
int a=1, b=1;
printf("Hello++: a==%d, b==%d, a++==%d, ++b==%d, a==%d, b==%d, a--==%d, --b==%d, a==%d, b==%d\n",a,b,a++,++b,a,b,a--,--b,a,b);
}xchaos@utopia:~$ ./hello++
Hello++: a==1, b==1, a++==0, ++b==1, a==1, b==1, a--==1, --b==1, a==1, b==1