Операція присвоювання

<операнд1>=<операнд2>

Будь-яка операція повертає значення. Значенням операції присвоєння є значення правого операнда. Воно повинне мати тип лівого операнда (якщо типи не збігаються, то відбуваються їхнє перетворення за умовчанням). Наприклад:

a=(i=5)+4;

a=b=c=d=1;

Існує складена операція присвоювання. Синтаксично вона складається із двох символів: деякої бінарної операції та присвоювання:

+=, *=, /=, %=, <<=, >>=, ^=,!=, -=, &=

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

int i=1,j=2;

i+=j; /*i==3*/;

i+=1; /*i==2*/;

Умовна операція

<умовний вираз>?<вираз1>:<вираз2>

Спочатку обчислюється умовний вираз. Якщо його значення істинне, то обчислюється вираз1, інакше – вираз2. Типи виразів мають збігатися.

Конструкція

if(i>5)j=3;

else j=4;

еквівалентна такій:

(i>5)?j=3:f=4;

Операція sizeof

sizeof <вираз>

Повертає обсяг об'єкта у байтах.

int rozmir;

rozmir=sizeof(int);

rozmir=sizeof(a+b–4+3.5e-4);

Коли <вираз> є ім'ям масиву, значенням операції sizeof є весь розмір масиву у байтах. Наприклад, якщо оголосити масив char s[23], то sizeof(s) поверне значення 23.

На практиці сума розмірів компонент структури може не дорівнювати розміру самої структури. Тоді операція sizeof дасть реальний розмір об'єкта.

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

int x,y=5,z=4;

x=12000*+(y*0.001);

Пріоритет операцій. Пріоритет збільшується зверху вниз. Порядок слід ураховувати при обчисленні виразів з рівним пріоритетом (табл. 3.1).

Таблиця 3.1

Операція Порядок Операція Порядок
() [] -> зліва направо ==!= зліва направо
! ~ справа наліво & зліва направо
++ -- справа наліво ^ зліва направо
(type)*&sizeof справа наліво | зліва направо
*/% зліва направо && зліва направо
+ – зліва направо || зліва направо
<< >> зліва направо ?: справа наліво
< <= > >= зліва направо = += -= справа наліво
    ' зліва направо

Оператори мови С

Прості оператори

Порожній оператор. Синтаксис: ;. Використовується у випадку, коли за синтаксисом вимагається наявність оператора. Наприклад:

for(;;);

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

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

{

a=4;

b=5;

c=6;

}

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

{int i=5

j++;

{float i=4;

i+=5}

}

Умовний оператор

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

if(<умовний вираз>)<оператор1>[else<оператор2>]

Оператор діє так: якщо <умовний вираз> виявиться істинним значенням (а таким значенням ув мові С вважається будь-яке число, відмінне від нуля), то виконується <оператор1>. У протилежному випадку, за наявності необов'язкової конструкції [else<оператор2>], виконується <оператор2>. Наприклад:

if(a>5)i++;

else j++;

Допускається послідовне використання оператора:

if(i>j)i++;

Else

if(i==j)j++;

else printf("the end");

За такої інтерпретації оператор else пов'язується з найближчим оператором if, у якого відсутня конструкція else. Останній фрагмент програми:

if(i>j)i++;

Else

{if(i==j)j++;

else printf("the end');}

Використання складеного оператора в такому випадку робить програму більш читабельною.

Зауважимо, що на відміну від інших мов програмування, Сі не містить ключового слова then. Ті, хто вивчає Сі, уже знаючи мову Pascal, дуже часто роблять помилки, наприклад у такому фрагменті програми: if(x>2)then x=2; Умови в операторах if (а також while) мають братися в круглі дужки. Тому в наступному рядку буде помилка: ifx<1x=1;

Оператор циклу for

Оператор for використовується для запису алгоритмів із циклічною структурою і несе в мові С особливе навантаження. Синтаксис:

for([<початковий вираз>];[<умовний вираз>];[<вираз-приріст>])<оператор>

Оператор діє так. Спочатку обчислюється <початковий вираз>, потім перевіряється <умовний вираз>, у випадку його істинності виконується <оператор>, а після цього – <вираз-приріст>. Однак <початковий вираз>, <умовний вираз>, <вираз-приріст> можуть бути відсутніми. Обов'язковою є лише наявність <оператора> (синтаксично мають бути наявні відповідні крапки з комою). Якщо умовного виразу немає, то значення його вважається істинним. Тому мінімальний оператор for має вигляд for(;;);.

Зазвичай <початковий вираз> на практиці використовується для початкової ініціалізації змінних, <умовний вираз> визначає умову виконання оператора, що задає тіло циклу, а <вираз-приріст> задає умову зміни змінних, що використовуються в циклі, наприклад як лічильники. Нехай нам необхідно кілька разів надрукувати повідомлення "Hello, world". Для цього використаємо оператор for:

for(i=j=0;i<10;i++);

printf("Hello,world\n");

Відповідне повідомлення надрукується 10 разів. При цьому у <початковому виразі> ініціалізуються одразу дві змінні – i та j.

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

Розглянемо таку задачу. Нехай необхідно надрукувати рядок довжиною WIDTH, у якому спочатку міститься x0 символів '-', потім w символів '*', і до кінця рядка – знову символи '-':

Це можна запрограмувати так: int x;for(x=0;x<x0;++x) putchar('-');for(;x<x0+w;x++) putchar('*');for(;x<WIDTH;++x) putchar('-');putchar('\n');

або

for(x=0;x<WIDTH;x++)putchar(x<x0?'-':x<x0+w?'*':'-');putchar('\n');

Допоміжні змінні, які не мають змісту (напр., лічильник повторення циклу, що не використовується в самому тілі циклу), прийнято позначати однією літерою, наприклад i,j. Можна навіть написати так:

main(){int_;for(_=0;_<10;_++) printf("%d\n",_);}

(підкреслювання в ідентифікаторах – рівноправна літера).


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



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