Мова програмування Сі
Змінна може бути визначена на зовнішньому рівні всередині вихідного файлу тільки один раз. Якщо задається специфікатор класу пам'яті static. то в інших вихідних файлах можуть бути визначені змінні з тим же ім'ям. Так як кожне визначення static мабуть тільки в межах свого власного вихідного файлу, то конфлікту не виникне.
Мова програмування Сі
extern int i; / * Reference to i defined below * /
printf ( ". \ n", i); / * I equals 4 * / next ();
int i = 3; / * Definition of i * / next ()
printf ( ". \ n", i); / * I equals 5 * / other ();
Мова програмування Сі
Специфікатор класу пам'яті register повідомляє компілятору про те, щоб він розподілив пам'ять під змінну в регістрі, якщо це можливо. Використання реєстрової пам'яті зазвичай призводить до більш швидкому часі доступу і до меншого розміру результуючого коду. Змінні, оголошені з класом пам'яті register мають ту ж саму видимість, що і змінні auto.
Змінна, оголошена на внутрішньому рівні зі специфікатором класу пам'яті static. має глобальне час життя і має видимість тільки всередині блоку, в якому вона оголошена. На відміну від змінних auto. змінні, оголошені як static. зберігають своє значення при завершенні блоку.
Змінні класу пам'яті static можуть бути ініційовані константним виразом. Якщо явною ініціалізації немає, то змінна класу пам'яті static
Мова програмування Сі
автоматично встановлюється в 0. Ініціалізація виконується один раз під час компіляції. Ініціалізація змінної класу пам'яті static не повторюється при новому вході в блок.
Змінна, оголошена зі специфікатором класу пам'яті extern. є посиланням на змінну з тим же самим ім'ям, певну на зовнішньому рівні в будь-якому вихідному файлі програми.
Приклад: int i = 1; main ()
/ * Reference to i, defined above * / extern int i;
/ * Initial value is zero; a is visible only within main * / static int a;
/ * B is stored in a register, if possible * / register int b = 0;
/ * Default storage class is auto * / int c = 0;
/ * Values printed are 1, 0, 0, 0 * / printf ( ". \ N. \ N. \ N. \ N", i, a, b, c); other ();
/ * I is redefined * / int i = 16;
/ * This a is visible only within other * / static int a = 2;
/ * Values printed are 16, 4 * / printf ( ". \ N. \ N", i, a);
Мова програмування Сі
змінну i зовнішнього рівня. Мінлива класу пам'яті static автоматично встановлюється в 0. так як ініціалізатор опущений. Виклик функції print (передбачається, що функція print визначена в якому то місці вихідної програми) друкує величини 1. 0. 0. 0.
У функції other. змінна i переопределяется як локальна змінна з початковим значенням 16. Це не впливає на значення зовнішньої змінної i. Мінлива a оголошується як змінна класу пам'яті static з початковим значенням 2. Вона не суперечить змінної a. оголошеної в функції main. так як видимість змінних класу пам'яті static на внутрішньому рівні обмежена блоком, в якому вона оголошена.
Функції можуть бути оголошені з специфікаторами класу пам'яті static або extern. Функції завжди мають глобальне час життя.
Функції, оголошені як extern видимі в межах всіх вихідних файлів, які складають програму. Будь-яка функція може викликати функцію extern.
Синтаксично записи ініціалізатор передує знак
Мова програмування Сі
Змінні, оголошені на зовнішньому рівні, можуть бути ініційовані. Якщо вони явно не ініціалізовані, то вони встановлюються в нуль під час компіляції або лінкування. Будь-яка змінна, оголошена зі специфікатором класу пам'яті static. може бути инициализирована константним виразом. Ініціалізація змінних класу static виконується один раз під час компіляції. Якщо відсутня явна ініціалізація, то змінні класу пам'яті static автоматично встановлюються в нуль.
Базові типи і типи покажчиків
Величина вираження присвоюється змінної. Для вираження допустимі правила перетворення.
Мова програмування Сі
список ініціалізаторів
Для кожного списку ініціалізації значення константних виразів присвоюються в порядку проходження елементів складовою змінної. Коли инициализируется суміщення, то список ініціалізаторів є єдине константний вираз. Величина константного виразу присвоюється першому елементу суміщення.
Якщо в списку ініціалізації менше величин, ніж їх є в складеному типі, то залишилися пам'яті инициализируются нулем. Якщо число ініціюючих величин більше ніж потрібно, то видається помилка.
Ці правила застосовуються до кожного вкладеного списку ініціалізаторів, точно так само як і до всієї конструкції в цілому.
Ці додаткові коми допускаються, але не потрібні. Потрібні тільки ті коми, які поділяють вирази зі сталими та списки ініціалізації. Якщо список ініціалізаторів не структурований під складений об'єкт, то його величини присвоюються в тому порядку, в якому подстиковани елементи об'єкта.
Фігурні дужки можуть також з'являтися навколо індивідуальних ініціалізаторів в списку.
Коли не започатковано складові змінні, то потрібно подбати про те, щоб правильно використовувати фігурні дужки і списки ініціалізаторів. У наступному прикладі ілюструється більш детально інтерпретація компілятором фігурних дужок.
Мова програмування Сі
Масив може бути инициализирован рядковим літералом.
char code [] = "abc";
инициализирует code як масив символів з чотирьох елементів. Четвертим елементом є символ \ 0. який завершує всі рядкові літерали.
char code [3] = "abcd"
У прикладі тільки три перші символу ініціалізатор призначаються для масиву code. Символ d і символ нуль відкидаються.
Якщо рядок коротше, ніж специфікований розмір масиву, то що залишилися елементи масиву не започатковано нулем (символом \ 0).
Типи структур, поєднань і перерахувань
Мова програмування Сі
яка оголошується. Іменем структури, поєднання або перерахування є тег.
typedef
Іменами для основних, які перераховують, структурних і які суміщають типів є специфікатор типу для кожного з них. Імена для типів покажчика, масиву і функції задаються наступною синтаксичної формою:
Мова програмування Сі
абстрактний декларатор
Вирази і присвоювання
У Сі присвоюються значення виразів. Крім простого присвоювання за допомогою операції =. Сі підтримує складові операції привласнення, які перед привласненням виконують додаткові операції над своїми операндами. Остаточне значення результату залежить від старшинства операцій і від побічних ефектів, якщо вони виникають. Порядок обчислення встановлюється певним групуванням операндів і операцій у виразі. Побічний ефект - це зміни стану машини, викликані в процесі обчислення виразу.
У вираженні з побічним ефектом, обчислення одного операнда може залежати від значення іншого. Для одних і тих же операцій від порядку, в якому обчислюються операнди, також залежить результат виразу.
Величина, яка надається кожним операндом в вираженні, має тип, який може бути перетворений до інших типів в певному контексті. Перетворення типів мають місце в