Zachowanie programu jest nieokreślony, ponieważ nie wiemy, kolejność oceny argumentów funkcji, z draft C++ standard1.9
Programu wykonania ustępu 3:
Niektóre inne aspekty i operacje abstrakcyjna maszyna jest opisana w tym międzynarodowym standardzie jako nieokreślona (na przykład kolejność oceny argumentów funkcji). Tam, gdzie jest to możliwe, niniejszy Międzynarodowy Standard definiuje zbiór dozwolonych zachowań. [...]
i wszystkie efekty uboczne argumentów sekwencjonuje zanim funkcja zostanie wprowadzony, z sekcji 5.2.2
Funkcja połączeń ustęp 8:
[Uwaga: oceny z Postfix wyrażenie i wyrażeń argumentów są wszystkie w stosunku do siebie. Wszystkie skutki uboczne ocen ekspresji argumentu są sekwencjonowane przed wprowadzeniem funkcji (patrz 1.9). -end uwaga]
chodzi o C
oba punkty są pokryte w C99 draft standard w sekcji 6.5.2.2
wzywa Funkcja pkt 10:
Kolejność oceny desygnatora funkcji, rzeczywiste argumenty i Podwyrażenia w rzeczywistych argumentach są nieokreślone, ale przed rzeczywistym połączeniem istnieje punkt sekwencji .
więc zarówno C
C++
i może skończyć się albo f(0,0)
lub f(42,0)
.
Pytanie także pyta, czy 'g (& p)' działa jako punkt sekwencyjny. W ocenie 'g (& p)' występują dwa punkty kolejności: Pomiędzy oceną 'g' a oceną' & p' oraz między oceną "pełnych wyrażeń" '* p = 42;' oraz '0' w' return'. Ale żaden z nich nie nakazuje oceny argumentu 'p' w odniesieniu do oceny' g (& p) '. –
@EricPostpischil: Świetny komentarz. :-) – Nawaz