Всего на сайте:
210 тыс. 306 статей

Главная | Механика

Masyv f();. Функція не може повертати функцію. Порядок інтерпретації складеного о..  Просмотрен 361

Функція не може повертати функцію.

Порядок інтерпретації складеного описувача:

a інтерпретація починається з ідентифікатора;

a інтерпретуються дужки, що стоять праворуч від ідентифікатора, тобто масив чи функція;

a інтерпретується *, що стоїть ліворуч. Наприклад:

double*(**i[5])(int)

Ідентифікатор "i" – це ім'я масиву із п'яти елементів – покажчиків на покажчик на функцію, яка має один аргумент типу int і повертає покажчик на тип double.

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

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

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

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

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

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

Предыдущая статья:Структура С-програми. C-програма може містити (див. детальніше підрозд. 3.6): a директив.. Следующая статья:Int rozmir;. rozmir=sizeof(int); rozmir=sizeof(a+b–4+3.5e-4); Коли <вираз> ..
page speed (0.0133 sec, direct)