Na przykład:i = i ++; jest niezdefiniowany. Czy i = foo (i ++) również jest niezdefiniowane?
int foo(int i) { return i; }
int main()
{
int i = 0;
i = i++; // Undefined
i = foo(i++); // ?
return 0;
}
Co obecna norma ISO C++ byłoby określić w tym przypadku?
EDIT:
Oto gdzie mogę się mylić:
ile nie zaznaczono inaczej, oceny argumentów poszczególnych operatorów i podwyrażeń poszczególnych wyrażeń są unsequenced.
przypadku efektem ubocznym w skalarnej przedmiotu jest unsequenced względem albo innego efektu siebie na tej samej skalarnej obiektu lub obliczania wartości stosując wartość samej skalarnej obiektu i nie są one potencjalnie zbieżnego (1.10) nieokreślone jest zachowanie .
We wszystkich przypadkach przyporządkowanie jest zsekwencjonowany po wartość obliczania prawo i lewo argumentów, a przed obliczania wartości wyrażenia przypisania
Każda ewaluacja w funkcji wywołującej (w tym innych wywołań funkcji), które w innym przypadku nie jest specyficznie oznaczony przed lub po wykonaniu treści wywoływanej funkcji w sposób nieokreślony sekwencyjnie z względem wykonania wywoływanej funkcji.
Więc wydaje się, że można mieć do obliczenia wartości po lewej stronie przypisania (tylko i
), a efekt uboczny po prawej stronie (modyfikacja i
z i++
), które nie są wyświetlane sekwencyjnie w odniesieniu do siebie nawzajem.
EDIT2:
Dla każdego, kto znajdzie się tutaj, jest naprawdę świetny wyjaśnienie o sekwencjonowanie że znalazłem here.
'foo (i ++)' jest w porządku, 'foo (i, i ++)' jest niezdefiniowane –
foo (i ++) tworzy kopię, nie zwiększając jej wartości, jeśli spróbujesz wydrukować i po wywołaniu funkcji. Ale foo (++ i) faktycznie to robi. Spójrz na zbiór –
'foo (i ++)' jest w porządku, 'foo ((i, i ++))' jest również w porządku. – haccks