Виды возвращаемых значений и механизмы их формирования.

Функции стандартной библиотеки

Переменное число параметров функции.

Си допускает использование переменного числа параметров.

Специфика вызова:

1) признаком функции с переменным числом аргументов является многоточие в списке параметров;

2) встретив … компилятор прекращает контроль соответствующего типа;

3) у функции должен быть хотя бы один обязательный параметр;

4) функция с переменным числом параметров должна иметь способ определения их точного числа при каждом вызове;

int Func(int i; …);
int Func (int i, float z, …);

Признаком конца списка параметров является -1.

int Func(int i, …)
{
int count=0, sum=0;
int *p=&i;
while(*p!=-1)
{
count ++;
sum+=*p++;
}
return sum;
}


(printf, scanf).

int printf( const char *, …);

Функция printf предназначена для перевода указанных программистом в качестве необязательных параметров значений в строковое представление.

Функция определяет точное число необязательных параметров, подсчитывая количество символов % в единственном обязательном параметре.

%c – char

%d – int

%i – int

%e – exp // x=1,1e+0,02

%f – float

%g – float , но без лишних нулей

%o – восьмеричное представление числа

%p – значение адреса указателя в шестнадцатеричном виде

%s – массив строк

%u – преобразование аргумента к целому беззнаковому в десятичном виде

%x - преобразование аргумента к целому беззнаковому в шестнадцатеричном виде

 

int m = -1;

printf(“%x”,m);

 

%[+-n]s (строка символов)

%[+-n]f (дробное число в фиксированном формате)

%[+-n]e (количество цифр после десятичной точки)

%[+-n]i (d) (количество выводимых цифр)

%[+-n]g (максимальное количество цифр)

 

Пользовательский тип
Адрес
Базовый тип
Возвращаемое значение

 


           
   
 
указатель
 
ссылка
 

 


Функция может возвращать:

-объект базового типа;

-объект пользовательского типа;

-указатель или ссылку;

bool func(); //базовый тип
main()
{
bool b= Func();
}

int &f()
{
static int n;
return n;
}

Проблемы при возвращении ссылки или указателя.

int *f1(int n)
{
int nN=n*5;
//return &nN;
}
//функция возвращает указатель на область памяти в стеке, которая после возвращения из функции может быть задействована компилятором для других целей

int &f2(int n)
{
int nN=n*5;
return nN;
} //
функция возвращает указатель на локальную временную переменную

int main()
{
z=f2(1) +f2(2)+f2(3);
}

Нельзя возвращать адреса локальных объектов.

Возвращать можно:

1) указатель или ссылку на объект со статическим временем существования;

2) указатель на строковый литерал;

3) указатель на динамически созданный объект.