Приоритети на работа - WinAVR и AVR Studio - Програмиране - Инструкции - Приднестровски портал
Всяка операция има свой собствен приоритет, който определя реда, в който се оценява операцията в израза: ако няколко операции с еднакъв приоритет следват в редица отляво надясно, редът на тяхното изчисляване не е определен, но резултатът от изчислението е гарантирано правилен, в противен случай първо се изчисляват операциите с най-висок приоритет, а след това тези с по-нисък. Редът на оценяване може да се промени с помощта на скоби: изразът в скоби винаги се оценява първи, т.е. има най-висок приоритет.
Таблицата изброява всички операции с техните приоритети:
Операция | Приоритет |
! |
"унарен плюс и минус" ++ -- ? операция за деименуване на указател *
Тъй като е доста трудно да се запомнят всички приоритети, желателно е първоначално (и изобщо не е забранено винаги) да посочите реда на изчисленията с помощта на скоби. Използването на операторите ++ и -- заедно с указателите води до необходимостта да запомните реда на операциите:
var = (5 2) + 2; // var ще бъде настроен на 2
var = (5 >= 2) + 2; // var ще бъде настроен на 3
Особено внимание трябва да се обърне на приоритета на операциите:
var = (5 > 2) + 2; //вар = 3
var = 5 > 2+2; //вар = 0
Вторият израз има по-висок приоритетима аритметична операция събиране, така че var ще бъде зададена на стойността на израза 5 > 4, което е НЕВЯРНО, т.е. var ще бъде 0.
Най-простият и универсален съвет би бил да се използват скоби навсякъде, където е необходимо точно да се гарантира редът на изчисленията - в този случай всички оператори могат да се считат (разбира се, само условно!) с еднакъв приоритет и редът на изчисленията може да се определи само с помощта на скоби. Може би това ще доведе до някои прекомерни "скоби" на програмата, но гарантира, че плановете на програмиста не се разминават с мнението на компилатора.
Унарните оператори за нарастване и намаляване, споменати по-рано, са една от интересните характеристики на езика C. Тези оператори могат да се прилагат само към променлив операнд и никога към постоянен операнд. Но най-важното е, че те могат да бъдат префиксни и постфиксални, т.е. написана или отляво на променливата, или отдясно:
var++; // сега var = 2
--var; // сега var = 1
Изглежда, защо два начина да направите едно и също нещо? Всичко опира до това как резултатът от оператора ще се използва при изчисляване на изрази. Ето един пример:
int b = var++ - 5; // var става 6
int c = ++var - 5; // var става 7
Променливата b ще бъде равна на 0, а променливата c ще бъде равна на 2. Работата е там, че с постфиксния оператор ++ първо се използва стойността на променливата в израза и след това се изпълнява операторът за нарастване, а с префиксна нотация първо се изпълнява операторът за нарастване и след това вече актуализираната стойност на променливата се използва при изчисляване на израза.
Операторите за побитово преместване " и " преместват битовете на операнда отляво с броя битове, дадени от израза отдясно. Както вече споменахме, тези оператори запазват знака налявооперанд, ако операндът е число със знак. Попълването на "освободените" цифри за числа без знак става с нули.
Унарните логически операции и операцията за побитова инверсия имат само една опция за изчисление. Но, за съжаление, тук свършват простите оператори, всички останали оператори имат по-сложна форма на писане и съответно извършват по-сложни действия, които заслужават отделно разглеждане.