Krótka odpowiedź:
Powróci kopię var
a następnie zaraz potem zwiększamy globalny var
.
Długa odpowiedź:
C11 6.5.2.4
„Wynik Postfix ++ operator jest wartość argumentu jako efekt uboczny, wartość przedmiotu argumentu jest. inkrementował .. "./-/ Obliczenie wartości wyniku jest sekwencjonowane przed efektem ubocznym aktualizowania zapisanej wartości argumentu operacji.
Standard 5.1.2.3 „Realizacja programu” określa, że wszystkie skutki uboczne musi być oceniana zanim program napotka punkt sekwencji. (Wiele informacji na temat punktów sekwencji można znaleźć here).
Istnieje punkt sekwencji po instrukcji return
(C11 6.8/4).
Oznacza to, że wyrażenie var++
ma być całkowicie ocenione, zanim jakikolwiek kod w głównej() będzie kontynuowany.
Kod maszyna będzie wyglądać ten kod pseudo:
- Store lokalna kopia
var
na stosie (albo w rejestrze itd)
- Zwiększenie globalnego
var
z 1.
- Return z podprogramu.
- Użyj "copy-of-
var
".
Jeśli zamiast tego użyłeś przyrostu prefiksu, operacja zwiększania zostałaby zsekwencjonowana przed zapisaniem kopii.
Jego stara wartość jest zwracana, a zwiększana wartość jest przechowywana. –
Tak. Wygląda na to, że działa zgodnie z oczekiwaniami. Po prostu nie jestem pewien, czy to jest właściwe, aby sądzić według standardu. – mgoszcz2
W porządku - tak dobrze jak zmienne globalne. –