Ред на оценка на подизрази

Ако редът на оценката на подизразите не е гарантиран, тогава защо това е правилно?

int a = 1;
a = a + 1;

Тук компилаторът може да оцени първо a и след това a + 1, така че a може да бъде 1 или 2, докато това не е:

a = a++;

Тук компилаторът може да оцени първо a и след това a++ син a може да бъде 1 или 2.

Каква е разликата?


person xdevel2000    schedule 04.06.2014    source източник


Отговори (2)


Това е недефинирано поведение. Причината е следната::

Стандартът в §5/4 казва

Между предишната и следващата точка на последователност, съхранената стойност на скаларния обект трябва да бъде променена най-много веднъж чрез оценката на израз.

и

Предходната стойност ще бъде достъпна само за определяне на стойността, която да бъде съхранена.

Това означава, че между две точки на последователност една променлива не трябва да бъде модифицирана повече от веднъж и, ако даден обект е записан в рамките на пълен израз, всеки и всички достъпи до него в рамките на същия израз трябва да бъдат пряко включени в изчисляването на стойността да бъдат написани.

person Abhineet    schedule 04.06.2014

Прочетете за точките на последователност тук, основно имате 2 присвоявания между 2 точки на последователност и това ще причиняват недефинирано поведение.

a++ ще увеличи стойността за a и след това ще я присвои на a и друго присвояване ще бъде направено от оператор =, докато a + 1 няма да промени стойността за a и ще имате само 1 присвояване между 2 точки на последователност

person LZR    schedule 04.06.2014