Это еще один вопрос о последовательности, но довольно простой:
#include <stdio.h>
void f(int p, int) {
printf("p: %d\n", p);
}
int g(int* p) {
*p = 42;
return 0;
}
int main() {
int p = 0;
f(p, g(&p));
return 0;
}
Это неопределенное поведение? Или звонит g(&p)
выступать в роли последовательности?
Нет, это не вызывает не определено поведение. Просто неопределенные, поскольку порядок, в котором оцениваются аргументы функции, не указан в Стандарте. Таким образом, выход может быть 0
или же 42
в зависимости от порядка оценки, определенного вашим компилятором.
Поведение программы не определено, так как мы не знаем порядок вычисления аргументов функции из проект стандарта C ++ 1.9
Выполнение программы пункт 3:
Некоторые другие аспекты и операции абстрактной машины описаны в этом международном стандарте как не указано (например, порядок вычисления аргументов функции). Там, где это возможно, этот международный стандарт определяет набор допустимого поведения. […]
и все побочные эффекты от аргументов секвенируются до входа в функцию, из раздела 5.2.2
Функциональный вызов параграф 8:
[Примечание: оценки выражения postfix и выражений аргумента не являются последовательными по отношению друг к другу. Все побочные эффекты при оценке выражений аргументов секвенируются до входа в функцию (см. 1.9). —Конечная записка]
Что касается C
обе точки рассматриваются в Проект стандарта C99 в разделе 6.5.2.2
Функция вызывает пункт 10:
Порядок оценки обозначения функции, фактические аргументы и
подвыражения в фактических аргументах не определены, но есть точка последовательности
до фактического звонка.
Так в обоих C
а также C++
вы можете в конечном итоге либо f(0,0)
или же f(42,0)
,