Змінні в сі оголошення, ініціалізація, типи, уявлення і область видимості

А також ряд інших слів, специфічних для даної версії компілятора, наприклад far. near. tiny. huge. asm. asm_ тощо.

Наприклад, правильні ідентифікатори
a, _, _1_, Sarkasm, a_long_variable, aLongVariable, var19, defaultX, char_type
невірні
1a, $ value, a-long-value, short

Сі - чутливі до регістру мову. Змінні з іменами a і A, або end і END, або perfectDark і PerfectDarK - це різні змінні.

типи змінних

Т ип змінної визначає
  • 1) Розмір змінної в байтах (скільки байт пам'яті виділить комп'ютер для зберігання значення)
  • 2) Подання змінної в пам'яті (як в двійковому вигляді будуть розташовані біти в виділеної області пам'яті).
У сі кілька основних типів. Розділимо їх на дві групи - цілі і числа з плаваючою крапкою.
  • char - розмір 1 байт. Завжди! Це потрібно запам'ятати.
  • short - розмір 2 байти
  • int - розмір 4 байта
  • long - розмір 4 байта
  • long long - розмір 8 байт.
Тут слід зробити зауваження. Розмір змінних в сі не визначений явно, як розмір в байтах. У стандарті тільки зазначено, що

char <= short <= int <= long <= long long

Тепер давайте визначимо максимальне і мінімальне число, яке може зберігати змінна кожного з типів. Числа можуть бути як позитивними, так і негативними. Негативні числа використовують один біт для зберігання знака. Іноді знак необхідний (наприклад, зберігаємо рахунок в банку, температуру, координату і т.д.), а іноді в ньому немає необхідності (вага, розмір масиву, вік людини і т.д.). Для цього в сі використовується модифікатор типу signed і unsigned. unsigned char - все 8 біт під число, разом маємо набір чисел від 00000000 до 11111111 в двійковому вигляді, тобто від 0 до 255 signed char від -128 до 128. У сі змінні за замовчуванням зі знаком. Тому запис char і signed char еквівалентні.

Таб. 1 Розмір цілих типів в сі.

У сі є оператор, який дозволяє отримати розмір змінної в байтах. sizeof змінна, або sizeof (змінна) або sizeof (тип). Це саме оператор, тому що функція не має можливості отримати інформацію про розмір типів під час виконання програми. Напишемо невелику програму щоб упевнитися в розмірах змінних.

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

У сі один і той же тип може мати кілька назв
short === short int
long === long int
long long === long long int
unsigned int === unsigned

Типи з плаваючою точкою

Таб. 2 Розмір типів з плаваючою точкою в сі.

Кількість значущих знаків мантиси

1.175494351 E - 38

3.402823466 E + 38

1.7976931348623158 E + 308

переповнення змінних

Сі не стежить за переповненням змінних. Це означає, що постійно збільшуючи значення, скажімо, змінної типу int в кінці кінців ми "скинемо значення"

Взагалі, поведінка при переповненні змінної визначено тільки для типу unsigned. Беззнаковое ціле скине значення. Для інших типів може статися що завгодно, і якщо вам необхідно следать за переповненням, робіть це вручну, перевіряючи аргументи, або використовуйте інші способи, які залежать від компілятора і архітектури процесора.

Постфіксний позначення типу

П ри роботі з числами можна за допомогою літер в кінці числа явно вказувати його тип, наприклад
  • 11 - число типу int
  • 10u - unsigned
  • 22l або 22L - long
  • 3890ll або 3890LL - long long (а також lL або Ll)
  • 80.0f або 80.f або 80.0F - float (обов'язкова наявність десяткового дробу в запису)
  • 3.0 - число типу double
Експоненціальна форма запису також за замовчуванням позначає число типу double.

Наступний код, однак, не буде приводити до помилок, тому що відбувається неявне перетворення типу

Шістнадцятковий і восьмеричний формат

В про час роботи з числами можна використовувати шістнадцятковий і восьмеричний формат уявлення. Числа в шістнадцятковій системі числення починаються з 0x, в вісімковій системі з нуля. Відповідне, якщо число починається з нуля, то в ньому не повинно бути цифр вище 7:

Експоненціальна форма представлення чисел

Е кспоненціальной формою подання числа називають подання числа у вигляді M e ± p. де M - мантиса числа, p - ступінь десяти. При цьому у мантіс повинен бути один ненульовий знак перед десяткової коми.
Наприклад 1.25 === 1.25e0, 123.5 === 1.235e2, 0.0002341 === 2.341e-4 і т.д.
Уявлення 3.2435e7 еквівалентно 3.2435e + 7
Существеут і інше уявлення ( "інженерне"), в якому ступінь повинна бути кратною трійці. Наприклад 1.25 === 1.25e0, 123.5 === 123.5e0, 0.0002341 === 234.1e-6, 0.25873256 === 258.73256e-3 і т.д.

У сі змінні оголошуються завжди на початку блоку (блок - ділянку коду, обмежений фігурними дужками)

Можна оголосити кілька змінних одного типу, розділивши імена коми

Тут оголошені змінні a і b всередині функції main. і змінна z всередині тіла циклу. Наступний код викличе помилку компіляції

Початкове значення змінної

Якщо виконувати цю програму на VC, то під час виконання вилетить попередження
Run-Time Check Failure # 3 - The variable 'i' is being used without being initialized.
Якщо натиснути "Продовжити", то програма виведе "сміття". У багатьох інших компіляторах при виконанні програми не буде попередження.

Область видимості змінної

П еременние буваю локальними (оголошеними усередині якої-небудь функції) і глобальними. Глобальна змінна видно всіх функцій, оголошеним в цьому файлі. Локальна змінна обмежена своєї областю видимості. Коли я говорю, що змінна "видна в якомусь місці", це означає, що в цьому місці вона визначена і її можна використовувати. Наприклад, розглянемо програму, в якій є глобальна змінна

буде виведено
foo: 100
bar: 333
Тут глобальна змінна global видно всіх функцій. Але аргумент функції затирає глобальну змінну, тому при передачі аргументу 333 виводиться локальне значення 333.
Ось ще один приклад

Програма виведе 555. Також, як і в попередньому випадку, локальна змінна "важливіше". Змінна, оголошена в деякій області видимості не видно поза нею, наприклад

Цей приклад не скомпілюється, тому що змінна y існує тільки всередині свого блоку.
Ось ще приклад, коли змінні, оголошені всередині блоку перекривають один одного

програма виведе
30
20
10
Глобальних змінних необхідно уникати. Дуже часто можна почути таке. Давайте спробуємо розібратися, чому. У ваших простих проектах глобальні змінні виглядають цілком нормально. Але уявіть, що у вас додаток, яке

  • 1) Розробляється декількома людьми і складається з сотень тисяч рядків коду
  • 2) Працює в кілька потоків

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

Безумовно, є ситуації, коли глобальні змінні спрощують програму, але такі ситуації трапляються не часто і не в ваших домашніх завданнях, так що НЕ СТВОРЮЙТЕ ГЛОБАЛЬНИХ ЗМІННИХ!
Змінні можуть бути не тільки цілочисельними і з плаваючою крапкою. Існує безліч інших типів, які ми будемо вивчати в подальшому.

ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 [email protected] Stepan Sypachev students

Все ще не зрозуміло? - пиши питання на ящик