Приклад функції для виведення скалярного (цілого) значення
В прикладі формальним параметром функції fun є а - ім’я змінної типу int, а фактичним—вираз. Функція не повертає значення, а виводить значення а.
Фактичний параметр функції fun—результат виконання оператора присвоєння:
f=(c=d*e)+15
Він формується в такій послідовності:
спочатку обчислюється вираз: d*e;
виконується оператор присвоєння: c=d*e;
потім—оператор присвоєння:f=c+15.
# include <stdio.h>
# include <conio.h>
FILE *fr; //покажчик для файла результатів
//----функція для виведення скалярного значення;
void fun (int a) //функція розташована до викликаючої main і не потребує її
//оголошення
{fprintf (fr,” a =%d”,a);}
void main ( )
fr=fopen(“con”, “w”); clrscr( );
g=(f=(c=d*e)+15); //обчислення значення змінної g
fpuintf (fr, “g=%d”,g); // виведення значення g
fun ( f=(c=d*e)+15); // параметр—вираз в дужках
fpuintf (fr, “c=%d\n”,c); // виведення значення c
fclouse (fr); // кінець функції main
puintf (“\n Для завершення програми натисніть будь яку клавішу \n”);
getch ( )
}
Про локальні і глобальні змінні
Як уже згадувалось, змінні можуть оголошуватися або визначатись на самому початку програми, такі змінні називаються глобальними, тому що вони можуть бути використанні в будь-якій частині програми, наприклад в будь-якій функції. Такі змінні можуть оголошуватись або визначатися всередині якого-небудь блока заключеного в операторні дужки {}, наприклад всередині якої-небудь функції або складеного оператора. В цьому випадку, змінна якби існує тільки всередині цього блока, а при спробі звернутись ззовні цього блоку данна змінна не є визначеною. Такі змінні називають локальними.
Тобто для кожної змінної існує область видимості, в якій вона визначена. В межах області видимості ідентифікатори змінних не повинні співпадати, в той же час в різних областях видимості, наприклад, в різних блоках можуть існувати змінні з однаковими ідентифікаторами. Проте, ідентифікатори глобальної і локальної змінної можуть співпадати. При цьому зовні області видимості локальної змінної завжди відбувається звернення до глобальної, а в межах області видимості – до локальної.
Існує оператор розширення області видимості, який дозволяє звернутись до одноіменної глобальної змінної в межах області видимості локальної, він позначає як дві двокрапки ::, тобто якщо існує глобальна змінна s і локальна – s, то в межах видимості локальної s означає локальну, а ::s – глобальну.
Крім області видимості для кожної змінної існує ще і час життя, тобто час, коли вона знаходиться в пам’яті. Зазвичай глобальні змінні знаходяться в пам’яті весь час виконання програми, а локальні – тільки під час виконання блока, який складає їх область видимості, при чому при кожному зверненні до блока ці змінні створюються зоново і заново визначається їх значення. Це можливо змінити, якщо при оголошенні або визначенні задати специфікатор зберігання static.
Наприклад, якщо оголосити статичну локальну змінну всередині функції, то від виклика до виклику, дана змінна буде зберігати своє значення. Всі інші змінні створюються з специфікатором по замовчуванню auto, який завжди опускається, що означає, що змінні живуть тільки під час виконання даного блока. Також можливо використовувати специфікатор extern, щоб показати, що оголошена глобальна змінна також оголошується в другому модулі програми, і ці змінні суть одне і теж. Також використовується специфікатор register, якщо необхідно для швидкодії зберігати данну змінну в регістрах процесора.
Продемонструвати все сказане в відношенні до змінних на такому прикладі:
#include <conio.h>
#include <stdio.h>
int s=2; //визначаємо локальну змінну
/*визначаємо функцію f(), поки не замислимося, що це таке – просто окремий блок*/
void f()
{
int z=5; //визначаємо локальну змінну
/*визначимо статичну локальну змінну, ім’я якої співпадає з іменем глобальної*/
static int s=1;
printf(“%i%i%i”, s, ::s, z); //виведемо всі три значення
//змінимо значення локальних змінних на 1
s++;
z++;
};
/*визначимо функцію main()*/
void main()
{
clrscr();
f();//викликаємо функцію f()
s=7//змінимо значення глобальної змінної
f();//знову викличемо функцію f()
getch();
}
“%d” або“%i”- значення аргумента десяткове число
“%g”- виведення дійсного числа, яке виключає незначимі нулі
“%g”5.23
В результаті на екрані з’являться такі числа:
1 (значення локальної змінної s),
2 (значення глобальної змінної s),
5 (значення локальної змінної z),
2 (змінене значення локальної змінної s після операції s++, її значення зберігається між викликами функції),
7 (нове значення глобальної змінної)
5 (значення локальної змінної z, яке оновлюється при кожному виклику функції).
В прикладі використовувалась знайома вам функція printf(). Але в цьому прикладі ми виводим значення змінних, а не рядок тексту. Для цього достатньо в подвійних лапках написати %і – для виведення цілого числа або %f – для виведення дробового числа.
