Пишете ли Вы еще на C++? (Помню, Вы как-то упоминали, что читали стандарт.) Если да, то как Вы думаете, будет ли неопределенное поведение в коде i = f(i++); i, понятно, встроенного типа.
Да, и вот еще, что меня всегда интересовало: еще в каких-нибудь источниках, кроме Авсония, упоминается история о том, как при высадке под Троей Одиссей обманул Протесилая, спрыгнув на щит?
Пишу, но редко в последний год. Неопределенного поведения не будет, значение i будет равно тому, что вернет f. Правильное ключевое слово для поиска - sequence points.
А вот мне кажется, что здесь не все так просто. Sequence point перед входом в функцию гарантирует, что side effect инкремента произойдет до входа в функцию. А вот про side effect присваивания известно только, что он произойдет где-то до sequence point в конце full expression. Где гарантия, что это будет после возвращения из функции? Кроме, понятно, здравого смысла.
Текст стандарта: When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body. There is also a sequence point after the copying of a returned value and before the execution of any expressions outside the function).
no subject
Date: 2010-06-09 09:26 am (UTC)Да, и вот еще, что меня всегда интересовало: еще в каких-нибудь источниках, кроме Авсония, упоминается история о том, как при высадке под Троей Одиссей обманул Протесилая, спрыгнув на щит?
no subject
Date: 2010-06-09 09:34 am (UTC)На второй вопрос не знаю ответа.
no subject
Date: 2010-06-09 09:53 am (UTC)Вопрос, разумеется, сугубо теоретический.
no subject
Date: 2010-06-09 09:58 am (UTC)When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body. There is also a sequence point after the copying of a returned value and before the execution of any expressions outside the function).