Руководство полного чайника по программированию на языке Си


КАК ПРОИСХОДИТ ВЫЗОВ ФУНКЦИИ - часть 4


имя_функции(..., ..., ....) арг1 арг2 арг3

в месте вызова функции.

То есть

ОПИСАНИЕ ФУНКЦИИ:

int f(int арг1, int арг2, int арг3){ int перем1, перем2; ... /* продолжение */ }

ВЫЗОВ:

.... f(выражение1, выражение2, выражение3) ...

ТО В ТЕЛЕ ФУНКЦИИ ВЫПОЛНИТСЯ (в момент ее вызова):

арг1 = выражение1; арг2 = выражение2; арг3 = выражение3;

перем1 = МУСОР; перем2 = МУСОР;

... /* продолжение */

ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ =====================

Наконец, существуют переменные, которые объявляются ВНЕ ВСЕХ ФУНКЦИЙ, и существующие все время выполнения программы (а не только то время, когда активна функция, в которой они созданы).

Локальные переменные и аргументы УНИЧТОЖАЮТСЯ при выходе из функции. Глобальные переменные - нет.

int x = 12; /* ::x - ей можно заранее присвоить константу */ int globvar; /* ::globvar */

int f1(){ int x; /* f1::x */

x = 77; printf("x=%d\n", x); /* 4 */ return x; }

int f2(){ printf("x=%d\n", x); /* 5 */ return 0; }

void main(){ int x, y; /* main::x */

x = 111; /* 1 */ printf("x=%d\n", x); /* 2 */ printf("glob=%d\n", globvar); /* 3 */

y = f1(); y = f2(); }

В данном примере мы видим: - во-первых мы видим ФУНКЦИИ БЕЗ ПАРАМЕТРОВ. Это нормальная ситуация. - во-вторых тут используются ТРИ переменные с именем "x".

Как выполняется программа?

/* 1 */ main::x = 111; Это локальный x, а не глобальный. Глобальный x попрежнему содержит 12.

/* 2 */ Напечатает значение переменной main::x, то есть 111. Внутри функции main глобальная переменная ::x заслонена своей собственной переменной x. В данном случае НЕТ СПОСОБА добраться из main к глобальной переменной x, это возможно только в языке Си++ по имени ::x

К переменной же globvar у нас доступ есть.

/* 3 */ Печатает ::globvar. Мы обнаруживаем, что ее значение 0. В отличие от глобальных переменных, которые изначально содержат МУСОР, глобальные переменные изначально содержат значение 0.

В рамочку, подчеркнуть.

/* 4 */ При вызове f1() переменная f1::x заслоняет собой как main::x так и ::x




- Начало -  - Назад -  - Вперед -