• Главная
  • Карта сайта
Не найдено

операції

  1. оператор присвоювання
  2. Перетворення типів при привласнення
  3. множинні присвоювання
  4. складений присвоювання
  5. арифметичні операції
  6. Операції збільшення (инкремента) і зменшення (декремента)
  7. Операції порівняння і логічні операції
  8. порозрядні операції
  9. Операція?
  10. Операція отримання адреси (&) і розкриття посилання (*)
  11. Операція визначення розміру sizof
  12. Оператор послідовного обчислення: оператор "кома"
  13. Оператор доступу до члена структури (оператор. (Точка)) і оператор доступу через покажчик -> (оператор...
  14. Оператор [] і ()
  15. Зведення пріоритетів операцій

tag. -> зміст

| <<< | >>>

Мова С містить велику кількість вбудованих операцій. Їх роль в С значно більше, ніж в інших мовах програмування. Існує чотири основні класи операцій: арифметичні, логічні, порозрядні і операції порівняння. Крім них, є також деякі спеціальні оператори, наприклад, оператор присвоювання.

оператор присвоювання

Оператор присвоювання може бути присутнім в будь-якому вираженні мови С [1] . Цим З відрізняється від більшості інших мов програмування (Pascal, BASIC і FORTRAN), в яких присвоювання можливо тільки в окремому операторі. Загальна форма оператора присвоювання:

ім'я_змінної = вираз;

Вираз може бути просто константою або як завгодно складним виразом. На відміну від Pascal або Modula-2, в яких для присвоювання використовується знак ": =", в мові С оператором присвоювання служить єдиний знак присвоювання "=". Адресатом (одержувачем), тобто лівою частиною оператора присвоювання повинен бути об'єкт, здатний отримати значення, наприклад, змінна.

У книгах по С і в повідомленнях компілятора часто зустрічаються терміни lvalue [2] (Left side value) і rvalue [3] (Right side value). Попросту кажучи, lvalue - це об'єкт. Якщо цей об'єкт може стояти в лівій частині присвоювання, то він називається також модифікується (modifiable) lvalue. Підсумуємо сказане: lvalue - це об'єкт в лівій частині оператора присвоювання, який одержує значення, найчастіше цим об'єктом є змінна. Термін rvalue означає значення виразу в правій частині оператора присвоювання.

Перетворення типів при привласнення

Якщо в операції зустрічаються змінні різних типів, відбувається перетворення типів. В операторі присвоювання діє просте правило: значення виразу в правій частині перетвориться до типу об'єкта в лівій частині.

int x; char ch; float f; void func (void) {ch = x; / * 1-й рядок * / x = f; / * 2-й рядок * / f = ch; / * 3-й рядок * / f = x; / * 4-й рядок * /}

У 1-му рядку цього прикладу старші виконавчі розряди цілої змінної х відкидаються, а в ch заносяться молодші 8 біт. Якщо значення х лежить в інтервалі від 0 до 255, то ch і х будуть ідентичні і втрати інформації не відбудеться. В іншому випадку в ch будуть занесені лише молодші розряди змінної х. У 2-му рядку в х буде записана ціла частина числа f. У 3-му рядку відбудеться перетворення цілого 8-розрядного числа, що зберігається в ch, в число в плаваючому форматі. В 4-му рядку відбудеться те ж саме, тільки з 16-розрядних цілим.

Перетворення цілих в символи і довгих цілих в цілі видаляє відповідну кількість старших двійкових розрядів. У 16-розрядної середовищі губляться 8 бітів при перетворенні цілого в символ і 16 бітів при перетворенні довгого цілого в ціле. У 32-розрядної середовищі губляться 24 біта при перетворенні цілого в символ і 16 бітів при перетворенні цілого в короткий ціле.

У табл. 2.3. наведені варіанти втрати інформації при деяких перетвореннях. Необхідно пам'ятати, що перетворення int в float або float в double не підвищує точність обчислень. При такому перетворенні тільки змінюється форма подання числа. Деякі компілятори при перетворенні char в int вважають змінну char позитивної незалежно від її значення. Інші компілятори вважають змінну char негативною, якщо вона більше 127. Тому для забезпечення переносимості програми необхідно використовувати змінні типу char для зберігання символів, а змінні типу signed char і int (цілий) - для зберігання чисел.

Таблиця 2.3.Результат деяких перетворень типівТип адресатаТип виразуВтрата інформації

signed char char Якщо значення> 127, то результат негативний char short int Старші 6 біт char int (16-розрядний) Старші 8 біт char int (32-розрядний) Старші 24 біт char long int старші 24 біт short int int (16-розрядний) Немає short int int (32-розрядний) старші 16 біт int (16-розрядний) long int старші 16 біт int (32-розрядний) long int Немає long int (32-розрядний) long long int (64-розрядний) Старші 32 біта (це відноситься тільки до C99) int float Дрібна частина float double Результат округляється double long double Результат округляється

Якщо будь-яка перетворення не наведено в табл. 2.3, то, щоб визначити, що саме втрачається в результаті цього перетворення, потрібно представити його у вигляді композиції (суперпозиції, твори) зазначених в таблиці перетворень і потім провести послідовні перетворення. Наприклад, перетворення double в int еквівалентно послідовному виконанню двох перетворень: спочатку double в float, а потім float в int.

множинні присвоювання

В одному операторі присвоювання можна привласнити одне і те ж значення багатьом змінним. Для цього використовується оператор множинного присвоювання [4] , Наприклад:

x = y = z = 0;

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

складений присвоювання

Складений присвоювання - це різновид оператора присвоювання, в якій запис скорочується і стає більш зручною в написанні [5] . Наприклад, оператор

x = x + 10;

можна записати як

x + = 10;

Оператор "+ =" повідомляє компілятору, що до змінної х потрібно додати 10.

"Складові" оператори [6] присвоювання існують для всіх бінарних операцій (тобто операцій, що мають два операнда). Будь-оператор виду

змінна = змінна оператор вираз;

можна записати як

змінна оператор = вираз;

Ще один приклад:

x = x-100;

означає те ж саме, що і

x - = 100;

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

арифметичні операції

У табл. 2.4 наведені арифметичні операції С. Операції +, -, * і / працюють так само, як і в більшості інших мов програмування. Їх можна застосовувати майже до всіх вбудованим типам даних. Якщо операція / застосовується до цілого або символьного типам, то залишок від ділення відкидається. Наприклад, результатом операції 5/2 є 2.

Таблиця 2.4.Арифметичні операціїОператорОперація

- Віднімання, так само унарний мінус + Додавання * Множення / Ділення% Ділення - Декремент [7] , Або зменшення ++ Інкремент [8] , Або збільшення

Оператор ділення по модулю% в С працює так само, як і в інших мовах, його результатом є залишок від цілочисельного ділення. Цей оператор, проте, не можна застосовувати до типам даних з плаваючою точкою. Застосування оператора% ілюструється наступним прикладом:

int x, y; x = 5; y = 2; printf ( "% d", x / y); / * Надрукує 2 * / printf ( "% d", x% y); / * Надрукує 1, залишок від цілочисельного ділення * / x = 1; y = 2; printf ( "% d% d", x / y, x% y); / * Надрукує 0 1 * /

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

Унарний мінус примножує операнд на -1, тобто змінює його знак на протилежний.

Операції збільшення (инкремента) і зменшення (декремента)

У мові С є два корисних оператора, значно спрощують широко поширені операції. Це інкремент ++ і декремент -. Оператор ++ збільшує значення операнда на 1, а - зменшує на 1. Іншими словами,

x = x + 1;

можна записати як

++ x;

аналогічно оператор

x = x-1;

рівносильний оператору

x--;

Як інкремент, так і декремент можуть передувати операнду (префиксная форма) або слідувати за ним (Постфіксний форма). наприклад

x = x + 1;

можна записати як у вигляді

++ x;

так і у вигляді

x ++;

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

x = 10; y = ++ x;

привласнює у значення 11. Проте якщо написати

x = 10; y = x ++;

то змінної у буде присвоєно значення 10. В обох випадках х присвоєно значення 11, різниця тільки в тому, коли саме це сталося, до або після надання значення змінної у.

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

Пріоритет виконання арифметичних операторів наступний:

Найвищий

++ - - (унарний мінус) * /% Щонайнижчий + -

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

Операції порівняння і логічні операції

Операції порівняння - це операції, в яких значення двох змінних порівнюються один з одним. Логічні ж операції реалізують засобами мови С операції формальної логіки. Між логічними операціями і операціями порівняння існує тісний зв'язок: результати операцій порівняння часто є операндами логічних операцій.

В операціях порівняння і логічних операціях в якості операндів і результатів операцій використовуються значення ІСТИНА (true) і БРЕХНЯ (false). У мові С значення ІСТИНА представляється будь-яким числом, відмінним від нуля. Значення БРЕХНЯ представляється нулем. Результатом операції порівняння або логічної операції є ІСТИНА (true, 1) або БРЕХНЯ (false, 0).

На замітку Як в С89, так і в С99 значення ІСТИНА представлено будь-яким відмінним від нуля числом, а брехня - нулем. У стандарті С99 додатково визначено тип даних _Bооl, змінні якого можуть приймати значення тільки або 1. Детальніше див. частина II .

У табл. 2.5 наведено повний список операцій порівняння і логічних операцій. Таблиця істинності логічних операцій має такий вигляд:

pqp&& qp ||q! p

0 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0

Як операції порівняння, так і логічні операції мають нижчий пріоритет в порівнянні з арифметичними. Тобто, вираз 10> 1 + 12 інтерпретується як 10> (1 + 12). Результат, звичайно, дорівнює БРЕХНЯ.

В одному вираженні можна використовувати кілька операцій:

10> 5 &&! (10 <9) || 3 <4

У цьому випадку результатом буде ІСТИНА.

У мові С не визначена операція "виключає АБО" (exclusive OR, або XOR). Однак за допомогою логічних операторів нескладно написати функцію, що виконує цю операцію. Результатом операції "виключає АБО" є ІСТИНА, якщо і тільки якщо один з операндів (але не обидва) мають значення ІСТИНА. У наступному прикладі функція xor () повертає результат операції "виключає АБО", а операндами служать аргументи функції:

#include <stdio.h> int xor (int a, int b); int main (void) {printf ( "% d", xor (1, 0)); printf ( "% d", xor (1, 1)); printf ( "% d", xor (0, 1)); printf ( "% d", xor (0, 0)); return 0; } / * Виконання логічної оперции виключає АБО над двома аргументами. * / Int xor (int a, int b) {return (a || b) &&! (A && b); } Таблиця 2.5. Операції порівняння і логічні операції Оператори порівняння Оператор Операція> Більше ніж> = Більше або дорівнює <Менше ніж <= Менше або дорівнює == Так само! = Не дорівнює Логічні операції Оператор Операція && І || АБО! НЕ, заперечення

Нижче наведено пріоритет логічних операцій:

Найвищий!

>> = <<= ==! = && Щонайнижчий ||

Як і в арифметичних виразах, для зміни порядку виконання операцій порівняння і логічних операцій можна використовувати круглі дужки. Наприклад, вираз:

! 0 && 0 || 0

одно БРЕХНЯ. Однак, якщо додати дужки як показано нижче, то результатом буде ІСТИНА:

! (0 && 0) || 0

Необхідно пам'ятати, що результатом будь-якої операції порівняння або логічної операції є 0 або 1. Тому наступний фрагмент програми є правильним і в результаті його виконання буде надруковано 1.

int x; x = 100; printf ( "% d", x> 10);

порозрядні операції

На відміну від багатьох інших мов програмування, в С визначено повний набір порозрядних операцій [9] . Це обумовлено тим, що С був задуманий як мова, покликаний в багатьох додатках замінити асемблер, який здатний оперувати битами даних. Порозрядні операції - це тестування (перевірка), зрушення або привласнення значень окремих бітів даних. Ці операції здійснюються над осередками пам'яті, що містять дані типу char або int. Дані типу float, double, long double, void або інші більш складні не можуть брати участь в порозрядних операціях. У табл. 2.6 наведено повний список знаків порозрядних операцій, виконуваних над окремими розрядами (бітами) операндів.

Таблиця 2.6.Порозрядні операціїОператорОперація

& І | АБО ^ виключає АБО ~ НЕ (заперечення, доповнення до 1) >> Зсув вправо << Зрушення вліво

Таблиці істинності логічних операцій і порозрядних операцій І, АБО, НЕ збігаються. Відмінність лише в тому, що порозрядні операції виконуються над окремими розрядами (бітами) операндів. Операція "виключне АБО" має наступну таблицю істинності:

Як показано в таблиці, результат операції "виключає АБО" дорівнює ІСТИНА якщо і тільки якщо один з операндів дорівнює 1, інакше результат буде дорівнює БРЕХНЯ.

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

Операція І може бути використана для очищення біта [11] . Іншими словами, для гасіння біта використовується наступне властивість операції І: якщо біт одного з операндів дорівнює 0, то відповідний біт результату буде дорівнює 0 незалежно від стану цього біта у другому операнд. Наприклад, наступна функція читає символ з порту модему і обнуляє біт контролю парності:

char get_char_from_modem (void) {char ch; ch = read_modem (); / * Читання символу з порту модему * / return (ch & 127); }

Біт контролю парності, що знаходиться в 8-м розряді байта, обнуляється за допомогою операції І. При цьому в якості другого операнда вибирається число, що має 1 в розрядах від 1 до 7, і 0 в 8-м розряді. Саме таким числом і є 127, оскільки всі біти двійкового представлення числа 127, крім старшого, рівні 1. З огляду на зазначене властивості операції І операція ch & 127 залишає все біти, крім старшого, без зміни, а старший обнуляє:

Біт контролю парності

| V 1100 0001 змінна ch містить символ 'A' з бітом парності 0111 1111 двійкове подання числа 127 & --------- поразрядное операція І 0100 0001 символ 'A' з обнуленим бітом контролю парності

Поразрядное операція АБО, що є двоїстої операції І, застосовується для установки необхідних бітів в 1. У наступному прикладі виконується операція 128 | 3:

| V 1000 0000 двійкове подання числа 128 0000 0011 двійкове подання числа 3 | --------- поразрядное операція АБО 1000 0011 результат

Операція виключає АБО (XOR) встановлює біт результату в 1, якщо відповідні біти операндів різні. У наступному прикладі виконується операція 127 ^ 120:

| V 0000 0011 двійкове подання числа 127 0111 1000 двійкове подання числа 120 ^ --------- поразрядное операція XOR 0000 0111 результат

Необхідно пам'ятати, що результат логічної операції завжди дорівнює 0 або 1. У той же час результатом поразрядной операції може бути будь-яке значення, яке, як видно з попередніх прикладів, не обов'язково дорівнює 0 або 1.

Порозрядні оператори зсуву >> і << зрушують все біти змінної вправо або вліво. Загальна форма оператора зсуву вправо:

змінна >> колічество_разрядов

Загальна форма оператора зсуву вліво:

змінна << колічество_разрядов

Під час зсуву бітів в один кінець числа, інший кінець заповнюється нулями. Але якщо число типу signed int негативно, то при зсуві вправо лівий кінець заповнюється одиницями, так що знак числа зберігається. Необхідно зазначити відмінність між зрушенням і циклічним зрушенням. При циклічному зсуві біти, що зсуваються за межі операнда, з'являються на іншому кінці операнда. А при зсуві вийшли за кордон біти втрачаються.

Порозрядні операції зсуву дуже корисні при декодуванні виходів зовнішніх пристроїв, наприклад таких, як цифро-аналогові перетворювачі, а також при зчитуванні інформації про статус пристроїв. Побітові оператори зсуву можуть швидко множити і ділити цілі числа. Як показано в табл. 2.7, зрушення на один біт вправо ділить число на 2, а на один біт вліво - примножує на 2. Наступна програма ілюструє застосування операторів зсуву:

/ * Приклад застосування операторів зсуву. * / #Include <stdio.h> int main (void) {unsigned int i; int j; i = 1; / * Зрушення вліво * / for (j = 0; j <4; j ++) {i = i << 1; / * Зрушення i вліво на 1 разраяд, що рівносильно множенню на 2 * / printf ( "Зрушення вліво на% d розр .:% d \ n", j, i); } / * Зрушення вправо * / for (j = 0; j <4; j ++) {i = i >> 1; / * Зрушення i вправо на 1 разраяд, що рівносильно поділу на 2 * / printf ( "Зрушення вправо на% d розр .:% d \ n", j, i); } Return 0; } Таблиця 2.7. Множення і ділення операторами зсуву unsigned char x x після операції значення x x = 7 0000 0111 7 x = x << 1 0000 1110 14 x = x << 3 0111 0000 112 x = x << 2 1100 0000 192 x = x> > 1 0110 0000 96 x = x >> 2 0001 1 000 24 Кожен зсув вліво примножує на 2. Втрата інформації сталася після операції x << 2 в результаті зсуву за ліву межу.
Кожен зсув вправо ділить на 2. Зрушення вправо втрачену інформацію не відновив.

Поразрядное операція заперечення (доповнення) ~ інвертує стан кожного біта операнда. Тобто, 0 перетворює в 1, а 1 - в 0.

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

Вихідний байт 0010100 После 1-го заперечення 1101011 После 2-го заперечення 0010100

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

У наступному прикладі оператор заперечення використовується в функції шифрування символу:

/ * Найпростіша процедура шифрування. * / Char encode (char ch) {return (~ ch); / * Оперцій заперечення * /}

Звичайно, зламати такий шифр не становить труднощів.

Операція?

У мові С визначено потужний і зручний оператор, який часто можна використовувати замість оператора виду if-then-else. Йдеться про тернарного операторі?, Загальний вигляд якого наступний:

Вираз1?Вираженіе2: вираз3;

Зверніть увагу на використання двокрапки. Оператор? працює наступним чином: спочатку обчислюється Вираз1, якщо воно істинне, то обчислюється Вираженіе2 і його значення присвоюється всьому висловом; якщо Вираз1 помилково, то обчислюється вираз3 і всьому висловом присвоюється його значення. У прикладі

x = 10; y = x> 9? 100: 200;

змінної у буде присвоєно значення 100. Якби х було менше 9, то змінної у було б присвоєно значення 200. Цю ж процедуру можна написати, використовуючи оператор if-else:

x = 10; if (x> 9) y = 100; else y = 200;

Більш докладно оператор? обговорюється в розділі 3 в зв'язку з умовними операторами.

Операція отримання адреси (&) і розкриття посилання (*)

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

Перший з них - оператор &, це унарний оператор, який повертає адресу операнда в пам'яті [12] . (Унарна операцією називається операція, що має тільки один операнд.) Наприклад, оператор

m = & count;

записує в змінну m адреса змінної count. Ця електронна адреса являє собою адресу осередки пам'яті комп'ютера, в якій розміщена змінна. Адреса і значення змінної - абсолютно різні поняття. Вираз "& змінна" означає "адреса змінної". Отже, інструкція m = & scount; означає: "Перемінної m присвоїти адресу, за якою розташована змінна count;".

Припустимо, змінна count розташована в пам'яті в осередку з адресою 2000, а її значення дорівнює 100. Тоді в попередньому прикладі змінної m буде присвоєно значення 2000.

Другий даний оператор * є двоїстим (доповнює) по відношенню до & [13] . Оператор * є унарним оператором, він повертає значення об'єкта, розташованого за вказаною адресою. Операндом для * служить адреса об'єкта (змінної). Наприклад, якщо змінна m містить адресу змінної count, то оператор

q = * m;

записує значення змінної count в змінну q. У нашому прикладі змінна q отримає значення 100, тому що за адресою 2000 записано число 100, причому ця адреса записаний в змінної m. Вираз "* адреса" означає "за адресою". Наш фрагмент програми можна прочитати як "q отримує значення, розташоване за адресою m".

На жаль, символ операції розкриття посилання збігається з символом операції множення, а символ операції отримання адреси - з символом операції поразрядного І. Необхідно пам'ятати, що ці оператори не мають ніякого відношення один до одного. Оператори * і & мають більш високий пріоритет, ніж будь-яка арифметична операція, крім унарна мінуса, що має такий же пріоритет.

Якщо змінна є покажчиком, то в оголошенні перед її ім'ям потрібно поставити символ *, він повідомить компілятору про те, що це покажчик на змінну даного типу. Наприклад, оголошення покажчика на змінну типу char записується так:

char * ch;

Необхідно розуміти, що ch - це не змінна типу char, а покажчик на змінну даного типу, це абсолютно різні речі. Тип даних, на який вказує покажчик (в даному випадку це char), називається базовим типом покажчика [14] . Сам покажчик є змінною, що містить адресу об'єкта базового типу. Компілятор врахує розмір покажчика в архітектурі комп'ютера і виділить для нього необхідну кількість байтів, щоб в покажчик помістився адресу. Базовий тип покажчика визначає тип об'єкта, що зберігається за цією адресою.

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

int x, * y, count;

оголошує х і count як змінні цілого типу, а у - як покажчик на змінну цілого типу.

У наступній програмі оператори * і & використовуються для запису значення 10 в змінну target. Програма виведе значення 10 на екран.

#include <stdio.h> int main (void) {int target, source; int * m; source = 10; m = & source; target = * m; printf ( "% d", target); return 0; }

Операція визначення розміру sizof

Унарна операція sizeof, яка виконується під час компіляції програми, дозволяє визначити довжину операнда в байтах. Наприклад, якщо компілятор для чисел типу int відводить 4 байта, а для чисел типу double - 8, то наступна програма надрукує 8 4.

double f; printf ( "% d", sizeof f); printf ( "% d", sizeof (int));

Необхідно пам'ятати, що для обчислення розміру типу змінної ім'я типу повинна бути укладена в круглі дужки. Ім'я змінної укладати в дужки не обов'язково, але помилки в цьому не буде.

У мові С визначається (за допомогою специфікатор класу пам'яті typedef) спеціальний тип size_t, приблизно відповідний цілому числу без знака. Результат операції sizeof має тип size_t. Але практично його можна використовувати всюди, де допустимо використання цілого числа без знака.

Оператор sizeof дуже корисний для поліпшення переносимості програм, так як переносимість істотно залежить від розмірів вбудованих типів даних. Для прикладу розглянемо програму, що працює з базою даних, в якій необхідно зберігати шість цілих чисел в одному записі. Якщо ця програма призначена для роботи на багатьох комп'ютерах, ні в якому разі не можна покладатися на те, що розмір цілого числа на всіх комп'ютерах буде один і той же. У програмі слід визначати розмір цілого, використовуючи оператор sizeof. Відповідна програма має наступний вигляд:

/ * Запис шести цілих чисел в дисковий файл. * / Void put_rec (int rec [6], FILE * fp) {int len; len = fwrite (rec, sizeof (int) * 6, 1, fp); if (len! = 1) printf ( "Помилка при записі"); }

Наведена функція put_rec () компілюється і виконується правильно в будь-якому середовищі, в тому числі на 16- і 32-розрядних комп'ютерах.

І на закінчення: оператор sizeof виконується під час трансляції, його результат в програмі розглядається як константа.

Оператор послідовного обчислення: оператор "кома"

Оператор "кома" [15] пов'язує воєдино кілька виразів. При обчисленні лівій частині оператора "кома" завжди мається на увазі, що вона має тип void. Це означає, що вираз, що стоїть праворуч після оператора "кома", є значенням за все розділеного комами вираження. Наприклад, оператор

x = (y = 3, y + 1);

спочатку присвоює у значення 3, а потім привласнює х значення 4. Дужки тут обов'язкові, тому що пріоритет оператора "кома" менший, ніж оператора присвоювання.

В операторі "кома" виконується послідовність операцій. Якщо цей оператор варто в правій частині оператора присвоювання, то його результатом завжди є вираз, що стоїть останнім у списку.

Оператор доступу до члена структури (оператор. (Точка)) і оператор доступу через покажчик -> (оператор стрілка)

У мові С оператори. (Точка) і -> (стрілка) забезпечують доступ до елементів структур та об'єднань. Структури і об'єднання - це складові типи даних, в яких під одним ім'ям зберігаються багато об'єктів. (Структури та об'єднання детально розглядаються в чолі 7 .)

Оператор точка використовується для прямого посилання на елемент структури або об'єднання, тобто перед точкою стоїть ім'я структури, а після - ім'я елемента структури. Оператор стрілка використовується з покажчиком на структуру або об'єднання, тобто перед стрілкою стоїть вказівник на структуру. Наприклад, у фрагменті програми

struct employee {char name [80]; int age; float wage; } Emp; struct employee * p = & emp; / * Адреса emp заноситься в p * /

для присвоєння члену wage значення 123.33 необхідно записати

emp.wage = 123.23;

Те ж саме можна зробити, використавши покажчик на структуру:

p-> wage = 123.23;

Оператор [] і ()

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

#include <stdio.h> char s [80]; int main (void) {s [3] = 'X'; printf ( "% c", s [3]); return 0; }

значення 'Х' спочатку присвоюється четвертому елементу масиву (в С елементи масиву нумеруються з нуля), потім цей елемент виводиться на екран.

Зведення пріоритетів операцій

У табл. 2.8 наведені пріоритети всіх операцій, визначених у С. Необхідно пам'ятати, що всі оператори, окрім унарних і "?", Пов'язують (приєднують, асоціюють) свої операнди зліва направо. Унарні оператори (*, &, -) і "?" пов'язують (приєднують, асоціюють) свої операнди справа наліво.

Таблиця 2.8.Пріоритети опреаций в мові CНайвищий

() [] ->. ! ~ ++ - - (type) * & sizeof
* /%
+ -
<< >>
<<=>> =
==! =
&
^
|
&&
||
?:
= + = - = * = / = і т.д. Щонайнижчий,

[1] В даному випадку під оператором мається на увазі, звичайно, знак операції. З цього приводу див. Зроблену раніше примітка редактора про переведення терміна operator

[2] lvalue - іменує вираз, тобто вираз, яке може стояти в лівій частині оператора присвоювання. Під lvalue також часто мається на увазі адреса змінної. (З ідентифікатором змінної в програмі пов'язано дві величини: адреса змінної і її значення. Адреса використовується, коли змінна варто в лівій частині присвоювання, значення - в правій частині присвоювання.) Іноді зустрічається і термін l-значення. Як би там не було, цим терміном позначається вираз, яке може перебувати в лівій частині оператора присвоювання. Семантично воно являє собою адресу, за якою розміщена змінна, масив, елемент структури і т.п.

[3] rvalue - значення змінної; іноді перекладається, як r-значення, тобто значення в правій частині оператора присвоювання.

[4] Множинне присвоювання - присвоювання одного і того ж значення декільком змінним. Під множинним привласненням також мається на увазі конструкція мови програмування, що дозволяє привласнити одне і те ж значення декільком змінним одночасно.

[5] З цієї причини варіанти оператора присвоювання, в яких використовується такий запис, називаються "скороченими" або "укороченими". Що стосується термінології, то необхідно відзначити також таку обставину. Хоча терміни присвоювання і оператор присвоювання часто можуть розглядатися як синоніми, складене присвоювання не є складовим оператором! (Під складеним оператором в мові С мають на увазі блок.)

[6] Під "складовими" операторами в даному випадку, звичайно, маються на увазі складові знаки операцій, тобто знаки операцій, що складаються з декількох (зазвичай двох) символів. Складові оператори-блоки не мають до цього ніякого відношення.

[7] На жаргоні програмістів: декрементація.

[8] На жаргоні програмістів: інкрементація.

[9] Називаються також бітовими, побітові і логічними операціями.

[10] Біт контролю парності називається також контрольним двійковим розрядом парності, контрольним розрядом парності, перевірочним двійковим розрядом парності, перевірочним розрядом парності, бітом парності, розрядом парності, контрольним бітом і бітом контролю на парність. Це додатковий біт, який додається до групи (зазвичай з семи) бітів. Передавальний пристрій встановлює значення біта парності рівним нулю або одиниці так, щоб сума бітів в кожному байті завжди була парній або непарній в залежності від вибору типу перевірки - на парність або непарність. Невиконання умови такої перевірки на приймальному кінці лінії означає спотворення принаймні одного біта при передачі. При виявленні помилки приймаючий пристрій робить запит на повтор даних. Іншими словами, це біт, що додається до даних для контролю їх вірності таким чином, щоб сума довічних одиниць, що складають дане, включаючи одиницю контрольного біта, завжди була парній (або завжди непарній).

[11] Очищення біта - гасіння, тобто занесення нуля.

[12] Оператор & називається також оператором отримання (взяття) адреси.

[13] Оператор * називається також оператором побічно, оператором розкриття посилання і оператором разименованія адреси.

[14] Іноді називається також основним або вихідним типом.

[15] Найчастіше зустрічається написання без лапок: оператор кома. Ми пишемо лапки лише для того, щоб новачкам було легше сприймати кілька незвичне для них назву оператора.

Зміст

| <<< | >>>

Операція?
Йдеться про тернарного операторі?
Оператор?
Необхідно пам'ятати, що всі оператори, окрім унарних і "?
Унарні оператори (*, &, -) і "?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью