Точка последовательности из вызова функции?

Это еще один вопрос о последовательности, но довольно простой:

#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) выступать в роли последовательности?

7

Решение

Нет, это не вызывает не определено поведение. Просто неопределенные, поскольку порядок, в котором оцениваются аргументы функции, не указан в Стандарте. Таким образом, выход может быть 0 или же 42 в зависимости от порядка оценки, определенного вашим компилятором.

9

Другие решения

Поведение программы не определено, так как мы не знаем порядок вычисления аргументов функции из проект стандарта 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),

4

По вопросам рекламы [email protected]