140 likes | 357 Views
Informatyka I Wykład 5. Priorytety i kolejność obliczeń Operator podstawiania Operatory arytmetyczne Relacje i operatory logiczne. OPERATORY. PRIORYTETY I KOLEJNOŚĆ OBLICZEŃ. Operatory wymienione w jednym wierszu mają ten sam priorytet.
E N D
Informatyka IWykład 5 • Priorytety i kolejność obliczeń • Operator podstawiania • Operatory arytmetyczne • Relacje i operatory logiczne OPERATORY Jerzy Kotowski
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
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
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
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 Þ 12Arytmetyka!!! • Operator dzielenia modulo:17 % 3 Þ 2 • Oba operandy muszą być typu całkowitego. • Pytanie:jakie wartości ma wyrażeniex%2i kiedy? Jerzy Kotowski
OPERATORY LOGICZNEZmienne logiczne • Język C nie ma zmiennych logicznych. • Konwencja: 0 (ZERO) º FAŁSZ¹0 (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
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
Relacje i operatory przyrównaniaSeria (przykładów) • Wszystkie obiekty w przykładach są typuint • x = 2 < 3; • x = 1bo 2 jest mniejsze od 3. • x = 2 == 3; • x = 0bo 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 zmiennaxma wartość2. Jerzy Kotowski
Relacje i operatory przyrównaniaDrugaseria (przykładów) • Wszystkie obiekty w przykładach są dalej typuint • 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 konstrukcjiifjest teraz operator podstawiania. Efektem tej konstrukcji jest podstawieniex = 2i zwrócenie podstawianej wartości (czyli prawdy). Jerzy Kotowski
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
Znowu przykłady • z = f(x) && g(y); • Jeżelif(x)zwróci0to gnie 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 xbo2 < 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
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); Jerzy Kotowski