ОПЕРАТОРИ ВО C#

 

Доделување на вредност (=)

Една променлива може, во различни временски периоди, да се користи за чување на различни вредности. Во C++, вредности на променливите им се доделуваат со примена на операторот '='. На пример, со изразот "prom=1000;" и се доделува вредност 1000 на променливата prom. Запаметете, во C++, доделувањето на вредности се извршува од десно на лево (вредноста која се наоѓа од десна страна на операторот '=' и се доделува на променливата која се наоѓа од лева страна на операторот). Обратното не важи - вредноста на променливата која се наоѓа од левата страна на операторот не влијание, на никаков начин, на вредноста на изразот кој се наоѓа од десната страна на операторот. На пример, со изразот "a=b;" на променливата a и ја доделуваме вредноста која до тој момент се наоѓала во променливата b. Променливата b си ја задржува својата вредност.

Многу важно е да забележиме дека со операторот '=' се врши доделување на вредност, а не поврзување на изразите кои се наоѓаат од двете страни на операторот. На пример, по извршување на операцијата за доделување на вредност "a=b;", променливите a и b, на ниту еден начин, не се поврзани една со друга. Евентуалната промена на вредноста на променливата b подолу во програмата нема да предизвика и промена на вредноста на променливата a:

Пример 1
 
 
#include <iostream>
using namespace std;
 
int main()
{
int a, b, c;
a = 100; //a=100 b=* c=*
b = 50; //a=100 b=50 c=*
c = 20; //a=100 b=50 c=20
a = b; //a=50 b=50 c=20
b = 30; //a=50 b=30 c=20
c = b; //a=50 b=30 c=30
a = b+c; //a=60 b=30 c=30
cout << "a=" << a << endl; //pechati 'a=60'
cout << "b=" << b << endl; //pechati 'b=30'
cout << "c=" << c << endl; //pechati 'c=30'
return 0;
}

Едно интересно својство на операторот за доделување на вредност '=' е што неговото извршување резултира со враќање на вредноста која се наоѓа од десната страна на изразот. На пример, по извршување на наредбата "a=b=c=10;" сите три променливи (a, b и c) ќе ја содржат вредноста 10 (c=10 враќа резултат 10; потоа b=c=10 враќа резултат 10). Ова својство може да се искористи и во многу посложени пресметки. На пример, наредбата "a=b+(c=10+5);" е еквивалентна (има ист ефект) со извршувањето на двете наредби "c=10+5;" и "a=b+c;" - наведени последователно. По извршување на наредбата "a=3+(c=10+5);", променливата c ќе содржи вредност 15 (c=10+5), додека a ќе содржи вредност 18 (a=3+15).

Пример 2
 
 
#include <iostream>
using namespace std;
 
int main()
{
int a, b, c;
a = b = c = 10; //a=10 b=10 c=10
a = a+5; //a=15 b=10 c=10
c = b + (a=10); //a=10 b=10 c=20
a = b = c = 0; //a=0 b=0 c=0
a = b = c+5; //a=5 b=5 c=0
a = b = (c=10); //a=10 b=10 c=10
cout << (a+b+c) << endl; //pechati '30'
return 0;
}

Аритметички оператори

Аритметичките оператори се користат за изведување на математичките операции.

Oператор

 

Пример

+

Собирање

 

x + y

-

Одземање

 

x - y

*

Множење

 

x * y

/

Делење

 

x / y

%

Остаток при делење

 

x % y

++

Инкремент

Зголемување на вредноста на променливата за 1

x ++
++x

- -

Декремент

Намалување на вредноста на променливата за 1

x --
--
x

Скратување на изрази (+=, -=, *=, /=, %=, ++, --)

Многу често, се појавува потреба од промена на вредноста на една променлива преку вршење на математичка операција врз истата таа променлива (a=a+5). C++ подржува 5 оператори (по еден оператор за секоја аритметичка операција) кои овозможуваат скратено пишување на горенаведениот тип на операции. На пример, наместо да пишуваме "а=а+5;" сега можеме да напишеме "a+=5;", наместо "a=a*5;" може да напишеме "a*=5;", наместо "a=a/b;" може да напишеме "a/=b;", итн. Следнава табела ги содржи сите потребни информации за овие оператори:

операција израз еквивалентно со
додади b на а a+=b; a = a+b;
одземи b од a a-=b; a = a-b;
помножи го a со b a*=b; a = a*b;
подели го a со b a/=b; a = a/b;
смести го остатокот од a/b во a a%=b; a = a%b;

Зголемувањето на вредност за 1 и намалувањето на вредност за 1 се, исто така, операции кои се извршуваат многу често. И овие операции, во C++, си имаат свој оператор преку кои се дефинирани (++ и --, соодветно). Всушност, постојат две верзии (prefix и postfix) за секој од овие два оператори (++ и --) - зависно од тоа дали операторот се наоѓа пред променливата (++x) или по променливата (x++):

операција израз значење
зголемување на вредност за 1 - postfix верзија x++ врати ја вредноста која се содржи во променливата x, па зголеми го x за 1
зголемување на вредност за 1 - prefix верзија ++x зголеми го x за 1, па врати ја вредноста која се содржи во променливата x
намалување на вредност за 1 - postfix верзија x-- врати ја вредноста која се содржи во променливата x, па намали го x за 1
намалување на вредност за 1 - prefix верзија --x намали го x за 1, па врати ја вредноста која се содржи во променливата x

За едноставни изрази како "x++;" двете верзии (prefix и postfix) ќе резултираат со зголемување/намалување (за 1) на вредноста која се чува во променливата x. Разликата се забележува во случаи кога резултатот од изразот се користи во некоја поголема наредба (како "y=x++;" и "y=++x;"). Во овој случај, двете верзии на операторите се однесуваат на различен начин: prefix верзијата ("y=++x;") прво ја зголемува вредноста на променливата (во случајов x) па го предава резултатот (зголемената вредност), додека postfix верзијата ("y=x++;") создава копија од вредноста на променливата x, ја предава привремената вредност, па дури потоа ја зголемува вредноста на x. На пример, доколку x=5 и ја извршиме наредбата "y=++x;", по извршување на наредбата вредноста на x ќе биде 6 и вредноста на y ќе биде 6 - прво се зголемува x, па потоа се испраќа нејзината "зголемена" вредност. Од друга страна, доколку x=5 и ја извршиме наредбата "y=x++;", вредноста на x ќе биде 6, но вредноста на y ќе биде 5 - најпрвин се прави привремена копија од вредноста на x и таа вредност се доделува на y, па дури потоа се зголемува x. Следнава програма го демонстрира ефектот на неколку оператори споменати во овој дел:

Пример 3
 
 
#include <iostream>
using namespace std;
 
int main()
{
int a=10, b=15, c=20; //a=10 b=15 c=20
a+=b; //a=25 b=15 c=20
a+=b; //a=40 b=15 c=20
a+=b; //a=55 b=15 c=20
a-=c; //a=35 b=15 c=20
b*=c; //a=35 b=300 c=20
a+=(b+c); //a=355 b=300 c=20
b+=b; //a=355 b=600 c=20
c++; //a=355 b=600 c=21
c--; //a=355 b=600 c=20
a = c++; //a=20 b=600 c=21
a = c--; //a=21 b=600 c=20
a = ++c; //a=21 b=600 c=21
cout << a << " " << b << " " << c << endl; //pechati '21 600 21'
//pred izvrshuvanje a=21 b=600 c=21
cout << a++ << " " << b-- << " " << c++ << endl; //pechati '21 600 21'
//po izvrshuvanje a=22 b=599 c=22
//pred izvrshuvanje a=22 b=599 c=22
cout << ++a << " " << --b << " " << ++c << endl; //pechati '23 598 23'
//po izvrshuvanje a=23 b=598 c=23
return 0;
}

Споредбени (релациони) оператори

Споредбените оператори се користат за споредба на две вредности.

 

Оператор

 

Пример

= =

Еднакво

x == y

!=

Различно

x != y

> 

Поголемо

x > y

< 

Помало

x < y

>=

Поголемо еднакво

x >= y

<=

Помало еднакво

x <= y

 


Забелешка: Резултатот на споредбените искази е  true (вистина – 1)  или false (лага  - 0).
Во следниот пример е искористен операторот поголемо (
>) за да најде дека 5 е поголемо од 3:

int x = 5;
int y = 3;
cout << (x > y);
// враќа 1 (true) зошто 5 е поголемо од  3

 

Логички оператори

Operator

Пример

&&

Логичко and / и

Дава резултат вистина ако двата искази се вистина

x < 5 &&  x < 10

||

Логичко or / или

Дава резултат вистина ако еден од исказите е вистина

x < 5 || x < 4

!

Логичко not / не

Негација, дава false ако е true и обратно

!(x < 5 && x < 10)


 Во нашиот пример, ќе дефинираме 2 целобројни променливи и една Булова променлива. Потоа ќе ги извршиме следните операции



Објаснување на кодот:

1. Дефинирани се две целобројни променливи, едната е val1, а другата е val2. Овие ќе се користат за прикажување релациони и аритметички операции. Булова променлива е дефинирана за да прикаже логички операции.
2. Прикажан е пример за аритметичка операција каде што операторот за собирање се изведува на val1 и val2. Резултатот е запишан на конзолата.
3. Прикажан е пример за релациона операција каде што се испитува дали val1 променливата е помала од променливата  val2. Резултатот е запишан на конзолата.
4. Прикажан е пример за логичка операција, при што логичкиот оператор (!) Се применува на променливата status.  Значи, ако Буловата вредност е „вистинска“, логичкото НЕ ќе ја врати вредноста „неточно“ и обратно. Во нашиот случај, бидејќи вредноста на променливата на статусот е „true“, резултатот ќе покаже „false“. Резултатот ќе биде покажан на конзолата.

Ако горниот код е правилно внесен и програмата е успешно извршена, излезот ќе се прикаже.
Излез:

C# - Bitwise Operators

Bitwise  oператорите поддржани од C# се наведени во следната табела. Да претпоставиме дека променливата А

 има вредност 60 (0011 1100) и променливата Б има вредност13 (0000 1101),
 

Оператор Опис Пример
& Бинарен AND оператор ако двата соодветни бита од двата броја се 1, дава 1 во спротивно дава 0. (A & B) = 12, резултат 0000 1100
| Бинарен OR оператор ако еден од двата соодветни бита на двата броја е 1, дава 1 во спротивно дава 0. (A | B) = 61, резултат 0011 1101
^ Бинарен XOR оператор дава 1 ако соодветните битови на двата броја се различни дава 1, ако се исти дава 0. (A ^ B) = 49, резултат 0011 0001
~ Бинарен прв комплемент оператор е унарен и има ефект на  'flipping' битови. (~A ) = -61, резултат 1100 0011 во 2's комплемент бидејќи е  Бинарен број со знак.
<< Бинарен Left Shift оператор. Вредноста на левиот операнд е поместена  на лево  за онолку битови колку е дефинирано во десниот операнд. A << 2 = 240, резултат 1111 0000
>> Бинарен Right Shift оператор. Вредноста на левиот операнд е поместена  на десно за онолку битови колку е  дефинирано во десниот операнд. A >> 2 = 15, резултат 0000 1111

 


Следниот пример ги прикажува сите бит -оператори достапни во C#

using System;

namespace OperatorsAppl {

   class Program {
   
      static void Main(string[] args) {
         int a = 60;            /* 60 = 0011 1100 */ 
         int b = 13;            /* 13 = 0000 1101 */
         int c = 0; 
         
         c = a & b;             /* 12 = 0000 1100 */ 
         Console.WriteLine("Line 1 - Vrednosta na  c e {0}", c );
         
         c = a | b;             /* 61 = 0011 1101 */
         Console.WriteLine("Line 2 - Vrednosta na  c e {0}", c);
         
         c = a ^ b;             /* 49 = 0011 0001 */
         Console.WriteLine("Line 3 - Vrednosta na  c e {0}", c);
         
         c = ~a;                /*-61 = 1100 0011 */
         Console.WriteLine("Line 4 - Vrednosta na  c e {0}", c);
         
         c = a << 2;      /* 240 = 1111 0000 */
         Console.WriteLine("Line 5 - Vrednosta na  c e {0}", c);
         
         c = a >> 2;      /* 15 = 0000 1111 */
         Console.WriteLine("Line 6 - Vrednosta na  c e {0}", c);
         Console.ReadLine();
      }
   }
}

When the above code is compiled and executed, it produces the following result −

Linija  1 - Vrednosta na  c e 12
Linija  2 - Vrednosta na  c e 61
Linija  3 - Vrednosta na  c e 49
Linija  4 - Vrednosta na  c e -61
Linija  5 - Vrednosta na  c e 240
Linija  6 - Vrednosta na  c e 15