Значение формальных параметров функции по умолчанию
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

Формальный параметр может иметь значение по умолчанию. Все параметры, стоящие справа от него тоже должны иметь значения по умолчанию. Эти значения передаются в функцию, если при вызове данные параметры не указаны.

 

#include <stdio.h>

void Name1 (float x, int y, char z='b') {

printf("x = %0.1f y = %d, z = %d \n", x,y, (int)z);

}

void Name2 (float x, int y=16, char z='a') {

printf("x = %0.1f y = %d, z = %d \n", x,y, (int)z);

}

void Name3 (float x=1.3, int y=4, char z='c') {

printf("x = %0.1f y = %d, z = %d \n", x,y, (int)z);

}

void main(void) {

Name1(1.0,2);

Name2(100.0);

Name3();

}

Перегрузка функций

 

Имена функций могут быть перегружены в пределах одной области видимости. Компилятор отличает одну функцию от другой по сигнатуре. Сигнатура задается числом, порядком следования и типами ее параметров.

 

#include <stdio.h>

#include <string.h>

int Name (int first) {

return first*first;

}

int Name (unsigned first) {

return first*first;

}

char Name (char first) {

return first*first;

}

int Name (int first,char *second) {

return first*strlen(second);

}

float Name (float r) {

return r*r;

}

double Name (double r) {

return r*r;

}

void main(void) {

printf("%d\n", noName(4));

printf("%d\n", noName((unsigned)4));

printf("%c\n", noName('c'));

printf("%d\n", noName(4,"cлово"));

printf("%0.2f\n", noName((float)1.2));

printf("%0.2lf\n", noName((double)1.2));

}

 

КЛАССЫ ПАМЯТИ И ОБЛАСТЬ ДЕЙСТВИЯ

 

До сих пор мы имели дело с локальными переменными, которые доступны только в одной функции. В данном случае переменные a, b в main() и myfunc() являются разными переменными.

 

void myfunc(int, int);

void main (void){

int a=5, b=10;

printf ("%d %d\n", a, b);

myfun (a, b);

printf ("%d %d\n", a, b);

 }

 void myfun (int a, int b){

a++; b++;

printf ("%d %d\n", a, b);

 }

 

Каждая существует только в своей функции и доступна только в ней. Физически это разные ячейки памяти. Такие переменные называются "локальными". Но иногда требуются переменные доступные из любой функции и даже модуля программы. Такие переменные называются "глобальными".

Каждая переменная в Си принадлежит некоторому классу памяти. Всего существует 5 классов памяти. Для их описания используются ключевые слова:

extern - внешний,

auto - автоматический,

static - статический

register - регистровые.

 

Глобальные переменные

 

1. Extern - внешние переменные

Хранятся в области данных программы. Определяются до main() и доступны в любой функции программы. Время жизни - программа. При определении инициализируются по умолчанию 0 на стадии компиляции. Область видимости вся программа.

 

int count;

void main (void){

count ++;

.........

}

fun (){

printf ("%d\n", count);

}

 

Переменная count является внешней и доступна в обеих функциях.

Если в программе есть одноименная локальная переменная, она закрывает глобальную переменную. Для расширения видимости операция расширения доступа ::

 

int count;

void main (void){

int count; //автоматическая переменная

::count++;

             ..........

printf(“%d”,::count);

}

void fun (void){

 count ++;

printf ("%d\n",count);

}

 

Если переменная определяется в одном модуле, но к ней есть обращение в другом, то нужно обязательно это указать, объявив ее как внешнюю, иначе будет создана новая переменная с этим именем.

 

  I модуль.                                              II модуль.

int cost;                                                 void func (void){

void main (void){                                   extern int cost;

............                                               ................

}                                                            }

                                                      

Статистические внешние переменные - static

Область видимости ограничена одним модулем. Доступны всем функциям в одном модуле. Время жизни работа всей программы. Инициализируются по умолчанию 0 на стадии компиляции. Создаются в области данных программы.

 

static int num;

void main (void){

int count;

for (count=1; count<5; count ++){

printf ("%d\n", count);

fun ();

}

}

void fun (void){

int i=1;

num ++;

printf ("%d %d\n", i, num);

}

 

Локальные переменные

 

3. Внутренняя статическая переменная

Ключевое слово static . Объявляется и определяется внутри одной функции, блока. Инициализируют 0 на стадии компиляции. Создаётся в области данных. Время жизни - работа всей программы, но область видимости только эта функция. При многократном вызове сохраняет своё значение. Инициализирует только 1 раз.

 

void main (void){

int count;

for (count=1; count<5; count ++){

printf ("%d\n", count);

fun ();

}

}

void fun (void){

static int num;

int i=1;

printf ("%d %d\n", i, num++);

}

4. Регистровая переменная

Ключевое слово register int i . Помещаются в регистры микропроцессора для увеличения скорости вычисления. Если нет свободного регистра, рассматриваются как автоматические. Область видимости блок, в котором были определены. По умолчанию не инициализируются.

 

5. Автоматические переменные

Ключевое слово auto . Определяются внутри любого блока. Время жизни работа блока. Создаются в области стека. Область видимости блок, в котором были определены. По умолчанию не инициализируются.

 

Пример 1.

if (i==1){

int j=0;

int k=1;

i++;

}

printf(“%d %d”,j,k); //сообщение об ошибке

 

Пример 2.

int i;

......

{

int i; Внешнее i не видимо

......

}

 ...... Здесь опять ее видно

Существуют понятия: область видимости и область существования. Область видимости не может выходить за область существования, но область существования может превышать область видимости.

 

Дата: 2018-12-28, просмотров: 341.