Каково возвращаемое значение f (p, p), если значение p равно , инициализированному до 5 перед вызовом? Обратите внимание, что первый параметр - , переданный по ссылке, тогда как второй параметр передается по значению.Неопределенное поведение в заданном коде?
int f (int &x, int c) { c = c - 1; if (c==0) return 1; x = x + 1; return f(x,c) * x; }
Варианты:
Я пытаюсь объяснить:
В этом коде, будет четыре рекурсивных вызовов с параметрами (6,4), (7,3), (8,2) и (9,1). Последний вызов возвращает 1. Но из-за прохождения по ссылке x во всех предыдущих функциях теперь 9. Следовательно, значение, возвращаемое f (p, p), будет 9 * 9 * 9 * 9 * 1 = 6561.
Этот вопрос со вступительного экзамена GATE, (see Q.no.-42). Ключ ответа задается GATE «Пометки для всех» (означает, что нет правильной опции). key set-C, Q.no.-42. Где-то объясняется как:
В GATE 2013 были присвоены отметки всем, поскольку один и тот же код в C/C++ создает неопределенное поведение. Это связано с тем, что *
не является точкой последовательности в C/C++. Правильный код должен заменить
return f(x,c) * x;
с
res = f(x,c);
return res * x;
Но данный код работает отлично. Является ли ключ GATE неправильным? Или это действительно ошибка с вопросом?
Одна из вещей, которые могут произойти, если вы пересечете улицу, не глядя в обоих направлениях, - это безопасное перемещение на другую сторону. Но это ошибка * предсказать *, что человек, который пересекает улицу, не глядя в обоих направлениях, будет безопасно перемещаться на другую сторону. –
Как [неопределенность по поведению Sequence Point, неопределенное поведение?] (Http://stackoverflow.com/q/29513572/1708801) –