Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

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, яка завжди виконується. Тому й друкується повідомлення: Визначити не вдалося.

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

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

<операнд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

справа наліво

|

зліва направо

*/%

зліва направо

&&

зліва направо

+ –

зліва направо

||

зліва направо

<< >>

зліва направо

?:

справа наліво

< <= > >=

зліва направо

= += -=

справа наліво

'

зліва направо