OperatoryCzęść NR.2Operatory są używane do operowania wartościami.

Można je pogrupować do pięciu typów operatorów: arytmetyczne, przypisania, porównania, logiczne i bitowe.

 

Witam w drugiej części cyklu, która ma uświadomić czytelnika, że składnia językowa pomiędzy Java, a C# nie wiele się różni. Jeśli dobrze znasz Jave lub C#, a nie znasz tego drugiego języka mam nadzieje, że ten wpis ciebie przekona, że ten skok potrzebny do nauki kolejnego języka programowania nie jest taki duży.

Arytmetyczne operatory

Są cztery podstawowe operatory arytmetyczne plus operator, który określa dzielenie modulo..

float x = 3+2; // 5 // dodawanie
x = 3-2; // 1 // odejmowanie
x = 3*2; // 6 // mnożenie
x = 3/2; // 1 // dzielenie
x = 3%2; // 1 // dzielenie modulo 

Zauważ też, że wyrażenie dzielenia daje zły rezultat. Dzieje się tak dlatego, że dzielenie wykonuje się na dwóch liczbach całkowitych. W wyniku czego mamy liczbę całkowitą.

Dzielnie liczb całkowitych

Dotyczy to C# i Javy. Jak rozwiązać ten problem?

x = 3.0f / 2.0f; // 1.5 // dzielenie

X jest typem float. Możemy więc obie liczby zamienić na typ float. Same znaki po przecinku nie wystarczą. Dopisując do liczby znak “f”. Bez niego informujemy kompilator , że operujemy na typach double.

image

Można też wykonać rzutowanie na całym wyrażeniu dzielenia.

x = (float)3 / 2;

Operatory przypisania

Operator przypisania składnia się z symbolu równa się “=”. Dzięki niemu przypisujemy wartość do danej zmiennej.

Operatory przypisania inkrementacji

Jednym z podstawowych użyć operatorów arytmetycznych jest zwiększenie obecnej wartości zmiennej o pewną wartość. Zamiast jednak pisać dłuższe  wyrażenie możemy skorzystać z tych operatorów.

Przykłady użycia nie obejmują nie tylko dodawania.

int y = 0;
y += 5; 
y = y+5;

y -= 5; 
y = y-5;

y *= 5; 
y = y*5;

y /= 5; 
y = y/5;

y %= 5;
y = y%5;

Operatory inkrementacji i dekrementacji

Istnieje jeszcze inne popularne operatory inkrementacji i dekrementacji. Zwiększają one lub zmniejszają one wartości o jeden.

Inkrementacja zwiększa wartość o jeden i operuje ona symbolem “++”.

Dekrementacja zmniejsza wartość o jeden i operuje ona symbolem “—“.

int z = 0;
z++;
z = z + 1;
z--;
z = z - 1;

Każdy  z tych operatorów może być użyty przed zmienną i po niej.

int z = 0;
z++; // post-increment
z--; // post-decrement
++z; // pre-increment
--z; // pre-decrement

Jaka jest różnica? Różnica polega na tym, że operator “post-increment” zwracają oryginalną wartość zmiennej, a dopiero później zwiększają ją o jeden.

Operatory “pre-increment” zwiększą wartość o jeden i ją zwrócą.

int a = 0;
int b = 0;
b = a++; // 0
System.out.println(b);
b = ++a; // 2
System.out.println(b);

Operatory porównania

Operatory porównania jak sama nazwa wskazuje porównują one wartości i zwracają one prawdę albo fałsz.

boolean c = (2 == 3); // false // equal to
System.out.println(c);
c = (2 != 3); // true // not equal to
System.out.println(c);
c = (2 > 3); // false // greater than
System.out.println(c);
c = (2 < 3); // true // less than
System.out.println(c);
c = (2 >= 3); // false // greater than or equal to
System.out.println(c);
c = (2 <= 3); // true // less than or equal to
System.out.println(c);

Używa się ich głównie w wyrażeniach “if”.

Znaki mniejsze, większe równe są dosyć intuicyjne. Tak samo symbole wyglądają w matematyce.

2 > 3

Dwa nie jest większe od trzech więc wyrażenie to zwraca fałsz.

Operatory identycznego porównania dwóch wartości składa się z dwóch znaków równa się. “==”.Jeżeli chcemy mieć odwrotność tego wyrażenia czyli sprawdzić czy obie wartości nie są równe używamy “!=”.

Logiczne operatory

Logiczne operatory używane są zazwyczaj z operatorami porównania. Wykonują one operację logiczne “i”, “lub”.

Operator “&&” sprawdza czy oba wyrażenia po lewej i po prawej są prawdziwe. Jeżeli tak jest to ten operator zwróci prawdę.

Operator “||” sprawdzi czy chociaż jedną z wyrażeń jest prawdziwe. Jeśli tak jest to ten operator zwróci prawdę.

Istnieje też operator logiczny symbolizujący zaprzeczenie obecnej wartości logicznej “!”.

Warto zaznaczyć, że dla operatora LUB czyli “||” stanie się następująca rzecz. Jeśli wyrażenie po lewej jest prawdziwe to wyrażenie po prawej nie zostanie sprawdzone gdyż nie ma takiej potrzeby.

Dla operatora “i” jest podobnie ale wyrażenie po lewej musi być fałszem. Wiemy wtedy z góry, że całe wyrażenie jest nieprawdziwe.

Jest to bardzo pomocne zwłaszcza jak się sprawdza czy zmienna ma przypisaną referencję i coś jeszcze.

boolean d = (true && false); // false // logical and
d = (true || false); // true // logical or
d = !(true); // false // logical not

Operatory bitowe

Operatory bitowe manipulują zawartością bitową wewnątrz liczby całkowitej.

Operator “&” sprawdza czy oba wyrażenia bitowe w odpowiednim miejscu mają “1”. Jeśli tak jest to wykonuje się operacja przypisania.

Można go nazwać operacją bitową “i” czyli “AND”.

Operator “|” zwróci “1” jeśli chociaż w jednym miejscu też występuje “1”.

Operacja XOR oznaczona symbolem “^” zwróci jeden jeśli jedynka jest tylko po jednej stronie bitowej.

Istnieją też operatory przesunięcia bitowego (>>) przesuwa on wszystkie znaki bitowe w prawą stronę.

Operator “>>>” też przesuwa znaki włączają w to znak bitowy określający czy wartość jest dodania czy ujemna.


int e = 5 & 4; // 101 & 100 = 100 (4) // and
e = 5 | 4; // 101 | 100 = 101 (5) // or
e = 5 ^ 4; // 101 ^ 100 = 001 (1) // xor
e = 4 << 1;// 100 << 1 =1000 (8) // left shift
e = 4 >> 1;// 100 >> 1 = 10 (2) // right shift
e = 4 >>>1;// 100 >>>1 = 10 (2) // zero-fill
// right shift
e = ~4; // ~00000100 = 11111011 (-5) // invert

Istnieje też operator “~”, który zamieni wyrażeniu bitowym wszystkie zera na jedynki i wszystkie jedynki na zera.

Podobnie jak do wyrażeń arytmetycznych istnieją też operatory skrótowe:

int f = 5;
f &= 5; // "and" and assign
f |= 5; // or and assign
f ^= 5; // xor and assign
f <<= 5; // left shift and assign
f >>= 5; // right shift and assign
f >>>= 5; // right shift and assign (move sign bit)

Warto zaznaczyć, że operatory bitowe są rzadko używane.

Kolejność operatorów

W C# i Javie wyrażenia są wykonywane z lewej do prawej. Jednakże gdy mamy do czynienia z wieloma operatorami równocześnie wtedy inny mechanizm wkracza do gry.

Kolejność wykonywania operacji jest następująca. Kolejność ta dotyczy C#, Javy, a nawet C++.

KolejnośćOperator
1++ −−! ~
2* / %
3+ −
4<< >> >>>
5< <= > >=
6== !=
7&
8^
9|
10&&
11||
12= (przypisanie = 10)

Dla czytelności kodu warto jednak używać nawiasów:

bool g = 11 + 22 > 3 * 10 && 10 / 5 == 1; // false
bool g2 = ((11 + 22) > (3 * 10)) && ((10 / 5) == 1); // false