Операции и изрази

Операторите позволят обработка на прими¬тивни типове данни и обекти. Те приемат като вход един или няколко операнда и връщат като резултат някаква стойност. Операторите в C# представляват специални символи (катонапример "+", ".", "^" и други) и извършат специфични преобра¬зувания над един, два или три операнда. Пример за оператори в C# са знаците за събиране, изваждане, умножение и делене в математиката (+, - , *, /) и операциите, които те извършват върху целите и реалните числа.

Операторите в C# могат да бъдат разделени в няколко различни категории:

• Аритметични – също както в математиката, служат за извършване на прости математически операции.

• Оператори за присвояване – позволяват присвояването на стойност на променливите.

• Оператори за сравнение – дават възможност за сравнение на два литерала и/или променливи.

• Логически оператори – оператори за работа с булеви типове данни и булеви изрази.

• Побитови оператори – използват се за извършване на операции върху двоичното представяне на числови данни.

• Оператори за преобразуване на типовете – позволяват преобразу¬ването на данни от един тип в друг.
Категории оператори
аритметични -, +, *, /, %, ++, --
логически логически &&, ||, !, ^
побитови &, |, ^, ~, <<, >>
за сравнение ==, !=, >, <, >=, <=
за присвояване =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
съединяване на символни низове +
за работа с типове (type), as, is, typeof, sizeof
други ., new, (), [], ?:, ?? ., new, (), [], ?:, ??

1) Аритметични оператори. Аритметичните оператори в C# +, -, * са същите като в математика. Те извършват съответно събиране, изваждане и умножение върху числови стойности и резултатът е отново целочислена стойност.

Операторът за деление / има различно действие върху цели и реални числа. Когато се извършва деление на целочислен с целочислен тип (например int, long, sbyte, …), върнатият резултат е отново целочислен (без закръгляне, с отрязване на дробната част). Такова деление се нарича целочислено. Например при целочислено деление 7 / 3 = 2. Целочислено деление на 0 не е позволено и при опит да бъде извършено, се получава грешка по време на изпълнение на програ-мата DivideByZeroException. Остатъкът от целочислено делене на цели числа може да се получи чрез оператора %. Например 7 % 3 = 1, а -10 % 2 = 0.

При деление на две реални числа или на две числа, от които едното е реално, се извършва реално делене (не целочислено) и резултатът е реално число с цяла и дробна част. Например 5.0 / 2 = 2.5. При делене на реални числа е позволено да се дели на 0.0 и резултатът е съответно +∞, -∞ или NaN.

Операторът за увеличаване с единица (increment) ++ добавя единица към стойността на променливата, а съответнооператорът -- (decrement) изважда единица от стойността. Когато използваме операторите ++ и -- като префикс (поставяме ги непосредствено преди променливата), първо се пресмята новата стой¬ност, а после се връща резултата, докато при използването на операто¬рите като постфикс (поста¬вяме оператора непосредствено след променли¬вата) първо се връща ори¬гиналната стойност на операнда, а после се добавя или изважда единица към нея.

2) Логически оператори Логическите оператори приемат булеви стойности и връщат булев резултат (true или false). Основните булеви оператори са "И" (&&), "ИЛИ" (||), изключващо "ИЛИ" (^) и логическо отрицание (!).

Следва таблица с логическите оператори в C# и операциите, които те извършват: x y !x x && y x || y x ^ y true true false true true false true false false false true true false true true false true true false false true false false false

От таблицата, както и от следващия пример става ясно, че логическото "И" (&&) връща истина, само тогава, когато и двете променливи съдържат истина. Логическото "ИЛИ" (||) връща истина, когато поне един от операндите е истина. Операторът за логическо отрицание (!) сменя стойността на аргумента. Например, ако операндът е имала стойност trueи приложим оператор за отрицание, новата стойност ще бъде false. Операторът за отрицание е едноаргументен и се слага пред аргумента. Изключващото "ИЛИ" (^) връща резултат true, когато само един от двата операнда има стойностtrue. Ако двата операнда имат различни стойности изключващото "ИЛИ" ще върне резултат true, ако имат еднакви стойности ще върне false.

3) Оператор за съединяване на низове Операторът + се използва за съединяване на символни низове (string). Той слепва два или повече низа и връща резултата като нов низ. Ако поне един от аргументите в израза е от тип string, и има други операнди, които не са от тип string, то те автоматично ще бъдат преобразувани към тип string.

Конкатенацията (слепването на два низа) на стрингове е бавна операция и трябва да се използва внимателно. Препоръчва се използването на класа StringBuilder при нужда от итеративни (повтарящи се) операции върху сим¬волни низове. Операторите за сравнение в C# се използват за сравняване на два или повече операнди. C# поддържа следните оператори за сравнение:

• по-голямо (>)

• по-малко (<)

• по-голямо или равно (>=)

• по-малко или равно (<=)

• равенство (==)

• различие (!=)

Всички оператори за сравнение в C# са двуаргументни (приемат два операнда), а върнатият от тях резултат е булев (true или false). Операторите за сравнение имат по-малък приоритет от аритметичните, но са с по-голям приоритет от операторите за присвояване на стойност.

4) Оператори за сравнение Операторите за сравнение в C# се използват за сравняване на два или повече операнди. C# поддържа следните оператори за сравнение:

• по-голямо (>)

• по-малко (<)

• по-голямо или равно (>=)

• по-малко или равно (<=)

• равенство (==)

• различие (!=)

Всички оператори за сравнение в C# са двуаргументни (приемат два операнда), а върнатият от тях резултат е булев (true или false). Операторите за сравнение имат по-малък приоритет от аритметичните, но са с по-голям приоритет от операторите за присвояване на стойност.

5) Оператори за присвояване Операторът за присвояване на стойност на променливите е "=" (символът равно). Синтаксисът, който се използва за присвояване на стойности, е следният: операнд1 = литерал, израз или операнд2; Операторът за присвояване в C# е "=", докато операто¬рът за сравнение е "==".Размяната на двата оператора е честа причина за грешки при писането на код. Внимавайте да не объркате оператора за сравнение с оператора за присво¬яване, тъй като те много си приличат.

6) Изрази Голяма част от работата на една програма е пресмятането на изрази. Изразите представляват поредици от оператори, литерали и променливи, които се изчисляват до определена стойност от някакъв тип (число, сим¬волен низ, обект или друг тип). Ето няколко примера за изрази: int r = (150-20) / 2 + 5;

// Expression for calculation of the surface of the circle double surface = Math.PI * r * r;

// Expression for calculation of the perimeter of the circle double perimeter = 2 * Math.PI * r;

Console.WriteLine(r);

Console.WriteLine(surface);

Console.WriteLine(perimeter);

В примера са дефинирани три израза. Първият израз пресмята радиуса на дадена окръжност. Вторият пресмята площта на окръжността, а послед¬ният намира периметърът й. Ето какъв е резултатът е изпълнения на горния програмен фрагмент:

70

15393,80400259

439,822971502571

Изчисляването на израз може да има и странични действия, защото изразът може да съдържа вградени оператори за присвояване, увелича¬ване или намаляване на стойност (increment, decrement) и извикване на методи.