Вирази та операції Вираз – послідовність операндів, обєднаних знаками операцій та круглими дужками. Операнди – обєкти, над якими виконуються операції; операції – задають дії над операндами. Приклад: 0.5*(z+w)>=(z-u)/(w-u) kor=sin(x)-2*exp(x-0.7) Класифікація операцій: 1) за кількістю операндів - Унарні (-A) –Бінарні (A+B) –Тринарні ((A)?B:C)
2) за видом дій - арифметичні –операції присвоювання; –операції відношення; –логічні; –порозрядні( побітові), інші. 3)за приоритетом поділяють на 16 рівнів. Найвищій мають операції звертання до функції, до елементу масиву, структури; потім – інкремент та декремент,…., арифметичні,.., відношення,.., кома Порядок виконання – за приоритетом та залежно від асоціативності. Порядок можно змінювати за допомогою круглих дужок. Приклад: x<=5.7*(x-y)/(cos(y)-sin(x))
Арифметичні операції
Приклад int b=7, g=3 b/g => 2 g/b =>0 b%g =>1 -b => -7 Щоб частка була дійсною, дйісним має бути хоча б один операнд 7.0/3 (double)b/3 Операція явного перетворення типу (тип) - унарна арифметична операція зміни знака Порозрядні операції (побітові) виконуються тільки над операндами цілих типів і дають змогу працювати з окремими бітами даних (можливості асемблера)
Операції присвоювання Група з 15 операцій: унарних (++ --) та бінарних. Змінюють значення свого операнда: у разі бінарних операцій лівий операнд набуває значення виразу, записаного справа; у разі унарних операцій змінюється початкове значення операнда. Операнд, якому присвоюється значення повинен бути L-value (змінною або розадресованим вказівником). Для бінарних операцій присвоєння виконується справа наліво. Унарні операції присвоювання ++ інкремент (збільшує значення на 1) -- декремент ( зменшує на 1) ++ К (префіксна форма) К++ (постфіксна форма) Приклад: sum+=n (sum=sum+n); k+=1 (k++ або k=k+1) В мові Сі допускаються присвоювання виду : a=(b=c=1)+1; Приклад: int data1, data2, data3; data1=data2=data3=68;
Бінарні операції присвоювання
Операції порівняння В мові Сі немає логічного типу (булевого), тому результатом умовного виразу є цілочисельне арифметичне значення. "Істинно" - це ненульова величина, а "хибно" - це нуль. Приклади: #include x<xmin == y<=ymax Void main() ( приоритет == нижчий. Результат { буде істиним, коли обидві операції int tr, fal; порівняння одночасно будуть tr=(111<=115); /* вираз істинний */ істиними або хибними) fal=(111>115); /* вираз хибний */ printf("true - %d false - %d \n",tr,fal); }
Логічні операції
Операндами логічних операцій є логічні дані (найчастіше це вирази з операціями порівняння) Приклад !(x>a && x<b) буде істинним, коли x поза (a, b); замість порівняння x==0 записують !x Логічні вирази не обовязково повністю обчислюються: як тільки значення стає однозначним, обчислення припиняються. k =ksum ( якщо вираз зліва хибний-дорівнює 0 –то правий операнд не обчислюється) Лівий операнд логічних операцій завжди обчислюється першим.
Операція слідування (кома) Операція "кома" (,) називається операцією слідування, яка "зв'язує" два довільних вирази. Список виразів, розділених між собою комами, обчислюються зліва направо. Наприклад, фрагмент тексту a=4; b=a+5; можна записати так : a=4, b=b+5; Приклад1: int a[10],sum,i; /*... */ sum=a[0]; for (i=1;i<10;i++) sum+=a[i]; Приклад 2: int a[10],sum,i; /*... */ for (i=1,sum=a[0];i<10;sum+=a[i],i++) ;
Умовна операція ?: Синтаксис: умова ? вираз_1 : вираз_2 Спочатку обчислюється вираз умови. Якщо цей вираз має ненульове значення, то обчислюється вираз_1. Результатом операції ?: в даному випадку буде значення виразу_1. Якщо вираз умови рівний нулю, то обчислюється вираз_2 і його значення буде результатом операції. В будь-якому випадку обчислюється тільки один із виразів (вираз_1 або вираз_2). Наприклад, дану операцію зручно використати для знаходження найбільшого з двох чисел x і y: max=(x>y)?x:y; Можна замінити умовний оператор Приклад: Z=(0.1-sin(x))?(x*sin(x)):(x*cos(x)); Якщо 0.1-sin(x)=0, то z=x*sin(x). Инакше - z=x*cos(x).
Операція sizeof() Дана операція обчислює розмір пам'яті, необхідний для розміщення в ній виразів або змінних вказаних типів. Операція має дві форми : 1.ім'я_типу А; sizeof А; 2.sizeof (ім'я_типу); Операцію sizeof() можна застосовувати до констант, типів або змінних, у результаті чого буде отримано число байт, що відводяться під операнд. Приміром, sizеof(int) поверне число байт для розміщення змінної типу int.
Узгодження типів у виразах Якщо операнди бінарної операції мають різні арифметичні типи, то компілятор перевіряє сумісність і встановлює спільний тип. 1) Перетворення типів в операціях присвоєння: тип виразу справа від знака = до типу змінної (чи L-операнда). Якщо тип змінної старший, то тип виразу підтягується до типу змінної. Якщо тип змінної молодший, то значення перетворюється (обтинається) до типу змінної (можливі помилки !) Приклад: int m; m=2.1; /* m=2 */ m=2.9; /* m=2*/ вираз з використанням явного перетворення типу, що повертає цілочисельне значення, найближче до дійсного Х (з діапазону доп. значень типу int ) x>0 ?(int)(x+0/5):(int)(x-0/5) 2) Арифметичні перетворення типів: встановлено таку ієрархію типів
Приклад
Стандартні математичні функції Підключення бібліотеки директивою препроцесора # include Всі функції мають тип double. Аргумент теж типу double. Приклад Y=sin(0.5*x)+sqrt(0.3e-2)*pow(2.0,x-1); Можливо створювати макроси з параметрами (не плутати з функціями!), що оброблюються препроцесором. Приклад #define ABS(x) ((x)<0 ? -(x) :(x)) /* абсолютне значення*/ Основні математичні функції