Основні операції мови С

Арифметичні операції. Унарний мінус() – арифметичне заперечення операнда. Наприклад:

I=12;

I=–i;//i=–12

Бінарні: додавання (+), віднімання (–), множення (*), ділення (/), залишок від ділення цілих значень (%). Наприклад:

int i=5,j=4,s,p,q;

s=i+j;//s==9

p=i*2;//p==10

q=i%j//q==1

Операції порівняння. Менше (<),більше (>),менше або дорівнює (<=),більше або дорівнює (>=),не дорівнює (!=),дорівнює (==). Наприклад:

If(a<b)a=b;else b=a;

Логічні операції. Логічне заперечення операнда (!). Унарна операція заперечення перетворює ненульовий, чи істинний, операнд на 0, а нульовий, чи хибний, – на 1. Стандартне використання операції!:

if(!inword)

замість if(inword==0)

Бінарні операції: логічне " і " (&&); логічне "або" (||). Вирази, де використовуються операції && та ||, обчислюються зліва направо, причому їхній розгляд припиняється, як тільки стає ясно, буде результат істиною чи хибним значенням. Це дуже важливо для написання правильно працюючих програм. Наприклад:

a=1;

if(a==1||a==2)printf("%d',a);

Тут порівняння а==2 уже не виконується.

Побітові логічні операції. У мові С передбачено кілька операцій для роботи з бітами, але їх не можна застосовувати до змінних типу float чи double:

a побітове 'і' (&) – результатом операції є кон'юнкція побітового зображення чисел;

a побітове, що включає "або" (|) – результатом операції є диз'юнкція побітового зображення чисел;

a побітове виключне "або" (^) – результатом операції є додавання по модулю 2 побітового зображення чисел;

a зсув ліворуч (<<) – зсуває ліворуч побітове зображення лівого операнда на кількість розрядів, указану як правий операнд (праворуч дописуються нулі);

a зсув праворуч (>>) – зсуває праворуч побітове зображення лівого операнда на кількість розрядів, указану як правий операнд (ліворуч дописується копія знакового біта чи 0);

a доповнення (~) – результатом операції є побітове заперечення операнда.

Побітова операція & часто використовується для маскування деякої кількості бітів; наприклад, оператор c=n&0177;передає в 'с' сім молодших бітів n, установлюючи інші біти рівними нулю.

Операція | використовується для вмикання бітів: c=x|mask;у становлює в одиницю ті біти в х, що дорівнюють одиниці в mask.

Треба відрізняти побітові операції & і | від логічних зв'язок && і ||, що передбачають обчислення значення істинності зліва направо. Наприклад, якщо х=1, а y=2, то значення x&y дорівнює нулю, у той час як значення x&&y – одиниці.

Операції зсуву <<і>> здійснюють, відповідно, зсув ліворуч і праворуч лівого операнда на кількість бітових позицій, що задаються правим операндом. Таким чином, х<<2 зсуває х ліворуч на дві позиції, заповнюючи вивільнені біти нулями, що еквівалентно множенню на 4. Зсув праворуч величини без знака заповнює вивільнювані біти нулями.

Унарна операція ~ дає доповнення до цілого; це означає, що кожен біт зі значенням 1 отримує значення 0, і навпаки. Ця операція корисна у виразах типу x&~077,де останні шість бітів х стають нульовими. Підкреслимо, що вираз x&~077 не залежить від довжини слова. Щоб проілюструвати використання деяких операцій з бітами, розглянемо функцію getbits(x,p,n), що повертає (зсунутим до правого краю), починаючи з позиції р, поле змінної х довжиною n бітів. Ми припускаємо, що крайній правий біт має номер 0 і що n і p – коректно задані додатні числа. Наприклад, getbits(x,4,3) повертає зсунутими до правого краю біти, що займають позиції 4, 3 і 2:

getbits(x,p,n) /*get n bits from position p*/unsigned x,p,n;{return ((x>>(p+1-n))&~(~0<<n));}

Операція x>>(р+1–n) зсуває поле в правий кінець слова. Опис аргументу х як unsigned гарантує, що за зсуву праворуч вивільнювані біти заповнюватимуться нулями. Усі біти константного виразу ~0 дорівнюють 1; зсув його на n позицій ліворуч за допомогою операції ~0<<n створює маску з нулями в n крайніх правих бітах та одиницями – в інших; доповнення ~ створює маску з одиницями в n крайніх правих бітах. Наприклад:

char i=13,j=7,q,w,e,r,t;

q=i&j;//результат:i==5

w=i|j;//результат:15

e=i^j;//результат:9

r=j<<1;//результат:14

//i зображується побітово як 00001101

//j – 00000111

//результати – i&j – 00000101, i|j – 00001111, i^j – 00001010, j<<1 – 00001110

Операції адресації та взяття значення:

a адресація (&) повертає адресу операнда;

a взяття значення (*) повертає значення, адреса якого вказується операндом.

Ці операції мають фундаментальне значення в програмуванні мовою С. Наприклад:

int *p;

int a=2;

p=&a;//р містить адресу змінної а

int b;

b=*p; //b містить значення 2

Операція послідовного виконання. Розглянемо її структуру:

<вираз>,<вираз>[…]

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

а) for (i=0;i<30;i++,j++,k++) {}

Тут у виразі-прирості є операція послідовного виконання, яка забезпечує одночасне збільшення значень змінних i,j та k;

б) нехай оголошена функція int f(int); має один аргумент типу int. Тоді можна здійснити її виклик:

f(a+=b,6) або

f(i++,b=5,c=9,a=b+4,k=7);

У цьому випадку параметром функції (він має бути одним, згідно з оголошенням) виступає результат операції послідовного виконання: для випадку a+=b,6 – це 6, для випадку i++,b=5,c=9,a=b+4,k=7 – 7.

Операції інкремента(++)та декремента(––). Існує дві форми операцій інкремента й декремента – інфіксна та постфіксна. В інфіксній операція стоїть перед операндом, у постфіксній – після. В інфіксній формі спочатку відбувається зміна операнда, а потім він використовується у відповідному виразі. У постфіксній формі спочатку операнд використовується у виразі, а потім його значення змінюється.

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

Операція інкремента дозволяє скорочувати текст програми завдяки конструкціям вигляду i+++j. Вона також використовується в технології створення програмних компонент. Як приклад розглянемо задачу-жарт. Яка мова програмування краща: С чи С++?

#include <stdio.h>void main(){int C=0;puts("Що краще: С чи С++?");if(C>C++)puts("Очевидно,С краще.");else if(C==C++)puts("Визначити не вдалося.");else /*C<C++*/puts("Безсумнівно, краще С++.");} Яким буде результат? Розглянемо програму детальніше. У рядку if(C>C++) використано постфіксну форму операції інкремента. Спочатку операнд, яким є змінна С, використовується в умовному виразі, тобто фактично перевіряється істинність умови C>C, яка є хибною. Однак одразу після цього спрацьовує операція інкремента, і змінна С стає рівною 1. Тоді виконується оператор else if(C==C++), і ми маємо аналогічну ситуацію, тобто фактично перевіряється істинність умови C==C, яка завжди виконується. Тому й друкується повідомлення: Визначити не вдалося. Як бачимо із цієї простої програми, операції інкремента не просто скорочують запис, а й мають особливе змістове навантаження. Щоб зрозуміти його, досить написати аналогічну програму без використання операції інкремента.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: