Основи алгоритмічного мови С + +
Змінні і операції мови С + +
Тут представлені базові компоненти програм на С + +. В їх число входять типи даних, змінні, константи і вирази.
ВИВЧАЄМО ПОНЯТТЯ
- Попереднє визначення типи даних в С + + включають в себе типи int, char, float, double і void. У мові С + + гнучкість типів даних збільшується завдяки застосуванню модифікаторів типів. Ці модифікатори змінюють точність представлення та діапазон значень змінних. Модифікаторами типу є signed, unsigned, short і long.
- Ідентифікатори в С + + можуть мати довжину до 32 символів і повинні починатися з букви або підкреслення. Наступні символи ідентифікатора можуть бути буквою, цифрою або підкресленням. Ідентифікатори С + + чутливі до реєстру. Обмеження на 32 символу може бути, проте, змінено шляхом установки опцій компілятора.
- Директива # include є спеціальною командою компілятора. Вона наказує компілятору включити в програму вміст певного файлу, як якби ви самі ввели його в поточний вихідний файл.
- Оголошення констант передбачає використання директиви # define для оголошення констант, визначених за допомогою макросів, або використання ключового слова const для оголошення формальних констант. Формальні константи вимагають від вас визначення їх типу (значенням за замовчуванням є int), імені та асоційованого з ними значення.
- Оголошення змінної вимагає, щоб ви поставили її тип та ім'я, С + + дає вам можливість ініціалізувати змінну при її оголошенні. Ви можете оголосити кілька змінних в одному операторі оголошення.
- арифметичними операціями є +, -, *,/і% (розподіл по модулю).
- Арифметичні вирази розрізняються за складністю. Найпростіше вираз містить єдиний елемент даних (літерал, константу або змінну). Складні вирази включають набір операцій, функції, літерали, константи і змінні.
- Операції інкремента і декремент використовуються в префіксной і постфіксной формах. Мова С + + дає вам можливість застосовувати ці операції до змінних, у яких зберігаються символи, цілі числа і навіть числа з плаваючою точкою.
- Арифметичні операції привласнення дають вам можливість записувати більш короткі арифметичні вирази, в яких перший операнд є також змінної, що приймає результат обчислень.
- Оператор sizeof повертає як для типів даних, так і для змінних їх розмір у байтах.
- Механізм приведення типу дає вам можливість форсувати перетворення типу виразу.
- Операції відносин і логічні операції дають вам можливість будувати логічні вирази.
- Булеві вирази об'єднують операції відносин і логічні операції для формулювання нетривіальних умов. Ці вирази дозволяють програмі приймати складні рішення.
- Умовне вираз пропонує вам коротку форму для простого оператора if-else з двома альтернативами.
- Операції маніпулювання битами виконують порозрядним операції AND, OR, XOR і NOT. Крім того, в С + + підтримуються порозрядним операції зсуву <<і>>.
- Операції маніпулювання битами з привласненням пропонують короткі форми для простих операцій маніпулювання битами.
Літери і цифри
Безліч символів Сі включає великі і малі літери з англійського алфавіту і 10 десяткових арабських цифр:
-великі англійські букви: ABCDEFGHIJKLMNOPQRTUV WXYZ
-малі англійські букви: abcdefghijklmnopqrtuv wxyz
-десяткові цифри: 0 1 2 3 4 5 6 7 8 9
Букви та цифри використовуються при формуванні констант, ідентифікаторів і ключових слів. Всі ці конструкції описані нижче. Компілятор Сі розглядає одну й ту саму малу і велику букви як відмінні символи. Якщо в даній запису використані малі літери, то заміна малої літери "a" на велику літеру "A" зробить відмінною даний запис від попередньої.
пробільні символи
Пробіл, табуляція, переклад рядка, повернення каретки, нова сторінка, вертикальна табуляція і новий рядок-це сиволом, звані пробільними, оскільки вони мають те ж саме призначення, як і пробіли між словами і рядками на друкованій сторінці. Ці символи розділяють об'єкти, визначені користувачем, такі, як константи і ідентифікатори, від інших об'єктів програми.
Символ CONTROL-Z розглядається як індикатор кінця файлу. Компілятор ігнорує будь-який текст, наступний за символом
CONTROL-Z.
Компілятор Сі ігнорує пробільні символи, якщо вони не використовуються як роздільники або як компоненти константи-символу або строкових літералів. Це потрібно мати на увазі, щоб додатково використовувати пробільні символи для підвищення наочності програми (наприклад, для перегляду редактором текстів).
Знаки пунктуації та спеціальні символи
Ці символи мають спеціальний сенс для компілятора Сі. Їх використання в мові Сі описується в подальше утримання керівництва. Знаки пунктуації з безлічі представимо символів, які не представлені в цьому переліку, можуть бути використані тільки в строкових літерали, константах-символах і коментарях.
ESC-послідовності
ESC-послідовності-це спеціальні символьні комбінації, які представляють пробільні символи і неграфіческіе символи в рядках та символьних константах.
Їх типове використання пов'язане зі специфікацією таких дій, як повернення каретки і табуляція, а також для завдання літеральних уявлень символів, таких як символ лапки. ESC-послідовність складається з похилої риси вліво, за якою слідує літера, знаки пунктуації ' "або комбінація цифр. У таблиці 2.2. Наведений список ESC-послідовностей мови Сі.
Якщо похила риска вліво передує символу, не включеному до цього списку, то похила риска вліво ігнорується, а символ представляється як літеральний. Наприклад, зображення c представляє символ "c" в літеральной рядку або константі-символі.
Послідовності ddd і xdd дозволяють задати будь-який символ в ASCII (Американський стандартний код інформаційного інтерфейсу) як послідовність трьох вісімкових цифр або двох шістнадцятиричних цифр. Наприклад, символ пробілу може бути заданий якак як вони визначені. Імена об'єктів програми не можуть співпадати з назвами ключових слів.
Список ключових слів:
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof while
do if static volatile
Ключові слова не можуть бути перевизначені. Тим не менш, вони можуть бути названі іншим текстом, але тоді перед компіляцією вони повинні бути замінені за допомогою препроцесора на відповідні ключові слова.
Ключові слова const і volatile зарезервовано для майбутнього використання.
Наступні ідентифікатори можуть бути ключовими словами для деяких програм:
cdecl
far
fortran
huge
near
pascal
Коментарі
Коментар-це послідовність символів, яка сприймається компілятором як окремий пробільний символ або, іншими словами, ігнорується.
Коментар має наступну форму подання:
/* * /,
де може бути будь-якою комбінацією символів з безлічі представимо символів, включаючи символи нового рядка, але виключаючи комбінацію * /. Це означає, що коментарі можуть займати більше одного рядка, але не можуть бути вкладеними.
Коментарі допускаються скрізь, де дозволені пробільні символи. Компілятор ігнорує символи коментаря, зокрема, у коментарях допускається запис ключових слів і зто не призведе до помилки. Так як компілятор розглядає коментар як символ пробілу, то коментарі не можуть з'являтися всередині лексем.
Наступні приклади ілюструють деякі коментарі:
/* Comments can separate and document
lines of a program. * /
/* Comments can contain keywords such as for
and while * /
/*******************************************
Comments can occupy several lines. *******************************************/
Так як коментарі не можуть містити вкладених коментарів, то наступний приклад буде помилковим:
/* You cannot/* nest */comments * /
компілятор розпізнає першу комбінацію */після слова nest як кінець коментаря. Потім, компілятор спробує обробляти залишився текст і виробить повідомлення про помилку. Щоб обійти компіляцію коментарів великих розмірів, потрібно використовувати директиву # if препроцесора.
Лексема
Коли компілятор обробляє програму, він розбиває програму на групи символів, званих лексемами. Лексема-це одиниця тексту програми, яка має певний сенс для компілятора і яка не може бути розбита надалі. Операції, константи, ідентифікатори, ключові слова, описані в цьому розділі, є прикладами лексем. Знаки пунктуації, такі як квадратні дужки ([]), фігурні дужки ({}), кутові дужки (<>), круглі дужки й коми, також є лексемами. Межі лексем визначаються пробільними символами та іншими лексемами, такими як операції та знаки пунктуації. Щоб попередити неправильну роботу компілятора, забороняються пробільні символи між символами ідентифікаторів, операціями, що складаються з декількох символів і символами ключових слів.
Коли компілятор виділяє окрему лексему, він послідовно об'єднує стільки символів, скільки можливо, перш ніж перейти до обробки наступної лексеми. Тому лексеми, не розділені пробільними символами, можуть бути проінтерпретовані невірно.
Наприклад, розглянемо наступне вираз:
i + + + j
У цьому прикладі компілятор спочатку створює з трьох знаків плюс найдовшу з можливих операцій (++), а потім обробить залишився знак +, як операцію додавання (+). Вираз проінтерпретіруется як (i ++)+( j), а не як (i )+(++ j). У таких випадках необхідно використовувати пробільні символи або круглі дужки, щоб однозначно визначити ситуацію.
ВИХІДНІ текст прикладу
// Програма VAR.CPP, що ілюструє прості змінні
# include
int main ()
(
int i, j = 2;
double x, y = 355.0/113;
i = 3 * j;
cout << "i =" < << "j =" <
x = 2 * y;
x = x * x;
cout << "y =" < << "x =" < return 0;
)
/*
Результати:
i = 6
j = 2
y = 3.141593
x = 39.4784
* /
// Програма CONST1.CPP, що ілюструє константи
# include
# define SEC_IN_MIN 60
# define MIN_IN_HOUR 60
int main ()
(
long hours, minutes, seconds;
long totalSec;
cout << "Введіть годинник:";
cin>> hours;
cout << "Введіть хвилини:";
cin>> minutes;
cout << "Введіть секунди:";
cin>> seconds;
totalSec = ((hours * MIN_IN_HOUR + minutes) *
SEC_IN_MIN) + seconds;
cout < return 0;
)
/* Тест і результати:
Введіть годинник: 10
Введіть хвилини: 0
Введіть секунди: 0
36000 секунд пройшло сполуночі
* /
// Програма CONST2.CPP, що ілюструє формальні константи
# include
const int SEC_IN_MIN = 60;// глобальна константа
int main ()
(
const int MIN_IN_HOUR = 60;// локальна константа
long hours, minutes, seconds;
long totalSec;
cout << "Введіть годинник:";
cin>> hours;
cout << "Введіть хвилини:";
cin>> minutes;
cout << "Введіть секунди:";
cin>> seconds;
totalSec = ((hours * MIN_IN_HOUR + minutes) *
SEC_IN_MIN) + seconds;
cout < return 0;
)
/* Тест і результати:
Введіть годинник: 1
Введіть хвилини: 10
Введіть секунди: 20
4220 секунд пройшло з півночі
* /
// Програма OPER1.CPP, що ілюструє прості математичні операції
# include
int main ()
(
int int1, int2;
long long1, long2, long3, long4, long5;
float x, y, real1, real2, real3, real4;
cout < cin>> int1;
cout << "Введіть друге ціле число:";
cin>> int2;
cout < long1 = int1 + int2;
long2 = int1 - int2;
long3 = int1 * int2;
long4 = int1/int2;
long5 = int1% int2;
cout < cout < cout < cout < cout < cout < cout << "Веедіте перше дійсне число:";
cin>> x;
cout << "Введіть друге дійсне число:";
cin>> y;
cout < real1 = x + y;
real2 = x - y;
real3 = x * y;
real4 = x/y;
cout < cout < cout < cout < cout < return 0;
)
/* Тест і результати:
Введіть перше ціле число: 10
Введіть друге ціле число: 5
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
10/5 = 2
10% 5 = 0
Введіть перше дійсне число: 1.25
Введіть друге дійсне число: 2.58
1.25 + 2.58 = 3.83
1.25 - 2.58 = -1.33
1.25 * 2.58 = 3.225
1.25/2.58 = 0.484496
* /
// Демонстрація операцій інкремента і декремент див. в програмі OPER2.CPP
// Програма SIZEOF.CPP, яка повертає розміри даних, використовуючи
// для цього операцію sizeof () з змінними та типами даних.
# include
int main ()
(
short int aShort;
int anInt;
long aLong;
char aChar;
float aReal;
cout << "Таблиця 1. Розміри пам'яті для змінних" < < cout << "Тип даних використовується" < cout << "пам'ять (у байтах)" < cout <<"------------------ -----------" < cout << "short int" < cout << "integer" < cout << "long integer" < cout << "character" < cout << "float" < cout <
cout << "Таблиця 2. Розміри пам'яті для типів даних" < < cout << "Тип даних використовується" < cout << "пам'ять (у байтах)" < cout <<"------------------ -----------" < cout << "short int" < cout << "integer" < cout << "long integer" < cout << "character" < cout << "float" < cout <
return 0;
)
/* Результати:
Таблиця 1. Розміри пам'яті для змінних "
Тип даних Пам'ять, яка використовується (в байтах)
short int 2
integer 2
long integer 4
character 1
float 4
Таблиця 2. Розміри пам'яті для типів даних
Тип даних використовується
пам'ять (в байтах)
------------------ ---------- short int 2
integer 2
long integer 4
character 1
float 4
* /
// Проста програма TYPECAST.CPP, що демонструє приведення типу
# include
int main ()
(
short shortInt1, shortInt2;
unsigned short aByte;
int anInt;
long aLong;
char aChar;
float aReal;
// присвоюються значення
shortInt1 = 10;
shortInt2 = 6;
// дії виконуються без приведення типу
aByte = shortInt1 + shortInt2;
anInt = shortInt1 - shortInt2;
aLong = shortInt1 * shortInt2;
aChar = aLong + 5;// автоматичне перетворення
// в символьний тип
aReal = shortInt1 * shortInt2 + 0.5;
cout << "shortInt1 =" < << "shortInt2 =" < << "aByte =" < << "anInt =" < << "aLong =" < << "aChar is" < << "aReal =" <
// дейтсвія виконуються з приведенням типу
aByte = (unsigned short) (shortInt1 + shortInt2);
anInt = (int) (shortInt1 - shortInt2);
aLong = (long) (shortInt1 * shortInt2);
aChar = (unsigned char) (aLong + 5);
aReal = (float) (shortInt1 * shortInt2 + 0.5);
cout << "shortInt1 =" < << "shortInt2 =" < << "aByte =" < << "anInt =" < << "aLong =" < << "aChar is" < << "aReal =" < return 0;
)
/* Результати:
shortInt1 = 10
shortInt2 = 6
aByte = 16
anInt = 4
aLong = 60
aChar is A
aReal = 60.5
shortInt1 = 10
shortInt2 = 6
aByte = 16
anInt = 4
aLong = 60
aChar is A
aReal = 60.5
* /
/* *** ПИТАННЯ І ВІДПОВІДІ ***
Чи існують особливі угоди про присвоєння імен ідентифікаторів?
Існує кілька стилів, які стали популярними в останні роки. Стиль, який використовується у наших заняттях, вимагає починати ім'я змінної з символу, набраного в нижньому регістрі. Якщо ідентифікатор складається з декількох слів, як, наприклад, numberOfElements, набирайте перший символ кожного наступного слова у верхньому регістрі.
Як реагує компілятор, якщо ви розкажете змінну, але ніколи не привласнюєте їй значення?
компілятор видає попередження, що на змінну немає посилань.
Яке логічне вираз для перевірки того, що значення змінної i знаходиться в заданому діапазоні значень (наприклад, що визначається змінними lowVal і hiVal)?
Виразом, яке визначає, чи знаходиться значення змінної i у деякому діапазоні, є (i> = lowVal & & i <= hiVal).
Конструкції прийняття рішень та цикли
ПИТАННЯ ТА ВІДПОВІДІ
Пред'являє чи С + + будь-які вимоги на відступ операторів в пропозиціях оператора?
Ні. Відступ визначається тільки Вами. Типові розміри відступу складають дві або чотири пробіл. Використання відступів робить ваш лістинг набагато більш легким для читання.
Ось приклад оператора if із записом пропозицій без відступу:
if (i> 0)
j = i * 1;
else
j = 10 - i;
Порівняйте цей лістинг і його варіант з відступами
if (i> 0)
j = i * i;
else
j = 10 - i;
Останній варіант читається набагато легше; легко вказати, де оператори if та else. Більш того, якщо ви будете працювати з вкладеними циклами, відступи ще більш значимі відносно легкості читання коду.
Які правила написання умов в операторі if-else?
Тут існують два підходи. Перший рекомендує писати умови так, що true буде частіше, ніж false. Другий підхід рекомендує уникати негативних виразів (тих, які використовують операції порівняння! = І булеві операції!).
Програмісти з останнього табору перетворять такий оператор if:
if (i! = 0)
j = 100/i;
else
j = 1;
в наступну еквівалентну форму:
if (i == 0)
j = 1;
else
j = 100/i;
хоча ймовірність рівності нулю змінної i досить низька.
Як обробити умова, подібне нижченаведеному, де є поділ на змінну, яка може виявитися рівною нулю?
if (i! = 0 & & 1/i> 1)
j = i * i;
С + + не завжди оцінює перевіряються умови повністю. Ця часткова оцінка відбувається, коли член булева вирази перетворює все вираження в false або true, незалежно від значення інших членів. У цьому випадку, якщо змінна i дорівнює 0, виконуюча система не буде оцінювати 1/i> 1, тому що член i! = 0 є false і звертає в false всі вираз, незалежно від значення другого члена. Це називається укороченою оцінкою бульових виразів.
Чи дійсно необхідно включати пропозиції else або default в Багатоальтернативність оператори if-else і switch?
Програмісти настійно рекомендують включення цих всеосяжних пропозицій для гарантії того, що Багатоальтернативність оператори будуть обробляти всі можливі умови. Однак технічно для компіляції програми це не є необхідним.
Як змоделювати цикл while циклом for?
Розглянемо простий приклад.
int i; int i = 1;
for (i = 1; i <= 10; i + = 2) (while (i <= 10) (
cout <) i + = 2;
)
Циклу while необхідний початковий оператор, який ініціює змінну управління циклом. Зауважимо також, що всередині циклу while знаходиться оператор, що змінює значення змінної керування циклом.
Як змоделювати цикл while циклом do-while?
Розглянемо простий приклад.
i = 1; i = 1;
do (while (i <= 10) (
cout < i + = 2; i + = 2;
) while (i <= 10);)
Обидва циклу мають однакові умови в пропозиціях while.
Зауважимо, однак, що якщо цикл спроектований таким чином, що початкове значення i може бути невідомим заздалегідь, то це може призвести до різних ефектів. Наприклад, якщо i початково дорівнює 11, то цикл ліворуч виконається один раз, тоді як цикл справа не зробить жодної ітерації.
Як відкритий цикл for може емулювати цикли while та do-while?
Відкритий цикл for емулює інші цикли С + + установкою оператора if виходу з циклу на початку чи кінці циклу. Розглянемо приклад емуляції циклу while відкритим циклом for:
i = 1; i = 1;
while (i <= 10) (for (;;) (
if (i> 10) break;
cout < i + = 2; i + = 2;
))
Зауважимо, що відкритий цикл for використовує оператор if виходу з циклу як перший оператор всередині циклу. Умова, перевіряє операторів if, є логічне звернення умови циклу while.
Розглянемо простий приклад, який ілюструє емуляцію циклу do-while:
i = 1; i = 1;
do (for (;;) (
cout < if (i> 10) break;
i + = 2; i + = 2;
) while (i <= 10))
Відкритий цикл for використовує оператор if виходу з циклу перед кінцем циклу. Оператор if перевіряє зворотне логічне умова, так само як в циклі do-while. Однак майте, будь ласка, на увазі, що наведені приклади досить грубо і неелегантність. Ніхто ніколи не буде використовувати відкритий оператор for подібним чином. Звичайно, можна було б пропустити одну з трьох пропозицій всередині дужок циклу for (наприклад, пропозиція ініціалізації, якщо керуюча мінлива вже ініціалізований). Відкриті цикли for найчастіше використовуються у випадках, коли вихід з циклу буває рідкісною подією, наприклад, якщо при обробці даних, що вводяться користувачем з клавіатури, натискання клавіші Esc повинно приводити до виходу з програми.
Чи можна у вкладеному циклі for використовувати змінну управління зовнішнім циклом як межі діапазону значень для внутрішніх процедур?
Так. С + + не тільки не забороняє таке використання, насправді воно в порядку речей. Розглянемо простий приклад.
for (int i = 1; i <= 100; i + = 5)
for (int j = i; i <= 100; j + +)
cout
Обмежує чи С + + вкладення циклів різних типів?
Ні. У програмі на С + + ви можете вкладати будь-які комбінації циклів.
СТРУКТУРА ПРОГРАМИ
У цьому розділі описується структура вихідної програми на Сі та визначаються терміни, що використовуються в наступних розділах керівництва при описі мови. По суті, тут представлено загальний огляд особливостей мови Сі, які в подальшому розглянуті в деталях.
Вихідна програма
Вихідна програма-це сукупність наступних об'єктів: директив, вказівок компілятору, оголошень і визначень. Директиви задають дії препроцесора з перетворення тексту програми перед компіляцією. Вказівки компілятору-це команди, що виконуються компілятором під час процесу компіляції. Оголошення задають імена та атрибути змінних, функцій і типів, що використовуються в програмі. Визначення-це оголошення, що визначають змінні і функції.
Визначення змінної в додаток до її імені та типу задає початкове значення оголошеної змінної. Крім того, визначення припускає розподіл пам'яті для змінної.
Визначення функції специфікує її структуру, яка являє собою суміш з оголошень та операторів, які утворюють саму функцію. Визначення функції також задає ім'я функції, її формальні параметри і тип повертається величини.
Вихідна програма може містити будь-яку кількість директив, вказівок компілятору, оголошень і визначень. Будь-який з об'єктів програми має певний синтаксис, описаний у цьому посібнику, і кожна складова може з'являтися в будь-якому порядку, хоча вплив порядку, в якому слідують змінні і функції може бути використане в програмі (див. розділ 3.5 "Час життя і видимість").
Не?? рівіальная програма завжди містить більше одного визначення функції. Функція визначає дії, що виконуються програмою.
У наступному прикладі ілюструється проста вихідна програма на мові Сі.
int x = 1;/* Variable definitions * /
int y = 2;
extern int printf (char *,...);/* Function declaration * /
main ()/* Function definition for main function * /
(
int z;/* Variable declarations * /
int w;
z = y + x;/* Executable statements * /
w = y - x;
printf ( "z =% d nw =% d n", z, x);
)
Ця вихідна програма визначає функцію з ім'ям main і оголошує функцію printf. Змінні x та y задаються своїми визначеннями. Змінні z і w тільки оголошуються.
ОГОЛОШЕННЯ
У цьому розділі описуються формати і складові частини оголошень змінних, функцій і типів. Оголошення Сі мають наступний синтаксис:
[] [] [= ] [, [= ...],
де:
- специфікатор класу пам'яті; - ім'я визначеного типу;
- ідентифікатор, який може бути модифікований при оголошенні покажчика, масиву або функції;
- задає значення чи послідовність значень, що присвоюються змінної при оголошенні.
Всі змінні Сі повинні бути явно оголошені перед їх використанням. Опції Сі можуть бути оголошені явно чи неявно у разі їх виклику перед визначенням.
Мова Сі визначає стандартне безліч типів даних. До цього безлічі можна додавати нові типи даних за допомогою їх оголошень на типах даних вже визначених.
Оголошення Сі вимагає одного або більше деклараторов. Декларатор-це ідентифікатор, який може бути визначений з квадратними дужками ([]), евездочкой (*) або круглими дужками () для оголошення масиву, покажчика або функції. Коли об'является проста мінлива (така як символ, ціле або плаваюче), структура або поєднання простих змінних, то декларатор-це ідентифікатор.
У Сі визначено чотири специфікатор класу пам'яті, а саме: auto, extern, register і static.
специфікатор класу пам'яті визначає, яким чином і оголошений об'єкт запам'ятовується і ініціалізується і з яких частин програми можна посилатися на нього. Розміщення оголошення усередині програми, а також наявність або відсутність інших оголошень-також важливі фактори при визначенні видимості змінних.
Оголошення функцій описані в розділі 4.4.
специфікатор типів
Перечіслімие типи також розглядаються як основні типи. Специфікатор перечіслімих типів розглянуті в розділі 4.7.1. Типи signed char, signed int, signed short int і signed long int разом з відповідними двійниками unsigned називаються типами цілих.
специфікатор типів float і double відносяться до типу "плаваючих". В оголошеннях мінливих і функцій можна використовувати будь-які специфікатор "цілий" і "плаваючий".
Тип void може бути використаний тільки для оголошення функцій, які не повертають значення. Типи функцій розглянуті в розділі 4.4.
Ви можете встановити додаткові специфікатор типу шляхом оголошення typedef, описаного в розділі 4.7.2.
При записі специфікатор типів допустимі скорочення як показано в табл. 4.2. В цілих типах ключове слово signed може бути опущено. Так, якщо ключове слово