Что происходит, когда функция явно не возвращает значение? не могу понять, как происходит вывод кода

Я столкнулся с вопросом в серии тестов, который, когда я решал его вручную в соответствии с моими знаниями программирования на C, должен был дать результат, который не соответствовал ни одному из заданных вариантов.

Мой вывод = '++++'

Вопрос: Вывод следующей программы c?

 #include <stdio.h>

 int f(int x) 
 {
     if (x==2){ return 2; } 
     else{ printf("+"); f(x-1); }
 }
 int main() 
 {
     int n = f(6); 
     printf("%d",n); 
     return 0; 
 }

Параметры:

  1. '++++2' (правильный вариант в соответствии с ключом ответа)
  2. '+++++2'
  3. '++++++'
  4. '2'

Моя логика: поскольку в конце f(6) ничего явно не возвращает [только f(2) возвращает значение 2 в f(3)], вывод должен содержать только 4 раза '+' из-за каждого вызова f (6), f(5), f(4) и f(3).

Ниже приведены некоторые тестовые коды и скриншоты их результатов, которые я пробовал на онлайн-компиляторах C — «codechef» и «onlinegdb», — но я также не мог понять их результаты. Пожалуйста помоги!

Кодшеф

Онлайнgdb 1

Онлайнgdb 2

Если функция объявлена ​​как возвращающая тип и завершается без оператора return, поведение не определено.

Barmar 18.12.2020 17:49

Ответ 5. Ни один и/или все вышеперечисленное. Либо этот ответ, либо код неверный. Они оба не правильные. Единственная причина, по которой вы получите 2 обратно, заключается в том, что по чистой случайности стек содержит 2, и это если вы компилируете в режиме YOLO, где вы не генерируете ошибки в этой функции, не имея возвращаемого значения в каждом возможный случай.

tadman 18.12.2020 17:51

То, что он делает X последовательно в компиляторе Y, не означает, что это определенное поведение. Это просто означает, что компилятор работает определенным образом.

tadman 18.12.2020 17:54

Код был бы хорошо определен, если бы блок else имел return f(x-1);

Barmar 18.12.2020 17:55

Если компилятор не выдает что-то вроде: error: non-void function does not return a value in all control paths, то нужно использовать другой компилятор или включить диагностику.

William Pursell 18.12.2020 17:56

Выполнение функции никогда не достигает отсутствующего return X при первоначальном вызове как f(6)

Weather Vane 18.12.2020 17:56

@WeatherVane Да, это так. После того, как все рекурсивные вызовы возвращаются.

Barmar 18.12.2020 17:58

@ Бармар, да, верно.

Weather Vane 18.12.2020 17:59

Это просто опечатка в вопросе.

Artefacto 18.12.2020 17:59

Это неопределенное поведение, но (а) не является маловероятным ответом на практике.

user253751 18.12.2020 18:31
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
10
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если функция определена как возвращающая значение, а она этого не делает, то попытка использовать возвращаемое значение приводит к неопределенному поведению.

Это задокументировано в разделе 6.9.1p12 стандарта C:

Если достигается }, завершающая функцию, и вызывающая сторона использует значение вызова функции, поведение не определено.

В основном это означает, что результат не является предсказуемым и/или последовательным.

Другие вопросы по теме