Informatyka I Wykład 5
description
Transcript of Informatyka I Wykład 5
Jerzy Kotowski 1
Informatyka IWykład 5
OPERATORY
Priorytety i kolejność obliczeń Operator podstawiania Operatory arytmetyczne Relacje i operatory logiczne
Jerzy Kotowski 2
Lp. Operator Łączność15 ( ) [ ] -> . lewostronna14 ! ~ ++ -- - * & sizeof prawostronna13 * / % lewostronna12 + - lewostronna11 << >> lewostronna10 < <= > >= lewostronna9 == != lewostronna8 & lewostronna7 ^ lewostronna6 | lewostronna5 && lewostronna4 || lewostronna3 ?: prawostronna2 = += i t.p. prawostronna1 , lewostronna
Jerzy Kotowski 3
PRIORYTETY I KOLEJNOŚĆ OBLICZEŃ
Operatory wymienione w jednym wierszu mają ten sam priorytet.
Wiersze tabeli ustawione według malejącego priorytetu. Operator jest lewostronnie (prawostronnie) łączny, jeżeli
w wyrażeniu zawierającym co najmniej dwa takie ope-ratory na tym samym poziomie struktury nawiasowej najpierw jest wykonywany operator lewy (prawy).
W języku C nie określa się kolejności obliczania argu-mentów operatora ani kolejności wyznaczania argu-mentów funkcji. Przykłady: x=f()+g(); printf("%d %d\n",++n,power(2,n));
Jerzy Kotowski 4
PRIORYTETY I KOLEJNOŚĆ OBLICZEŃ c.d.
Efekty uboczne (slide effects): przy okazji obliczania wyrażenia pewna zmienna otrzymuje nową war-tość. Przykład: a[i] = i++; - wynik zależy od architektury komputera.
Wniosek: pisanie programów zależnych od archi-tektury komputera należy do złej praktyki programo-wania w każdym języku.
Nawiasy mają najwyższy priorytet, w związku z tym wymuszają kolejność wykonywania operacji.
Jerzy Kotowski 5
OPERATOR PODSTAWIANIA
Operator dwuargumentowy. Priorytet = 2. Lewy argument musi być lvalue. Lvalue jest
wyrażeniem, z którym wiąże się adres w pamięci komputera - to znaczy, że jak się chce coś pod-stawić, to trzeba wiedzieć gdzie. Przykładem lvalue jest nazwa zmiennej, bo wartość każdej zmiennej jest gdzieś zapamiętywana w pamięci.
Wartością działania (operatora) jest podstawiana wartość.
W języku C można napisać: x = y = z = 2; x = 2 + y = z + 3; BŁĄD!!! x = 2 + (y = z + 3); OK
Jerzy Kotowski 6
OPERATORY ARYTMETYCZNE Operatory jednoargumentowe (priorytet 14): + oraz - Przykłady: x = -y; x = +y; Operatory dwuargumentowe:
* / % (priorytet 13)+ - (priorytet 12)
Wnioski: a + b*c a + (b*c) PRIORYTET a / b / c (a / b) / c
ŁĄCZNOŚĆ 7 / 3 * 6 12 Arytmetyka!!! Operator dzielenia modulo: 17 % 3 2 Oba operandy muszą być typu całkowitego. Pytanie: jakie wartości ma wyrażenie x%2 i kiedy?
Jerzy Kotowski 7
OPERATORY LOGICZNEZmienne logiczne
Język C nie ma zmiennych logicznych. Konwencja:
0 (ZERO) FAŁSZ0 (różne od zera) PRAWDA
Przykłady: if(x) - jeżeli x jest różne od zera if(x%2) - jeżeli x jest nieparzyste ! - jednoargumentowy operator logicznej negacji if(!x) - jeżeli x jest równe zero x = !5; - do x podstawimy 0 (zero) x = !!7; - do x podstawimy 1 (jeden)
Jerzy Kotowski 8
OPERATORY LOGICZNERelacje
Operatory relacji – mniejszy: <– mniejszy równy: <=– większy: >– większy równy: >=
Operatory dwuargumentowe. Priorytet = 10. Operatory przyrównania
– równy: ==– różny: !=
Operatory dwuargumentowe. Priorytet = 9.
Jerzy Kotowski 9
Relacje i operatory przyrównaniaSeria (przykładów)
Wszystkie obiekty w przykładach są typu int x = 2 < 3;
x = 1 bo 2 jest mniejsze od 3. x = 2 == 3;
x = 0 bo zdanie “2 jest równe 3” jest fałszywe. x = 2 = 3;
Błąd kompilacji bo w wyrażeniu “2 = 3“ lewy argument nie jest lvalue.
if(x == 2) printf(“Ala ma kota.”); Historyjkę o Ali i jej kocie zobaczymy jeżeli
zmienna x ma wartość 2.
Jerzy Kotowski 10
Relacje i operatory przyrównaniaDruga seria (przykładów)
Wszystkie obiekty w przykładach są dalej typu int y = 2;
Szarzyzna ligowa. x == 2;
Ostrzeżenie kompilatora. Obliczamy wartość wyrażenia “x == 2“ i ją natychmiast odrzucamy.
if(x = 2) printf(“Ala ma kota.”); Historyjkę o Ali i jej kocie zawsze zobaczymy bo w
konstrukcji if jest teraz operator podstawiania. Efektem tej konstrukcji jest podstawienie x = 2 i zwrócenie podstawianej wartości (czyli prawdy).
Jerzy Kotowski 11
OPERATORY LOGICZNESpójniki logiczne
Koniunkcja logiczna, iloczyn logiczny: && Operator dwuargumentowy. Priorytet = 5. Definicja: a && b 1 iff a oraz b jest prawdą. Alternatywa logiczna, suma logiczna: || Operator dwuargumentowy. Priorytet = 4. Definicja: a || b 0 iff a oraz b jest fałszem. Są to jedyne operatory, dla których ANSI określa
kolejność wyznaczania operandów: wpierw LEWY!! Język C wykorzystuje tautologie:
0 && x 0 1 || x 1
Jerzy Kotowski 12
Znowu przykłady
z = f(x) && g(y); Jeżeli f(x) zwróci 0 to g nie zostanie wywołana.
if(x && a/x < 5)… Nigdy nie podzielimy przez zero.
if(2 < x < 5) printf(“Ala ma kota”); Zobaczymy historyjkę o Ali i jej kocie niezależnie
od wartości x bo 2 < x < 5 (2 < x) < 5 1 if(2 < x && x < 5) printf(“Ala ma kota”);
Tak będzie lepiej. Nawiasy nie są potrzebne!! x = !(a<3 && b>=5);
Prawa de Morgana mogą się przydać.
x = a>=3 || b<5;
Jerzy Kotowski 13
SERIA KOŃCZĄCA(zwalająca z nóg)
y = 2;z = 3;x = 2 + y == 1 + z; Jaka będzie wartość zmiennej x?
2 + y == 1 + z (2 + y) == (1 + z) 4 == 4 1 int x,y;
x = y % 4 == 0 && y % 100 !=0 || y % 400 == 0; Jest to definicja roku przestępnego: Rok y jest
przestępny jeżeli dzieli się przez 4 i nie dzieli się przez 100 - chyba, że dzieli się przez 400.x= alfa && beta || gamma;
x = !(y % 4) && (y % 100) || !(y % 400);