#c #performance #g #cygwin
Вопрос:
Я прошел продвинутый курс C по Udemy, и там возник вопрос: каким будет результат следующего кода?
#include <stdio.h>
int main(void){
static int i=5;
if(--i){
main();
printf("%d ", i);
}
}
Правильный ответ таков 4 3 2 1
, но когда я запускаю этот код в своей IDE (и онлайн-компиляторах), он печатается 0 0 0 0
.
В курсе лектор использует компилятор cygwin, а у меня g . Может ли это быть причиной несоответствия?
Также мне интересно, работает ли if(--i)
метод быстрее, чем for
цикл, с точки зрения производительности?
Спасибо.
Комментарии:
1. На самом деле это похоже на опечатку. Код лекторов выполнил печать перед рекурсивным вызовом.
2. Было название класса «как написать действительно плохой код на C?». Из изучения этого кода нет ничего полезного — просто не вызывайте main() рекурсивно. В некоторых системах он может даже включать ЭЛТ, которая может выполнять специализированные функции с основной функцией за линией. Рекурсия в целом имеет очень ограниченное применение, и обычно просто вредно узнавать об этом, так как около 95% всех примеров рекурсии, которые мы видим здесь, ужасно неэффективны и/или опасны.
3. Что говорит @Lundin. Я работаю в этой отрасли уже давно, и единственный раз, когда я могу вспомнить явное использование рекурсии, — это при обработке деревьев папок и решении игры с числами обратного отсчета. Вот и все:)
4. В дополнение к комментариям, приведенным здесь, не пишите
main(void)
, а пишите какmain()
. Этоvoid
означает, что функция не должна принимать параметры, в то времяmain
как по определению может принимать параметры. Используя пустые скобки, вы просто выражаете, что вам наплевать на параметры.
Ответ №1:
Причина main()
в том, что это называлось раньше printf("%d ", i)
. Поэтому, когда блок выполняется, main()
функция вызывается перед печатью значения i
, и она продолжает делать это, пока if-condition
не станет ложной. Здесь if-condition
стало ложным, когда i
равно 0
. Когда значение if-contidion
равно false, функция возвращается в предыдущее состояние , из которого она была вызвана, а затем выводит значение i
, которое сейчас 0
.
Для печати 4 3 2 1
выведите значения перед вызовом main()
функции , как показано ниже
int main(void){
static int i=5;
if(--i){
printf("%d ", i);
main();
}
}
Комментарии:
1. о… ты прав… моя ошибка, спасибо
Ответ №2:
Опубликованный код должен быть напечатан 0 0 0 0
, потому printf
что он находится после рекурсивного вызова, т. Е.
main(); // Recursive call
printf("%d ", i); // Print after
Если вы вместо этого сделаете:
printf("%d ", i); // Print before
main(); // Recursive call
результатом будет 4 3 2 1
Поэтому я думаю, что ваш лектор использовал последнюю форму, а вы использовали первую форму, т. Е. другой код, другие результаты
Комментарии:
1. большое вам спасибо, вы совершенно правы