Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Из стандарта, я понял, что вызов функции является sequence point.
А>Двумя.
то есть перед началом вызова и после вызова?
А>>Если это так, объясните мне, как работает следующий фрагмент кода:
А>Следующий фрагмент кода не работает.
он работает даже если тут UB, просто на всех компиляторах по-разному. И ИМХО нет тут никакого UB.
operator<< принимает один аргумент код эквивалентен серии вложенных вызовов operator<<
откуда здесь возмётся UB?
А>А>>#include <iostream>
А>>int f(int i) { return i;}
А>>void main()
А>>{
А>> int i = 0;
А>> std::cout << f(i) << " " << f(i++) << " " << f(++i) << " " << f(i++) << std::endl;
А>>}
А>
А>>Или здесь UB?
А>Да.
А>>Почему?
А>Потому, что переменная i модифицируется более одного раза между двумя соседними точками следования.