вот два разных кода:
основная функция:
int main()
{
int i=3+gets(); //it calls gets() and store value in i//
return 0;
}
Рекурсивная функция:
int fact(n)
{
if(n==0)
return 1;
int i=fact(n/2); //Why fact() is not called here//
return i;
}
Мой вопрос в том, что:
Почему fact() не вызывается во время инициализации, но в main() вызывается функция gets()?
Разница между этими двумя фрагментами кода заключается в том, что в первой функции кодов функция получает элемент управления, а его stetemnets выполняются последовательно, за исключением операторов бранча. Поэтому, когда оператор
int i=3+gets();
получает управляющую функцию gets().
Во втором описании фрагмента кода
int i=fact(n/2);
не будет выполняться до тех пор, пока функция fact() не получит контроль. Вы могли бы добиться такого же эффекта, если бы вы писали, например
int main()
{
int i= fact( 10 );
return 0;
}
В этом случае будет вызван функциональный факт, и его тело будет выполнено.
Также можно вызвать функцию fact(), если вы определяете глобальную переменную, которая находится вне любой функции, и эта глобальная переменная будет содержать инициализатор, который вызывает функцию fact(). Например
int j = fact( 10 );
int main()
{
int i=3+gets(); //it calls gets() and store value in i//
return 0;
}
int j = fact( 10 );
: элемент initializer не является константой времени компиляции
Функция gets() является библиотечной функцией в C++, которая считывает символы из стандартного ввода и сохраняет их как строку C в строку до тех пор, пока не будет достигнут символ новой строки или конец файла.
пожалуйста, можете ли вы четко указать свое предполагаемое значение "время инициализации", вы имеете в виду время инициализации программы или функцию main()?
gets()
не будет вызываться во время любой "инициализации", он будет вызываться, когда выполнение достигнет его. В вашем коде это означает, что он будет вызываться немедленно, поскольку это первое действие в main
.
В вашей функции fact
вы получите только рекурсивный вызов, если условие if(n==0)
ложно.
Кстати, предполагая, что на fact
вы имеете в виду факториала, то ваша функция неверна. Это должно быть примерно так:
int fact(int n)
{
if(n == 0)
{
return 1;
}
else
{
return n * fact(n - 1);
}
}