http://torus.uck.pk.edu.pl/~fialko Operatory, wyrażenia, instrukcja przypisania Operatory arytmetyczne * / + - % operator zmiany znaku operatory mnożenia, dzielenia, dzielenia modulo operatory dodawania, odejmowania Każdy operator ma ustalony priorytet wykonania Operator jest lewostronnie (prawostronnie) łączny, jeżeli w wyrażeniu zawierającym dwa takie operatory najpierw jest wykonany operator lewy obliczenie wyrażenia w kolejności od lewej do prawej (prawy obliczenie wyrażenia w kolejności od prawej do lewej).
http://torus.uck.pk.edu.pl/~fialko Operatory, wyrażenia, instrukcja przypisania Zmiana kolejności obliczenia wyrażenia wprowadzenie nawiasów okrągłych. Operator ( - ) jest jednoargumentowym, inne arytmetyczne operatory mają dwa argumenty.
Priorytety i łączność operatorów Priorytet największy Operator Łączność () []. -> Pierwotne - ~! Unarne Prawostronne ++ - - sizeof() Unarne (<typ>) Unarne Multiplikatywne Addytywne Przesunięcie bitowe < > <= >= Relacji == Relacji & Bitowa koniunkcja ^ Bitowa różnica symetryczna Bitowa alternatywa && Koniunkcja Alternatywa? : Operacje warunkowa Prawostronne Przypisanie Prawostronne Sekwencyjne obliczenie * / + - << Priorytet najmniejszy Nazwa * & % >>!= = += -= *= /=,
Stałe liczba, znak (symbol) lub ciąg (tablice) znaków. Stałe mogą być całkowite, zmienno-przyczynkowe, znakowe i tablicy znakowe. Przykład: całkowite dziesiętne 2-4 6 całkowite ósemkowe 012 036 0777 calkowite szesnastkowe: 0x120AF 0x000000 0xFFFFFFF zmienno-przyczynkowe 3.48 2.0e-06-1.23e+5 znakowe a b c ciąg znaków slowo C:\\My_Folder\\my_plik.exe
Wyrażenie ciąg znaków, operatorów (instrukcji), zmiennych, stałych zadaje sposób obliczenia wartości. Wyrażenie przypisania (podstawienia): Zmienna = wyrażenie double a, b, c;.. c = a+b; Proszę nie mieszać z relacją równoważności z matematyki: Na przykład: double a, b; a = 1.25; b = 0.25; a = a+b; //po tej instrukcji a przyjmuje wartość 1.5. Najpierw będzie //obliczone a+b, dalej wykonane przypisanie a = a+b
W wielu językach programowania specjalnie pozostał wprowadzony symbol =: //przypisać. W języku C po prostu trzeba przyzwyczaić się do tego, że operator przypisania po kształcie jest podobny do relacji równoważności, przecież oznacza inne. Operator przypisania prawostronnie łączny: xx = yy = a+b; Oznacza to, że najpierw będzie obliczona wartość a+b, dalej jest wykonane przypisanie yy = wartość(a+b) i tylko w końcu xx = yy. Każda instrukcja w C mysi być zakończona średnikiem ;
Modyfikator const. Wzbrania zmieniać znaczenie zmiennej. Jest zastosowany dla tego, żeby zabezpieczyć od zmiany to znaczenie w okresie czasu życia zmiennej. const double PI = 3.141593; const int64 max_file_len = 9 223 372 036 854 775 807; PI = 5.26; //błąd kompilacji Przy próbie zmiany wartości zmiennej, zabezpieczonej takim modyfikatorem, występuje błąd kompilacji.
Biblioteka matematyczna: #include <math.h> Nazwa, typ funkcji, typ argumentu funkcja double exp(double x) expotencjalna double log(double x) logarytm naturalny double log10(double x) logarytm dziesiętny double pow(double x,double y) x do potęgi y double sqrt(double x) pierwiastek stopnia drugiego double fabs(double x) moduł double sin(double x) sinus double cos(double x) cosinus double tan(double x) tangens double asin(double x) arcus sinus double acos(double x) arcus cosinus double atan(double x) arcus tangens int abs(int i) moduł
Przykład W3: obliczyć wartości wyrażeń arytmetycznych: a+b-c, c ac, b a, bc æ a+b+c 2 ö lnçç + a + sin a + cos b 2 è ø 1 + a2 ælö int ç, èkø l, l mod k k
Konwersja typów. Domyślna konwersja typów zmiennych jest wykonywana przez kompilator automatycznie na tej zasadzie, że w arytmetycznym wyrażeniu, zawierającym zmienne różnych typów, zmienne typów z mniejszą precyzją będą konwertowane do typów z większą precyzją. Na przykład: short is = 10; long la=20, lb; lb = is + la; //is: short à long; long tmp = is + la; lb = tmp; float ff = 3.14; double da = 6.28, db; int ic = 25; db = ff + ic + da; //ic: int à float; float tmp1 = ff + ic; //double tmp1 ß floar tmp1; double tmp2 = tmp1 + da; db = tmp2;
Konwersja typów. Następujące konwersje typów doprowadzają do zgubienia precyzji: int i; double a = 3.14, b = 6.3; i = a + b; //i dostanie wartość 9, ułamek będzie odrzucony, //kompilator w tym miejscu zgłosi ostrzeżenie. A to jawna konwersja typów: i = (int)(a + b); //tu kompilator nic nie zgłosi. Przy jawnej konwersji typów programista sam podejmuje decyzje. Istnieją przypadki, kiedy konwersja typów może być tylko jawną. Przy użyciu różnych typów w wyrażeniu arytmetycznym trzeba być bardzo ostrożnym, ponieważ są przypadki, kiedy dla jednych danych my dostajemy wynik poprawny, jednak dla innych już nie. Przykład: Konversja_typow
Instrukcja warunkowa if ( wyrażenie ) instrukcja 1 [else instrukcja 2] Jeśli wyrażenie!= 0, będzie wykonana instrukcja 1. Jeśli wyrażenie == 0, to: else jest obecne będzie wykonana instrukcja 2. else pominięte pierwsza linia kodu za instrukcją 1 wyrażenie arytmetyczne wyrażenie albo wskaźnik
Operatory relacji: < <= >= ==!= > większy priorytet Wyrażenie relacyjne: mniejszy priorytet wyrazenie_1 operator_relacji wyrazenie_2 Wynik wyrażenia relacyjnego (typ int) 1 (TRUE relacja jest prawdziwa), lub 0 (FALSE relacja jest fałszywą). Typy operandów: zmienne całe, zmienno- przyczynkowe lub wskaźniki. Typy mogą być różnymi przekształcenie domyślne do typu jednego. (Patrz MSDN - Standard Conversions)
Operatory logiczne: (w kolejności malującego priorytetu)! Negacja && koniunkcja (i, iloczyn logiczny) alternatywa (lub, suma logiczna) Typy operandów: zmienne całe, zmienno-przyczynkowe lub wskaźniki. Wyrażenia logiczne!wyrażenie wyrazenie_1 && wyrazenie_2 wyrazenie_1 wyrazenie_2 Wynik wyrażenia logicznego to jest zmienna typu int. Przyjmuje wartość 1 (TRUE), jeśli zdanie logiczne jest prawdziwe, lub 0 (FALSE) w przeciwnym wypadku.
Przykłady: x Î [a, b] if(x<y && y<z) printf( x mniej od z\n ); if(x >= a && x <= b) printf( x nalezy przedzialowi [a,b] );.. If(x == y x == z) printf( x = y lub x = z ); x 2 + y2 < r2 if(x*x+y*y < r*r) printf( punkt (x,y) leży w kole prom. r );
Przykład 1 if ( i > 0 ) y = x / i; else { x = i; y = f( x ); } if ( i > 0 ) /* Without braces */ if ( j > i ) x = j; else x = i;. //Przy i <= 0 zmiennej x nic nie //będzie przypisane if ( i > 0 ) { /* With braces */ if ( j > i ) x = j; } else x = i;. // Przy i <= 0 zmiennej x // //będzie przypisane //znaczenie zmiennej i
Przykład 2 double *A = NULL; A = (double *)malloc(2500*sizeof(double)); if(!a) { printf( Memory allocation error\n ); exit(1); }.
Przykład 3 int main() { int x = 0; if ( 1 ) { if (!x ) //x = 0 jest FALSE, więc!x jest TRUE printf("!x\n"); else printf("x\n"); } } Wydruk:!x
Przykład 4 if(z <= 0) l = 2; l = 3; // l = 3 nie zależnie od wartości z. l = 3; if(z <= 0) l = 2; // l = 3 dla z > 0, l = 2 dla z <= 0.. If(z <= 0) l = 2; else l = 3; // l = 3 dla z > 0, l = 2 dla z <= 0
Błąd typowy: If(x = a) //to jest przypisanie, które zmienia wartość zmiennej x { //ten blok będzie wykonany, jeśli a!= 0, i nigdy nie będzie wykonany, jeśli a == 0.. } If(x == a) //to wyrażenie relacyjne. Zmienna x nie zmienia wartości. { }
Przykład 4: Algorytm rozwiązania równania kwadratowego a x2 + b x + c = 0
void exit( int status ); Zakończenie roboty procesu, poprawne zamykanie wszystkich buforów i plików (flushing) status = 0 zakończenie normalne; = 1 (2, 3, ) - awaryjne. Przykład W4
Często są używana taka konstrukcja ( Przełącznik ) If(wyrażenie_1) {..fragment kodu 1 } else if(wyrażenie_2) {..fragment kodu 2 } else if(wyrażenie_3) {..fragment kodu 3 } i tak n razy [ else { fragment kodu n+1 } ]
Przełącznik schemat blokowy
Przykład: int key = 0; int res = -1;. if(key == 0) res = 0; else if(key == 1) res = 1; else if(key == 2) res = 2; else res = 3;