12.07.2015 Views

Wprowadzenie do programowania w języku C — typy, operatory ...

Wprowadzenie do programowania w języku C — typy, operatory ...

Wprowadzenie do programowania w języku C — typy, operatory ...

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Wprowadzenie</strong> <strong>do</strong> <strong>programowania</strong>w języku CCzęść czwartaTypy, <strong>operatory</strong>, wyrażeniaAutorRoman SimińskiKontaktsiminski@us.edu.plwww.us.edu.pl/~siminskiNiniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa.Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne.Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaTypy proste w języku C dzielimy następująco:1. Typy arytmetyczne:całkowite:char – znakowy,int – całkowity,wyliczeniowe;zmiennopozycyjne:float – pojedyncza precyzja,<strong>do</strong>uble – podwójna precyzja.2. Typ void.3. Typy wskaźnikowe.Copyright © Roman Simiński Strona : 2


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaTyp znakowy charZmienne zadeklarowane jako znakowe – char – są <strong>do</strong>statecznie duże aby pomieścić<strong>do</strong>wolny element zbioru znaków dla danej maszyny bądź systemu operacyjnego.Wartość zmiennej znakowej to liczba całkowita równa ko<strong>do</strong>wi danego znaku.Zmienna typu char jest zatem krótką liczbą całkowitą i tak może być traktowana,można zmiennych tego typu używać w wyrażeniach.char c = 'A'; /* Stała 'A' ma wartość kodu litery A, w ASCII to 65 */char d;d = c + 1;putchar( c ); /* Wyprowadza liter ę A */putchar( d ); /* Wyprowadza liter ę B */Pascal′ owe kombinacje z typem Charnie są w C potrzebne!Ord( ’A’ )65Chr( 65 )’A’Copyright © Roman Simiński Strona : 3


Podstawy i języki <strong>programowania</strong>Typy proste w języku CTyp znakowy char, cd. ...Język CTypy, <strong>operatory</strong>, wyrażeniaZwyczajowo dane typu char reprezentowany jest na jednym bajcie i służą <strong>do</strong>reprezentowania znaków ko<strong>do</strong>wanych wg. ASCII. Do przechowywania kodówznaków wg. ko<strong>do</strong>wania międzynaro<strong>do</strong>wego wykorzystuje się typ wchar_t.Uporządkowanie literi cyfr w kodzie ASCIIZnak:spójne obszary ko<strong>do</strong>weCyfry Duże litery Małe litery. . . 0 1 . . . 9 . . . A B . . . Z . . . a b . . . z . . .. . . . . . . . . . . . . . . . . . . . .Kod: 048 49 57 65 66 90 97 98 122 255Mimo możliwości wykorzystania typu char <strong>do</strong> realizacji obliczeń arytmetycznych namałych wartościach, zwyczajowo wykorzystuje się <strong>do</strong> tego typ int, co jestnaturalniejsze i niejednokrotnie ... szybsze!Copyright © Roman Simiński Strona : 4


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaTypy proste w języku CTyp całkowity intZmienne typu całkowitego – int – mają zwykle naturalny rozmiar wynikającyz architektury maszyny lub śro<strong>do</strong>wiska systemowego.Zwykle w śro<strong>do</strong>wiskach 16-bitowych rozmiar danej typu int to dwa bajty,w śro<strong>do</strong>wiskach 32-bitowych to 4 bajty.Typy zmiennopozycyjne float i <strong>do</strong>ubleStandard nie określa wewnętrznej reprezentacji danych zmiennopozycyjnych, zwykleimplementacje są zgodne z formatem IEEE <strong>do</strong>tyczącym takich liczb.Typ voidfloat to typ przeznaczony <strong>do</strong> reprezentowania liczb rzeczywistych pojedynczejprecyzji.<strong>do</strong>uble to typ przeznaczony jest <strong>do</strong> reprezentowania liczb rzeczywistych wpodwójnej precyzji.Wystąpienie typu void w deklaracji oznacza brak wartości. W zależności odkontekstu interpretacja zapisu void może się nieznacznie zmieniać, zawsze jednakjest to sygnał, że w danym miejscu nie przewiduje się wystąpienia żadnej konkretnejwartości lub konkretnego typu.Copyright © Roman Simiński Strona : 5


Podstawy i języki <strong>programowania</strong>Typy proste w języku CTyp void,cd. ...Język CTypy, <strong>operatory</strong>, wyrażeniaWystąpienie typu void w deklaracji oznacza brak wartości.W zależności od kontekstu interpretacja zapisu void może się nieznacznie zmieniać,zawsze jednak jest to sygnał, że w danym miejscu nie przewiduje się wystąpieniażadnej konkretnej wartości lub konkretnego typu.Funkcja bezparametrowa:int func( void );Funkcja nie u<strong>do</strong>stępniająca rezultatu:void fun( int i );Bezparametrowa funkcja, nie u<strong>do</strong>stępniająca rezultatu:void fun( void );Rzutowanie rezultatu funkcji na typ void — rezultat funkcji jest nieistotny( void )sin( 0 ); /* Mało sensowne ale to przykład */( void )getchar(); /* Znacznie częściej wykorzystywane */Copyright © Roman Simiński Strona : 6


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaTypy pochodne typów całkowitych — modyfikatory unsigned i signedModyfikatory signed i unsigned mogą być stosowane <strong>do</strong> typów char i int.Zmieniają one sposób traktowania najstarszego bitu liczby.Modyfikatory pozwalają na tworzenie specyfikacji typów pochodnych:unsigned int – typ całkowity służący <strong>do</strong> reprezentacji liczb całkowitych bezznaku. Najstarszy bit liczby jest uznawany za jeden z bitów wartości.signed int - typ całkowity służący <strong>do</strong> reprezentacji liczb całkowitych zeznakiem. Najstarszy bit liczby jest bitem przechowującym informację o znakuliczby, nie wchodzi <strong>do</strong> bitów wartości.unsigned char i signed char analogicznie jak dla typu int.Copyright © Roman Simiński Strona : 7


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaSigned, unsigned — o co chodzi?Liczba 8-mio bitowa ze znakiem7 6 5 4 3 2 1 0Bit znakuBity określające wartość liczbyLiczba 8-mio bitowa bez znaku7 6 5 4 3 2 1 0Bity określające wartość liczby-1Jako liczbaze znakiem255Jako liczbabez znakuCopyright © Roman Simiński Strona : 8


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaSigned, unsigned — ważne, nieważne?Ten sam układ bitów, różna interpretacja:signed char sc = 0xff;unsigned char uc = 0xff;printf( "%d %d", sc, uc );-1 255Zapis szesnastkowy: ffhCzym grozi nieznajomość zagadnienia signed a unsigned?char counter = 0; /* Zmienn ą char jako krótka liczba całkowita */<strong>do</strong>{...counter = counter + 1;}while( counter < 150 );Wszystko OK?int counter = 0; /* Teraz zmienna int, niech sizeof(int) == 2 */<strong>do</strong>{...counter = counter + 1;}while( counter < 50000 );Wszystko OK?Copyright © Roman Simiński Strona : 9


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaTypy char i int — <strong>do</strong>myślnie signed czy unsigned?Jak sprawdzić czy <strong>do</strong>myślenie typ char jest signed czy unsigned?Zajrzeć <strong>do</strong> <strong>do</strong>kumentacja albo <strong>do</strong> systemu pomocy, lub napisać, skompilowaći uruchomić program:#include #include int main(){char c = 0xff;printf( "W tej implementacji języka C typ char jest <strong>do</strong>myślnie " )if( c < 0 )printf( "signed" );elseprintf( "unsigned" );}return EXIT_SUCCESS;Domyślnie typ int traktowany jest jako typ całkowity ze znakiem.Domyślne traktowanie typu char zależy od implementacji.Copyright © Roman Simiński Strona : 10


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaTypy pochodne typów całkowitych — modyfikatory short i long a typ intModyfikatory short i long mogą być stosowane <strong>do</strong> typu int.Modyfikator short sygnalizuje chęć skrócenia danej w stosunku <strong>do</strong> rozmiaru typuint.Modyfikator long sygnalizuje chęć posłużenia się daną dłuższą w stosunku <strong>do</strong>rozmiaru typu intshort int – typ całkowity służący <strong>do</strong> reprezentowania liczb o potencjalnie„krótszej” reprezentacji wewnętrznej niż typ int, zatem potencjalnie o mniejszymzakresie wartości.long int – to typ całkowity służący <strong>do</strong> reprezentowania liczb o potencjalnie„dłuższej” reprezentacji wewnętrznej niż typ int, zatem potencjalnie o większymzakresie wartości.Copyright © Roman Simiński Strona : 11


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaJak jest naprawdę z tymi długościami różnych typów całkowitych?Standard ANSI zakłada, że int oraz short int są co najmniej 16-to bitowe, longint jest co najmniej 32-bitowy.Dodatkowo mówi się, że:sizeof( char )


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaProgramista może definiować własne synonimy typówtypedef unsigned chartypedef unsigned short inttypedef unsigned long intbyte;word;counter_t;Specyfikacja typedef przypisuje symboliczną nazwę <strong>do</strong> istniejącejwcześniej definicji typu .typedef ;Modyfikatory short i long a <strong>typy</strong> zmiennopozycyjneMożna stosować modyfikatory short i long z typami float i <strong>do</strong>uble, jednak tylkokombinacja long <strong>do</strong>uble ma sens.Typ <strong>do</strong>uble naturalnie rozszerza typ float zatem zapis long float to po prostuprzestarzały synonim typu <strong>do</strong>uble.Z kolei typu <strong>do</strong>uble nie można skrócić, zatem specyfikacja short <strong>do</strong>uble nie masensu. Nie można również skrócić typu float, zatem specyfikacja short float niema sensu.Copyright © Roman Simiński Strona : 13


Podstawy i języki <strong>programowania</strong>Typy proste w języku CTypy wyliczenioweJęzyk CTypy, <strong>operatory</strong>, wyrażeniaTypy wyliczeniowe nie występowały we wczesnych implementacjach języka C.W tych implementacjach brakowało sposobu przedstawienia uporządkowanej listytakich elementów, które można przedstawić jedynie nazwami. Przykładem mogą byćnp. dni tygodnia, miesiące, kolory.Typ wyliczeniowy to tak na prawdę, lista nazwanych stałych całkowitych.enum RGB_colors{RED,GREEN,BLUE};enum boolean{FALSE,TRUE};Copyright © Roman Simiński Strona : 14


Podstawy i języki <strong>programowania</strong>Typy proste w języku CTypy wyliczeniowe, cd. ...Język CTypy, <strong>operatory</strong>, wyrażeniaStałe wyliczeniowe, są typu int, mogą wystąpić w każdym miejscu <strong>do</strong>zwolonym dladanej całkowitej.Identyfikatory stałych wyliczeniowych powinny być unikatowe w ramach danegowyliczenia.Każda stała wyliczeniowa ma swoją wartość całkowitą. Pierwsza stała na liścieotrzymuje wartość 0, następna 1 itd.Każda stała występująca w wyliczeniu może posiadać swój inicjalizator, przypisującymu wartość (również ujemną) wyznaczoną przez programistę.Każdy element wyliczenia nie posiadający inicjalizatora otrzymuje wartość o jedenwiększą od swojego poprzednika na liścieenum months{JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEPT, OCT, NOV, DEC};Copyright © Roman Simiński Strona : 15


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaTypy wyliczeniowe, przykład zastosowaniaenum months{JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEPT, OCT, NOV, DEC};void wypisz_nazwe_miesiaca( int kod ){switch( kod ){case JAN : printf( "Stycze ń" );break;case FEB : printf( "Luty" );break;case MAR : printf( "Marzec" );break;. . .. . .default : printf( "Błedny kod miesiaca" );break;}}. . .wypisz_nazwe_miesiaca( FEB );Copyright © Roman Simiński Strona : 16


Podstawy i języki <strong>programowania</strong>Typy proste w języku CJęzyk CTypy, <strong>operatory</strong>, wyrażeniaTypy wyliczeniowe a stałe symboliczneenum ctrl_key_codes{UP = 0x48,DOWN = 0x50,LEFT = 0x4b,RIGHT = 0x4d,DEL = 0x53,INS = 0x52,HOME = 0x47,END = 0x4f,PGUP = 0x49,PGDN = 0x51};enum boolean{FALSE,TRUE};?#define UP 0x48#define DOWN 0x50#define LEFT 0x4b#define RIGHT 0x4d#define DEL 0x53#define INS 0x52#define HOME 0x47#define END 0x4f#define PGUP 0x49#define PGDN 0x51#define FALSE 0#define TRUE 1lub#define TRUE (0==0)#define FALSE (!TRUE)Copyright © Roman Simiński Strona : 17


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaKomentarze, cd. ...Uwaga ― komentarze nie znikają z kodu bez śladu. Według ANSI C, każdy komentarzzastępowany jest znakiem spacji.Zatem poniższa kombinacja nie jest poprawna syntaktycznie:int licz/* licznik wystąpie ń */nik;Komentarze w języku C++W języku C++ można używać komentarzy takich jak w C oraz komentarzyjednoliniowych, rozpoczynających się od pary // i rozciągających się aż <strong>do</strong> końca linii.int licznik; // Ta zmienna będzie licznikiem wystąpie ń wzorcaKomentowanie znaczenia zmiennychGłupie komentarze, które w niczym nie pomagają:int counter; /* Ta zmienna będzie licznikiem */float paliwo; /* Zmienna rzeczywista o nazwie paliwo */int i, j; /* Zmienne indeksowe tablicy*/Te są wyraźnie lepsze:int counter; /* Licznik tych linii pliku, które zawieraj ą wzorzec */float paliwo; /* Zmienna przechowuje ilość paliwa zużytego przez pojazd */float delta; /* Delta – wyróżnik trójmianu kwadratowego */Copyright © Roman Simiński Strona : 20


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaKomentarze opisujące funkcje — przykład mocno rozbu<strong>do</strong>wanej wersji:/*-------------------------------------------------------------------------Funkcja:float oblicz_delte( float a, float b, float c )Przeznaczenie i opis działania:Wykorzystywana w wyznaczaniu miejsc zerowych trójmianu kwadratowego.Funkcja oblicza wyróżnik trójmianu kwadratowego w postaci:y = a * x^2 + b * x + cwg. wzoru:delta = b*b – 4*a*cFunkcja wstawia wartość 1 <strong>do</strong> zmiennej globalnej brak_rozw_rzeczjeżeli wyróżnik ma wartośc ujemna, 0 w przeciwnym wypadku.Paramtery:a, b, c – współczynniki trójmianu kwadratowego, jak opisano wyżejRezultat:Wartość wyróżnika obliczona wg. wzoru jak wyżejWejście:ParamteryWyjście:Rezultat i zmienna globalna brak_rozw_rzeczEfekty uboczne:Modyfikacja zmiennej globalnej brak_rozw_rzecz-------------------------------------------------------------------------*/float oblicz_delte( float a, float b, float c ){float delta = b*b – 4*a*c;if( delta < 0 )brak_rozw_rzecz = 1;elsebrak_rozw_rzecz = 0;return delta;}Copyright © Roman Simiński Strona : 21


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaSyntaktyka – z czego zbu<strong>do</strong>wany jest program?`W trakcie procesu kompilacji kod źródłowy dzielony jest na elementy zwanejednostkami leksykalnymi (ang. tokens). Rozróżnia się sześć klas jednostekleksykalnych:identyfikatory (ang. identifiers),słowa kluczowe (ang. keywords),stałe (ang. constants),napisy (ang. string-literals),<strong>operatory</strong> (ang. operators),separatory (ang. punctuators).Copyright © Roman Simiński Strona : 22


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaIdentyfikatoryIdentyfikator to ciąg liter, cyfr i znaków podkreślenia rozpoczynający się od litery,przy czym znak podkreślenia traktowany jest jako litera. Duże i małe litery sąrozróżniane.Rozróżnia się 31, 32 pierwsze znaki, liczbę znaczących znaków można zwykle wposzczególnych implementacjach redukować.Uwaga – polskie znaki nie są traktowane jako litery!Poprawne identyfikatory:J23, J_23, Pi, wartosc_maksymalna, WartoscMaksymalna, Wartosc_Maksymalna, _2PiNiepoprawne identyfikatory:J 23, 007_James_Bond, 2Pi, wartosc maksymalna, Wartosc-Maksymalna,wartość_maksymalnaUwaga ― identyfikatory są arbitralnie wybranymi nazwami dla zmiennych, funkcji,definiowanych przez programistę typów danych itp..Copyright © Roman Simiński Strona : 23


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaIdentyfikatory, cd. ...Nie ma normatywnych zaleceń odnośnie konwencji pisania identyfikatorów.Tradycyjnie jednak, w programach pisanych w języku C (w C++ już niekoniecznie)nazwy zmiennych i funkcji pisze się małymi literami, czasem ze znakiempodkreślanie w identyfikatorach będących zlepkami.charcounter, getline, maxlinelub char_counter, get_line, max_lineNazwy stałych symbolicznych zwyczajowo pisze się dużymi literami.Słowa kluczoweSłowa kluczowe to identyfikatory zastrzeżone i nie mogą być inaczej stosowane niżokreśla to standard języka. Słowa kluczowe winny być pisane tak jak je podano, a więcwyłącznie z wykorzystaniem małych liter. Słowa kluczowe wg. normy ANSI C:auto break case char const continue default <strong>do</strong><strong>do</strong>uble else enum extern float for goto ifint long register return short signed sizeof staticstruct switch typedef while union unsigned void volatileCopyright © Roman Simiński Strona : 24


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaStałeStała to jednostka leksykalna reprezentująca określoną wartość numeryczną lubznakową. Dokładniej wyróżnia się stałe:całkowitoliczbowe,znakowe,zmiennopozycyjne,wyliczeniowe.Stałe całkowitoliczboweStała całkowita może być zapisywana dziesiętnie, ósemkowo, szesnastkowo.Wszystkie stałe rozpoczynające się od zera traktowane są jako ósemkowe.Wszystkie stałe rozpoczynające się od przedrostka 0x lub 0X są traktowane jakoszesnastkowe.int i = 10; /* Stała dziesiętna */int o = 077; /* Stała ósemkowa */int h = 0xff; /* Stała szesnastkowa */Copyright © Roman Simiński Strona : 25


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaStałe całkowitoliczbowe, cd. ...Dozwolone cyfry ósemkowe to:0, 1, 2, 3, 4, 5, 6, 7Dozwolone cyfry szesnastkowe to:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, FStała całkowitoliczbowa może być zakończona przyrostkiem u lub U co oznacza żeliczba jest bez znaku (<strong>do</strong>kładniej – najstarszy bit liczby jest częścią wartości).Stała całkowitoliczbowa może być zakończona przyrostkiem l lub L co oznacza żeliczba jest długa.Typ stałej znakowej jest <strong>do</strong>bierany przez kompilator wśród pasujących typówcałkowitych występujących w języku C.Wartość stałej całkowitoliczbowej nie może przekraczać zakresu typu liczba całkowitadługa bez znaku (unsigned long int). Wartości większe są obcinane.Dla implementacji zakładającej 32-bitową długość liczby długiej bez znaku, wartośćmaksymalna wynosi odpowiednio:4 294 967 295 dec 037777777777 oct 0xFFFFFFFF hexCopyright © Roman Simiński Strona : 26


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaStałe znakoweStała znakowa jest ciągiem złożonym z jednego lub więcej znaków, zawartychw apostrofach.Wartością stałej znakowej zawierającej tylko jeden znak jest numeryczna wartośćtego znaku w zbiorze znaków maszyny wykonującej program.Wartość stałej wieloznakowej jest zależna od implementacji.W języku C stała znakowa reprezentowana jest jako wartość typu całkowitoliczbowegoint.W języku C++ stała znakowa reprezentowana jest przez wartość typu char, staławieloznakowa natomiast przez wartość typu int.Przykład stałej jednoznakowej'A' – dla maszyn wykorzystujących kod ASCII stała ta reprezentuje wartośćcałkowitą odpowiadającą ko<strong>do</strong>wi znaku, jest to wartość dziesiętna 65Inne przykła<strong>do</strong>we stałe jednoznakowe:'a' '#" '$' ',' '1' '+' '.' '&' 'C'Copyright © Roman Simiński Strona : 27


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaStałe znakowe specjalneSekwencje specjalne pozwalają na reprezentowanie znaków nie posiadających swoichlegalnych symboli graficznych.Dodatkowo sekwencje specjalne są wykorzystywane <strong>do</strong> zapisu pewnych „niewygodnych”stałych znakowych.Sekwencja Wartość Znak Znaczenie\a 0x07 BEL Audible bell\b 0x08 BS Backspace\f 0x0C FF Formfeed\n 0x0A LF Newline (linefeed)\r 0x0D CR Carriage return\t 0x09 HT Tab (horizontal)\v 0x0B VT Vertical tab\\ 0x5c \ Backslash\' 0x27 ' Apostrof\" 0x22 " Cudzysłów\? 0x3F ? Pytajnik\O any O = łańcuch ósemkowych cyfr\xH any H = łańcuch szesnastkowych cyfr\XH any H = łańcuch szesnastkowych cyfrCopyright © Roman Simiński Strona : 28


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaStałe znakowe specjalne, cd. ...Wyprowadzenie <strong>do</strong> strumienia wyjściowego znaku BELL:putchar( '\a' );lubputchar( '\007' );lubputchar( '\x07' );Wyprowadzenie litery A, cofnięcie o jedną pozycję, nadpisanie litery B:putchar( 'A ' );putchar( '\b' );putchar( 'B' );Rozszerzony zbiór znakówRozszerzone zbiory znaków nie mogą być odwzorowywane przez typ char.Standard ANSI wprowadza typ całkowity wchar_t, jest to typ całkowity zdefiniowanyw pliku nagłówkowym stddef.h.Stałe rozszerzonego zbioru znaków zapisuje się z prefixem L, np.:x = L'A'; /* Do x jest przypisana rozszerzona stała znakowareprezentująca liter ę A */Copyright © Roman Simiński Strona : 29


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaStałe wyliczenioweStałe wyliczeniowe zdefiniowane w obrębie danego typu wyliczeniowego sąsymbolicznymi odpowiednikami pewnych wartości całkowitych typu int.Wartość odpowiadająca danej stałej symbolicznej wynika z deklaracji typuwyliczeniowego.enum months{JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEPT, OCT, NOV, DEC};. . .int m;/* Iteracja maszerująca po kolejnych miesiącach */for( m = JAN; m


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaNapisyNapisy zwane są inaczej literałami łańcuchowymi (ang. string literals) lub stałymiłańcuchowymi (ang. string constans).Napisem jest ciąg znaków ujętych w znaki cudzysłowu. W napisach możnastosować znakowe sekwencje specjalne.Napisy są tablicami znakowymi o klasie pamięci static. Na końcu każdego napisukompilator <strong>do</strong>pisuje znacznik końca napisu (NUL) oznaczany sekwencją \0.Zatem każdy napis w pamięci operacyjnej zajmuje tak faktycznie o jeden znakwięcej.”To jest napis”a to jego reprezentacja wewnętrzna:T o j e s t n a p i s \0Fizyczna długość napisu = liczba znaków + 1Znacznik końca napisu\0 to znak o kodzie 0Copyright © Roman Simiński Strona : 32


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaNapisySąsiadujące ze sobą napisy są łączone w jeden napis. Zapis:puts( "Ala" " ma " "kota" );odpowiada zapisowi:puts( "Ala ma kota" );Napisy mogą zajmować więcej niż jedną linię ale muszą być jawnie łączone znakiem \(backslash).puts( "Ala ma kota \i ze dwa psy");Po<strong>do</strong>bnie jak w przypadku stałych znakowych, napisy złożone ze znakówrozszerzonych są poprzedzane przedrostkiem l lub L, każdy element takiego napisujest wtedy znakiem typu wchar_t.Łączenie normalnych i rozszerzonych napisów nie jest zdefiniowane.Identyczne napisy występujące wielokrotnie w programie mogą być fizyczniereprezentowane tylko raz.Napis pusty zapisuje się w postaci dwóch, następujących po sobie cudzysłowów "".Copyright © Roman Simiński Strona : 33


Podstawy i języki <strong>programowania</strong>Język CTypy, <strong>operatory</strong>, wyrażeniaJednostki leksykalne czyli z czego składa się program ― nudna lecz konieczna dygresjaWybrane separatoryNawiasy kwadratowe (ang. brackets) [ ] wykorzystywane są <strong>do</strong> deklarowaniai odwoływania się <strong>do</strong> jedno i wielowymiarowych tablic.Nawiasy okrągłe (ang. parentheses) ( ) wykorzystywane są <strong>do</strong> grupowania wyrażeń,izolowania wyrażeń warunkowych, wskazują wywołanie funkcji i jej parametry.Nawiasy klamrowe (ang. braces) { } oznaczają początek i koniec instrukcji złożonej,zwanej również blokiem.Przecinek (ang. comma) , rozdziela zwykle elementy na liście parametrów funkcji,występuje również w wyrażeniach przecinkowych.Średnik (ang. semicolon) ; jest znakiem kończącym instrukcję. Każde legalnewyrażenie w języku C (również wyrażenie puste) zakończone znakiem średnika jestinterpretowane jako instrukcja wyrażeniowa.a + b; /* Być może nastąpi wartościowanie wyrażenia ale suma zostaniepominięta */; /* Instrukcja pusta, powstająca z zakończenia średnikiem wyrażeniapustego*/Copyright © Roman Simiński Strona : 34


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaOperatory arytmetyczneJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory arytmetyczne to +, −, *, / oraz operator reszty z dzielenia modulo %.Operator % nie może być stosowany <strong>do</strong> liczb rzeczywistych.Uwaga — dzielenie na operandach całkowitych daje wynik całkowity, ten kod:int x = 5, y = 2;float f = x/y;printf( ”Wynik dzielenia %d przez %d wynosi %f”, x, y, f );wyprodukuje:Aby otrzymać wynik rzeczywisty jeden z operandów musi być rzeczywisty, np:int x = 5, y = 2;float f = ( float )x/y; /* Rzutowanie czyni dzieln ą liczb ą rzeczywist ą */Copyright © Roman Simiński Strona : 35


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory relacji i <strong>operatory</strong> logiczneOperatory relacji to >, >=,


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory zwiększania ++ i zmniejszania —―Operatory ++ i —― zawsze powodują odpowiednio zwiększenie lub zmniejszeniewartości argumentu. Mogą one jednak występować jako przedrostki (ang. prefix) lubprzyrostki (ang. postfix).Wersja przedrostkowa zwiększa (zmniejsza) wartość argumentu przed użyciem jegowartości.Wersja przyrostkowa zwiększa (zmniejsza) wartość argumentu po użyciem jegowartości.int a = 5, b;b = ++a;a == 6, b == 6int a = 5, b;b = a++;a == 6, b == 5Uwaga na <strong>operatory</strong> ++ i —―:i = ++i---i+++i+i--;i = ++i - --i + ++i + i--;Copyright © Roman Simiński Strona : 37


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaOperatory bitoweJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory bitowe mogą być stosowane <strong>do</strong> argumentów typu całkowitego, są to:Operator Znaczenie& bitowa koniunkcja (and),| bitowa alternatywa (or),^ bitowa różnica symetryczna (xor),> przesunięcie w prawo,~ <strong>do</strong>pełnienie jedynkowe.int x = 5, y = 7, z;z = x & y;0...01010...01110...0101 z == 5z = x | y;0...01010...01110...0111 z == 7z = x ^ y;0...01010...01110...0010 z == 2Copyright © Roman Simiński Strona : 38


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory bitowe, przykłady zastosowaniaNiech będzie zadeklarowana zmienna flag, o rozmiarze 1-go bajta:unsigned char flag = 0;Ustawianie pewnych bitów liczby:flag = flag | 1; /* Ustawienie najmłodszego bitu liczby flag */Zerowanie pewnych bitów liczby:flag = flag & ~1; /* Wyzerowanie najmłodszego bitu flag */Testowanie czy pewne bity liczby są ustawione:if( flag & 1 ) /* Czy najmłodszy bit jest ustawiony? */. . .Copyright © Roman Simiński Strona : 39


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory bitowe, przesunięcia bitowePrzesunięcie o jeden bit w lewo:unsigned char flag = 1; /* 00000001 */flag = flag 1; /* 01000000 */flag = flag >> 1; /* 00100000 */Uwaga na bit znaku:signed char flag = 128; /* 10000000 */flag = flag >> 1; /* 11000000 */flag = flag >> 1; /* 11100000 */Copyright © Roman Simiński Strona : 40


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory bitowe, przesunięcia bitowe — przykład wykorzystaniaIle bitów ma liczba typu int w danej implementacji?Implementacja z wykorzystaniem iteracji while:int bits_per_int( void ){int number = 1, counter = 0;}while( number != 0 ){number = number


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory przypisaniaPrzypisanie wartości jest w języku C wyrażeniem a nie instrukcją. Operatorprzypisania = jest lewostronnie łączny, co umożliwia łączenie przypisań:int i = 5, j, k, l;j = k = l = i;ale również:j = ( k = ( l = ( i + 5 ) ) + 10 ) * 2; /* j == 40, k == 20, l == 10 */Dla większości operatorów dwuargumentowych:+ - * / % > * ^ & |można wykorzystywać specjalne <strong>operatory</strong> przypisania, pozwalające skrócić zapisczęsto wykorzystywanych konstrukcji, takich jak:Wersja z normalnai = i + 2y = y * 2x = x > k;Wersja skróconai += 2y *= 2x = k;Copyright © Roman Simiński Strona : 42


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperatory przypisania, cd. ...Ogólnie, jeśli expr1 i expr2 to wyrażenia, a op to operator dwuargumentowy, zapis:expr1 = expr1 op expr2można uprościć <strong>do</strong> postaci:expr1 op= expr2Przykład zastosowania:int bits_per_int( void ){int number = 1, counter = 0;for( ; number != 0; counter++ )number = number


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOptymalizacje... a może niepotrzebne komplikacje?int bits_per_int( void ){int number = 1, counter = 0;for( ; number != 0; counter++ )number


Podstawy i języki <strong>programowania</strong>Operatory i wyrażeniaJęzyk CTypy, <strong>operatory</strong>, wyrażeniaOperator warunkowyBardzo często spotyka się pewne „symetryczne” instrukcje warunkowe, np.:if( delta < 0 )brak_rozw_rzecz = 1;elsebrak_rozw_rzecz = 0;if( a > b )max = a;elsemax = b;Można je zapisać krócej, z wykorzystaniem operatora warunkowego:brak_rozw_rzecz = ( delta < 0 ) ? 1 : 0;max = ( a > b ) ? a : b;Chociaż:brak_rozw_rzecz = ( delta < 0 ) ? 1 : 0;brak_rozw_rzecz = ( delta < 0 );Inny przykład — komunikaty w wersji polskiej lub angielskiej:enum WERSJA_JEZYKOWA { POLSKI, ANGIELSKI };int jezyk = POLSKI;. . .puts( ( jezyk == POLSKI ) ? ”Podaj wartość: ” : ”Input value:” );Copyright © Roman Simiński Strona : 45

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!