Введення в с

Більшість операторів є операторами вираз, які мають вигляд вираження;
Зазвичай оператори вираз є присвоювання і викликами функцій.


Якщо який-небудь з ідентифікаторів в спіске_опісаній був раніше описаний, то зовнішнє опис виштовхується на час виконання блоку, і знову входить в силу після його закінчення. Кожна ініціалізація auto або register змінних проводиться кожного разу при вході в голову блоку. У блок робити передачу; в цьому випадку ініціалізації не виконуються. Ініціалізації змінних, що мають клас пам'яті static (# 4.2) здійснюються тільки один раз на початку виконання програми.


В обох випадках обчислюється вираз, і якщо воно не нуль, то виконується перший подоператор. У другому випадку другий подоператор виконується, якщо вираз є 0. Як завжди, неоднозначність "else" дозволяється за допомогою того, що else зв'язується з останнім зустрічним if, які не мають else.


Виконання подоператора повторюється, поки значення виразу залишається ненульовим. Перевірка виконується перед кожним виконанням оператора.


Виконання подоператора повторюється до тих пір, поки значення виразу не стане нулем. Перевірка виконується після кожного виконання оператора.


Цей оператор еквівалентний наступному:


Перший вираз задає ініціалізацію циклу; другий вираз задає здійснювану перед кожною итерацией перевірку, по якій проводиться вихід з циклу, якщо вираз стає нулем; третє вираз часто задає приріст, що виконується після кожної ітерації.
Кожне або всі вирази можуть бути опущені. Відсутність вираженія_2 робить мається на увазі while-пропозиція еквівалентним while (1); інші опущені вираження просто пропускаються в описаному вище розширенні.


Вираз повинен бути цілого типу або типу покажчика. Будь-оператор всередині оператора може бути позначений одним або більше префіксом case наступним чином:


де константний вираз має мати той же тип що і вираженіе- перемикач; виробляються звичайні арифметичні перетворення. В одному операторі switch ніякі дві константи, помічені case, не можуть мати однакове значення. Вирази зі сталими точно визначаються в # 15.
Може також бути не більше ніж один префікс оператора виду


Коли виконаний оператор switch, проведено обчислення його вираження і порівняння його з кожної case константою. Якщо одна з констант дорівнює значенню виразу, то управління передається на вираз, наступне за подошедшим префіксом case. Якщо ніяка case константа не відповідає вираженню, і є префікс default, то управління передається на вираз, з яким він передує. Якщо немає відповідних варіантів case і default відсутня, то жоден із операторів в операторі switch не виконується.
Префікси case і default самі по собі не визначають потік управління, який після затримки йде далі, перескакуючи через ці префікси. Для виходу з switch см. Break, # 9.8.
Зазвичай залежить від switch оператор є складовим. В голові цього оператора можуть стояти опису, але ініціалізації автоматичних і реєстрових змінних є безрезультатними.


припиняє виконання найближчого охоплює while, do, for або switch оператора; управління передається на оператор, наступний за закінченням.


викликає передачу управління на керуючу продовженням циклу частина найменшого охоплює оператора while, do або for; тобто на кінець петлі циклу. Точніше, в кожному з операторів


continue еквівалентно goto contin. (За contin: слід порожній оператор, # 9.13.)


Перший може використовуватися тільки у функціях, які не повертають значення, тобто у функціях з типом значення, що повертається void. Друга форма може використовуватися тільки у функціях, які не повертають значення; викликає функцію програмі повертається значення виразу. Якщо необхідно, то вираз перетворюється, як це робиться при присвоєнні, до типу функції, в якій воно виникло. Обхід кінця функції еквівалентний поверненню return без значення, що повертається.


Ідентифікатор повинен бути міткою (# 9.12), розташованої в поточній функції.


який служить для опису ідентифікатора як мітки. Мітка використовується тільки як об'єкт для goto. Областю видимості мітки є поточна функція, виключаючи будь-подблок, в якому був переписаний такий же ідентифікатор. Див. # 4.1.


Порожній оператор використовується для приміщення мітки безпосередньо перед> складеного оператора або того, щоб забезпечити такі оператори, як while, порожнім тілом.


Результатом виразу повинен бути покажчик. Об'єкт, на який він вказує, знищується. Це означає, що після оператора знищення delete можна гарантувати, що об'єкт має певне значення; см. # 17. Ефект від застосування delete до покажчика, що не отриманого з операції new (# 7.1), не визначений. Однак, знищення покажчика з нульовим значенням безпечно.


Сенс оператора asm не визначений. Зазвичай він використовується для передачі інформації через компілятор асемблеру.

Програма на C ++ складається з послідовності зовнішніх визначень. Зовнішнє визначення описує ідентифікатор як має клас пам'яті static і визначає його тип. Специфікатор типу (# 8.2) може також бути порожнім, і в цьому випадку приймається тип int. Область видимості зовнішніх визначень простягається до кінця файлу, в якому вони описані, так само, як дія описів зберігається до кінця блоку. Синтаксис зовнішніх визначень той же, що і у описів, за винятком того, що тільки на цьому рівні і всередині описів класів може бути заданий код (текст програми) функції.


Єдиними cпеціфікаторамі класу пам'яті (sc-cпеціфікаторамі), допустимими серед специфікаторів опису, є extern, static, overload, inline і virtual. Описувач функції схожий на описувач "функції, що повертає.", За винятком того, що він включає в себе імена формальних параметрів визначається функції.
Описувач функції має вигляд


Форма списку описів параметрів визначена в # 8.4. Єдиний клас пам'яті, який може бути заданий, це той, при якому відповідний фактичний параметр буде скопійований, якщо це можливо, в регістр при вході в функцію. Якщо в якості ініціалізатор для параметра задано константний вираз, то це значення використовується як значення параметра за замовчуванням.
Тіло функції має вигляд


Ось простий приклад повного визначення функції:


Тут int є специфікатором типу; max (int a, int b, int c) є описателем функції; - блок, що задає текст програми (код) оператора.
Оскільки в контексті вираження ім'я (точніше, ім'я як формальний параметр) вважається означає покажчик на перший елемент масиву, то опису формальних параметрів, описаних як "масив з.", Коригуються так, щоб Новомосковсклось "покажчик на.".
Ініціалізатор базового класу має вигляд


Він використовується для завдання параметрів конструктора базового класу в конструкторі похідного класу. наприклад:


Конструктор базового класу викликається для об'єкта d з параметром 11.


Клас пам'яті таких даних статичний.
Якщо є більше одного визначення зовнішніх даних одного імені, то визначення повинні точно узгоджуватися по типу і класу пам'яті, і ініціалізатор (якщо вони є), повинні мати однакове значення.

Компілятор мови C ++ містить препроцесор, здатний виконувати макропідстановки, умовну компіляцію і включення іменованих файлів. Рядки, що починаються з #, відносяться до препроцесору. Ці рядки мають незалежний від решти мови синтаксис; вони можуть з'являтися в будь-якому місці впливати, яке поширюється (незалежно від області видимості) до кінця вихідного файлу програми.
Зауважте, що визначення const і inline дають альтернативи для більшості використань #define.


викликає заміну препроцесором наступних входжень ідентифікатора, заданого рядком символів. Крапка з комою всередині (або в кінці) рядки символів є частиною цього рядка.
рядок виду


де відсутня пробіл між першим ідентифікатором і (, є Макроозначення з параметрами. Наступні входження першого ідентифікатора з йдуть за ним (, послідовністю символів, розмежованою запитом, і), замінюються рядком символів, заданої у визначенні. Кожне місце розташування ідентифікатора, поміченого в списку параметрів визначення , замінюється відповідним рядком з виклику. Фактичними параметрами виклику є рядки символів, розділені комами, а проте коми в рядку, укладеної в лапки, або в руглих дужках не є роздільниками параметрів. Число формальних і фактичних параметрів має збігатися. Рядки і символьні константи в символьної рядку скануються в пошуках формальних параметрів, але рядки і символьні константи в решті програмі не скануються в пошуках певних (за допомогою define) ідентифікаторів.
В обох випадках рядок заміщення ще раз сканується в пошуках інших визначених ідентифікаторів. В обох випадках довге визначення може бути продовжено на іншому рядку за допомогою запису \ в кінці продовжує рядки.
Командний рядок виду


тягне за собою скасування препроцесорну визначення ідентифікатора.


викликає заміну цього рядка повним вмістом файла имя_файла. Спочатку іменований файл шукається в директорії початкового вихідного файлу, а потім в стандартних або заданих місцях.
Альтернативний варіант, командний рядок виду


здійснює пошук лише в стандартному або заданому місці, і не шукає в директорії початкового вихідного файлу. (Те, як ці місця задаються, не є частиною мови.)
Включення з допомогою #include можуть бути вкладеними.


перевіряє, чи є результатом обчислення виразу не-нуль. Вираз повинен бути сталою виразом, які обговорюються в # 15; стосовно використання даної директиви є додаткові обмеження: константний вираз не може містити sizeof або перелічуваних константи. Крім звичайних операцій C може використовуватися унарна операція defined. У разі застосування до ідентифікатора вона дає значення НЕ-нуль, якщо цей ідентифікатор був раніше визначений за допомогою #define і після цього не було скасування ухвали за допомогою #undef; інакше її значення 0.
Командний рядок виду


перевіряє, чи визначено ідентифікатор в препроцесорів в даний момент; тобто, чи був він об'єктом командного рядка #define.
Командний рядок виду


перевіряє, чи є ідентифікатор невизначеним в препроцесорів в даний момент.
Після рядка кожного з трьох видів може стояти будь-яку кількість рядків, можливо, містять командний рядок


і далі до командного рядка


Якщо перевірене умова істинно, то всі рядки між #else і #endif ігноруються. Якщо перевірене умова помилкова, то всі рядки між перевіркою і #else або, в разі відсутності #else, #endif, ігноруються.
Ці конструкції можуть бути вкладеними.


змушує компілятор вважати, наприклад, з метою діагностики помилок, що константа задає номер наступного рядка вихідного файлу, і поточний вхідний файл іменується ідентифікатором. Якщо ідентифікатор відсутній, то запомненное ім'я файлу не змінюється.


Тоді визначення g може мати наступний вигляд:


Зауважте, що f повинна бути описана явно в зухвалій програмі, оскільки її поява в g (f) не супроводжувалося (.


alloc повинна забезпечувати (машинно залежним чином) то, що повертається нею значення підходить для перетворення в покажчик на double; в цьому випадку використання функції мобільно. Різні машини розрізняються за кількістю біт в покажчиках і вимогам до вирівнювання об'єктів. Складові об'єкти вирівнюються по самій суворої кордоні, необхідної будь-яким з його складових.

У кількох місцях C ++ вимагає вираження, обчислення яких дає константу: як межі масиву (# 8.3), в case виразах (# 9.7), в якості значень параметрів функції, що присвоюються за замовчуванням, (# 8.3), і в ініціалізатор (# 8.6 ). У першому випадку вираз може включати тільки цілі константи, символьні константи, константи, описані як імена, і sizeof вираження, можливо, пов'язані бінарними операціями


або унарними операціями


або тернарного операціями


для отримання пам'яті. Параметр задає число необхідних байтів. Пам'ять буде инициализирована. Якщо _new не може знайти необхідну кількість пам'яті, то вона повертає нуль.
Операція delete викликає функцію


щоб звільнити пам'ять, зазначену покажчиком, для повторного використання. Результат виклику _delete () для покажчика, який не був отриманий з _new (), не визначений, це саме можна сказати і до повторного виклику _delete () для одного і того ж покажчика. Однак знищення за допомогою delete покажчика зі значенням нуль нешкідливо.
Надаються стандартні версії _new () і _delete (), але користувач може застосовувати інші, більш відповідні для конкретних додатків.
Коли за допомогою операції new створюється класовий об'єкт, то для отримання необхідної пам'яті конструктор буде (неявно) використовувати new. Конструктор може здійснити своє власне резервування пам'яті за допомогою присвоювання вказівником this до будь-яких використань. За допомогою присвоювання this значення нуль деструктор може уникнути стандартної операції дерезервірованія пам'яті для об'єкта його класу. наприклад:


На вході в конструктор this є не-нулем, якщо резервування пам'яті вже мало місце (як це має місце для автоматичних об'єктів), і нулем в інших випадках.
Якщо похідний клас здійснює присвоювання this, то виклик конструктора (якщо він є) базового класу буде мати місце після присвоювання, так що конструктор базового класу посилатися на об'єкт за допомогою конструктора похідного класу. Якщо конструктор базового класу здійснює присвоювання this, то значення також буде використовуватися конструктором (якщо такий є) похідного класу.

Схожі статті