Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI
Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku programowania. Wyrażenia buduje się z elementów składowych: dane stałe zmienne operatory
Jeszcze o typach 3 Programista może definiować własne synonimy typów typedef unsigned char byte; typedef unsigned short int word; typedef unsigned long int counter_t; typedef int skalar; typedef skalar wektor[n]; Programista może definiować własne synonimy typów typedef <definicja typu> <identyfikator>;
Jeszcze o typach 4 Typy wyliczeniowe to lista nazwanych stałych całkowitych. enum nazw_typu { lista_wyliczenia } lista_zmiennych; Domyślną wartością pierwszego elementu jest zero. enum { falsz, prawda}; falsz otrzymał wartość 0, a element prawda wartość 1. enum {falsz, nic = 0, sukces, prawda =1}Domyślną falsz nic - wartość 0, sukces prawda wartość 1.
Operatory 5 Cztery główne typy operatorów: arytmetyczne relacyjne bitowe logiczne
6 Operatory
Operatory 7 = operator przypisania l-wartość = r-wartość; l-wartość - wyrażenia, które odwołują się do lokalizacji pamięci r-wartość - wyrażenia, które mają wartość
Operator przypisania 8 Wielokrotne przypisanie x = y = z = 0; Przypisanie złożone x = x + 10; x += 10; x -= 10; x /= 10;
Operatory arytmetyczne 9 - odejmowanie, jednoargumentowy minus + dodawanie * mnożenie / dzielenie % dzielenie modulo (reszta z dzielenia, nie stosujemy do danych typu float, double) ++ inkrementacja -- dekrementacja
Przekształcanie typów 10 Przekształcenia typów dzielimy na: przekształcenia jawne przekształcenia niejawne Najczęściej z przekształceniami typów mamy do czynienia podczas wykonywania operacji arytmetycznych oraz instrukcji przypisania.
Przekształcanie typów 11 suma = x + y ; Jeżeli zmienne x y są tego samego typu, np. typu int, wyrażenie x + y jest także typu int Jeżeli zmienna x zdefiniowano, jako typ short, a y jako int to sumowanie x+y jest wyrażeniem mieszanym. W takim przypadku wartość zmiennej x jest przekształcana do typu int
Przekształcanie typów 12 W operacjach arytmetycznych mamy do czynienia z przekształcaniem typów zgodnymi ze ściśle określonymi dla danego typu kompilatora regułami. Zmienna, której typ ma mniejszy rozmiar jest przekształcana do typu, który ma większy rozmiar promocją typu int < unsigned < long < unsigned long < float < double Typy char lub short automatycznie przetwarzane do typu int Każdy unsigned char lub unsigned short jest promowany do typu unsigned
Przekształcanie typów 13 char a1; unsigned a2; int a3; short a4; long a5; float a6; double a7; a1 a4 / a3 3 * a2 a3 3.0 * a2 a3 3 * a6 a3 a1 + 1 a1 + 1.0 3 * a4 * a5 int unsigned double float int double long int < unsigned < long < unsigned long < float < double Podczas wykonywania instrukcji z wyrażeniami zawierającymi zmienne mieszanych typów, wykonywane są niejawne konwersje.
Przekształcanie typów 14 int a3; double a7; a7 = a3; typ int ( a3) będzie przekształcony do typu double ( a7). promocja typu a3 = a7; degradacja typu Gdy typy zmiennoprzecinkowe są poddawane konwersji do typu całkowitego, tracona jest część ułamkowa, liczby są obcinane zawsze w kierunku zera 13.13 i 13.99 są zamieniane na 13, a liczba -13.5 jest zamieniana na -13
Przekształcanie typów 15 plik_1.c
16 Litera H zostaje zapisana w zmiennej znak, jako jedno-bajtowa wartość kodu ASCII. Litera H jest przekształcona do typu int i zmienna i otrzymuje wartość 72. Wartość 72 jest przekształcana do liczby typu float i otrzymuje wartość 72.00
17 mienna char H zostaje przekształcona na liczbę typ int (72) po dodaniu 1, mamy iczbę 73 ( int), która zostaje skrócona do 1 bajtu ( char) i zapisana do zmiennej znak ( I )
18 mienna char zostaje rozszerzona do 4-bajtowej liczby typu int (73). Wynik jest rozszerzony do artości typu float. Wynik 218.00f jest przetworzony do typu int
19 mienna char oraz zmienna int zostają rozszerzone do typu float.
20 róba przypisania zmiennej char zbyt dużej liczby skutkuje jej degradacją.
Operator rzutowania 21 (typ) operator rzutowania int var var = 1.13 + 13.13; Automatyczna (niejawna) konwersja : 1.13 + 1.13 = 14.14 wynik jest obcinany do 14 do zmiennej var zapisujemy 14 var_1 = (int)1.13 + (int)13.13; Sumowanie z wykorzystaniem operatora rzutowania : 1.13 i 13.13 są przekształcone do liczb całkowitych 1 i 13 do zmiennej var_1 zapisujemy 14
Operator rzutowania 22 (typ) operator rzutowania int var var = 1.13 + 13.93; Automatyczna (niejawna) konwersja : 1.13 + 1.13 = 15.06 wynik jest obcinany do 15 do zmiennej var zapisujemy 15 var_1 = (int)1.13 + (int)13.93; Sumowanie z wykorzystaniem operatora rzutowania : 1.13 i 13.93 są przekształcone do liczb całkowitych 1 i 13 do zmiennej var_1 zapisujemy 14
Operatory arytmetyczne 23 5 / 4 = 5 / -4 = -5 / 4 = -5 / -4 = 5 % 4 = 5 % -4 = -5 % 4 = -5 % -4 = a % b = a (a/b)*b
Operatory arytmetyczne 24 5 / 4 = 1 5 / -4 = -1-5 / 4 = -1-5 / -4 = 1 5 % 4 = 1 5 % -4 = 1-5 % 4 = -1-5 % -4 = -1
Operatory arytmetyczne 25 int x = 5/2; //wartość x wynosi 2. int x = 5.0/2.0; //wartość x wynosi 2. double y = 5/2; //wartość y wynosi 2.0. double y = 5.0/2; //wartość y wynosi 2.5. double y = 5/(double)2; //wartość y wynosi 2.5.
Operatory arytmetyczne 26 Priorytety operatorów arytmetycznych: ++, -- - (jednoargumentowy) *, /, % +, - Operatory są lewostronnie łączne. Kolejność wykonywania obliczeń dla operatorów łącznych oraz przemiennych (*,+) nie jest określona. Zmienne tymczasowe lub nawiasy zapewniają wymaganą kolejność obliczeń.
Operatory arytmetyczne 27 ++ Inkrementacja i dekrementacja x = 10; y = x++; //y ma wartość 10 x = 10; y = ++x; //y ma wartość 11 Efekt uboczny w obydwu przypadkach wartość zmiennej x wynosi 11. Nie należy stosować wielokrotnie operatorów inkrementacji dla tego samego operandu w jednym wyrażeniu np. a= a++; c=++a + a; Kompilator gcc potrafi ostrzegać przed takimi błędami: -Wsequence-point -Wall.
Operatory relacyjne i logiczne 28 prawda - wartości różne od zera: 12, -12, -123123.123123, 12e-2, znak inny niż znak końca łańcucha, adres niezerowy,... fałsz - zero: 0, znak końca łańcucha '\0', adres zerowy. Wyrażenia korzystające z operatorów relacyjnych lub logicznych dają w wyniku 0 lub 1. Operatory relacyjne : > większe niż, >= większe niż lub równe, < mniejsze niż, <= mniejsze niż lub równe, == równe,!= różne
Operatory relacyjne i logiczne 29 Operatory logiczne jak i relacyjne mają niższy priorytet niż operatory arytmetyczne. Priorytety operatorów relacyjnych oraz logicznych! > >= < <= ==!= &&!0 && 0 0 //wartość wyrażenia 0!(0 && 0) 0 //wartość wyrażenia 1 int x = 100; printf(''%d'', x>10); printf(''%d'',!!10);
Operatory relacyjne i logiczne 30 Operatory logiczne jak i relacyjne mają niższy priorytet niż operatory arytmetyczne. Priorytety operatorów relacyjnych oraz logicznych! > >= < <= ==!= &&!0 && 0 0 //wartość wyrażenia 0!(0 && 0) 0 //wartość wyrażenia 1 int x = 100; printf(''%d'', x>10); printf(''%d'',!!10);
Operatory relacyjne i logiczne 31 Operatory logiczne jak i relacyjne mają niższy priorytet niż operatory arytmetyczne. Priorytety operatorów relacyjnych oraz logicznych! > >= < <= ==!= &&!0 && 0 0 //wartość wyrażenia 0!(0 && 0) 0 //wartość wyrażenia 1 int x = 100; printf(''%d'', x>10); printf(''%d'',!!10);
Operatory relacyjne i logiczne 32 W obliczaniu wartości wyrażenia logicznego wykonywana jest najmniejsza liczba operacji koniecznych do określenia jego wartości X && y++; int x, y, z; x = 1; y = 1; z = x && y++; printf ("y=%d, z=%d\n" y,z); int x, y, z; x = 0; y = 1; z = x && y++; printf ("y=%d, z=%d\n" y,z);
Operatory bitowe 33 Operacje na bitach to sprawdzanie wartości, ustawianie, przesuwanie bitów w bajtach lub słowach, które odpowiadają typom char oraz int oraz pochodnym. & operator koniunkcji operator alternatywy ^ operator alternatywy wykluczającej (XOR) ~ operator negacji (uzupełnienie jedynkowe) >> przesunięcie bitowe w prawo << przesunięcie bitowe w lewo
Operatory bitowe 34 Operatory &,, ~ działają tak samo jak ich logiczne odpowiedniki, ale operują na poszczególnych bitach. Operator przesuwania bitów << przesuwa bity zmiennej w lewo, zwolnione miejsca wypełniane są zerami: int x = 7; 00000111 x = x<<1 00001110 7*2=14 x = x<<3 01110000 14*2 3 =112 x = x<<33????????
Operatory bitowe 35 Zależnie od kompilatora przesunięcie bitowe >> może być logiczne lub arytmetyczne. dla przesunięcia logicznego - bit najmłodszy jest tracony, zaś na najstarszy bit dopisywane jest zero; dla przesunięcia arytmetycznego - bit najmłodszy jest tracony, a bit najstarszy staje się kopią tego, który został przed chwilą z tego miejsca przesunięty a = 10010010 a >> 1 == 01001001 // w prawo dla logicznego a >> 2 == 00100100 // w prawo dla logicznego a = 10010010 a >> 1 == 11001001 // w prawo dla arytmetycznego a >> 2 == 11100100 // w prawo dla arytmetycznego
Operatory bitowe 36 00000110 11111001
37 Operatory bitowe
38 Operatory bitowe
39 Operatory bitowe
Operatory wskaźnikowe 40 Operatory wskaźnikowe & oraz * Wskaźnik to adres obiektu w pamięci. Zmienna wskaźnikowa to zmienna przechowująca wskaźnik do obiektu o określonym typie. & jednoargumentowy operator pobrania adresu zmiennej, adres_licz = &licz; * jednoargumentowy operator zwracający wartość przechowywana pod adresem reprezentowanym przez zmienną nowy_licz = *adres_licz + 10;
Operator warunkowy 41 Trójargumentowy operator? wyr1? wyr2: wyr3; Działanie: obliczane jest wyr1, if wyr1 == 1 obliczane jest wyr2 i jego wartość staje się wartością całego wyrażenia. if wyr1 == 0 obliczane jest wyr3 i jego wartość staje się wartością całego wyrażenia. x = 10; y = x>9?100 : 200; // y = 100
Operator rozmiaru 42 Operator sizeof zwraca rozmiar operandu (zmiennej lub ujętej w nawiasy okrągłe nazwy typu) w bajtach. W języku C bajt zdefiniowany jest, jako długość typu char. double f; printf ( %lu, sizeof f); printf ( %lu, sizeof(int)); Operator sizeof zwraca wartość typu size_t (unsigned int, unsigned long).
Operator przecinkowy 43 Operator, ustawia w szereg kilka wyrażeń, wyrażenie po prawej stronie staje się wartością całego wyrażenia przecinkowego. x = (y=3, y+1); // x = 4 x = (1,19733,3,4,81); // x = 81 Wyrażenia wykonują się od lewej do prawej x = (1,197); // x = 197 x = 1,197; // x = 1