W potrzasku jezyka C.pdf

(320 KB) Pobierz
C:\Andrzej\PDF\ABC nagrywania p³yt CD\1 strona.cdr
IDZ DO
PRZYK£ADOW Y ROZDZIA£
W potrzasku
SPIS TRECI
jêzyka C
KATALOG KSI¥¯EK
Autor: Andrew Koenig
T³umaczenie: Przemys³aw Szeremiota
ISBN: 83-7361-727-2
Tytu³ orygina³ u: C Traps and Pitfalls
Format: B5, stron: 152
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
DODAJ DO KOSZYKA
Ka¿dy, nawet najbardziej dowiadczony programista, pope³nia b³êdy podczas pracy.
Niektóre z nich wynikaj¹ z popiechu, inne — z u¿ycia niew³aciwych konstrukcji,
operatorów lub typów. Wiêkszoæ z nich mo¿na wykryæ i usun¹æ po kilku minutach
uwa¿nej lektury kodu. Zdarzaj¹ siê jednak i takie b³êdy, których odnalezienie
i skorygowanie zajmuje kilka dni. B³êdy te s¹ z regu³y ³atwe do unikniêcia,
jeli zrozumie siê przyczyny ich powstawania.
Ksi¹¿ka „W potrzasku C” zawiera omówienie najczêciej spotykanych b³êdów
i przyczyn ich powstawania. Nie zawiera ogólników - jej atutem s¹ konkretne,
zaczerpniête z praktyki, przyk³ady. Ka¿dy programista prêdzej czy póniej natknie siê
na jeden z prezentowanych w ksi¹¿ce b³êdów i, dziêki zawartym w niej wiadomociom,
bêdzie w stanie usun¹æ go i unikn¹æ w póniejszej pracy.
• B³êdy leksykalne i sk³adniowe
• Przepe³nienie zakresu
• Problemy z konsolidacj¹
• W³aciwe stosowanie funkcji bibliotecznych
• Makrodefinicje
• Przenonoæ kodu
Nie traæ czasu na usuwanie b³êdów — dowiedz siê co robiæ, ¿eby w ogóle nie
wystêpowa³y.
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
O NOWOCIACH
ZAMÓW CENNIK
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
319815103.001.png 319815103.002.png 319815103.003.png 319815103.004.png
Spis treci
.
Wstp ...............................................................................................7
Wprowadzenie .................................................................................11
Rozdział 1. Pułapki leksykalne...........................................................................15
1.1. Porównanie a przypisanie......................................................................................... 16
1.2. & i | to nie to samo co && i ||................................................................................... 17
1.3. Zachłanno analizatora leksykalnego...................................................................... 18
1.4. Literały stałych całkowitych..................................................................................... 19
1.5. Ci(gi a znaki............................................................................................................. 20
Rozdział 2. Pułapki składniowe..........................................................................23
2.1. Deklaracje funkcji .................................................................................................... 23
2.2. Priorytety operatorów............................................................................................... 26
2.3. Uwaga na redniki!................................................................................................... 30
2.4. Instrukcja wyboru switch.......................................................................................... 32
2.5. Wywołania funkcji ................................................................................................... 33
2.6. Klauzula else w zagnie5d5onych instrukcjach if ...................................................... 34
Rozdział 3. Pułapki semantyczne.......................................................................37
3.1. Wska6niki i tablice................................................................................................... 37
3.2. Wska6niki nie s( tablicami....................................................................................... 42
3.3. Deklaracje tablic w roli parametrów......................................................................... 43
3.4. Niebezpieczne synekdochy....................................................................................... 45
3.5. Wska6niki puste a ci(gi niepuste.............................................................................. 46
3.6. Zliczanie a asymetryczne granice zakresów............................................................. 46
3.7. Kolejno obliczania w wyra5eniu........................................................................... 55
3.8. Operatory &&, || i !................................................................................................... 57
3.9. Przepełnienie zakresu liczby całkowitej................................................................... 58
3.10. Zwracanie wartoci przez funkcj: main ................................................................... 59
Rozdział 4. Konsolidacja....................................................................................63
4.1. Czym jest konsolidator? ........................................................................................... 63
4.2. Deklaracje a definicje............................................................................................... 65
4.3. Kolizje nazw i słowo static....................................................................................... 66
4.4. Argumenty, parametry i wartoci funkcji................................................................. 67
4.5. Kontrola typów obiektów zewn:trznych .................................................................. 72
4.6. Pliki nagłówkowe..................................................................................................... 75
6
W potrzasku jzyka C
Rozdział 5. Funkcje biblioteczne........................................................................77
5.1. Funkcja getchar zwraca warto typu int.................................................................. 78
5.2. Aktualizacja pliku sekwencyjnego ........................................................................... 78
5.3. Buforowanie wyjcia i przydział pami:ci................................................................. 80
5.4. Diagnostyka bł:dów funkcj( errno........................................................................... 81
5.5. Funkcja signal .......................................................................................................... 82
Rozdział 6. Preprocesor.....................................................................................85
6.1. Odst:py w makrodefinicjach.................................................................................... 86
6.2. Makrodefinicje a funkcje.......................................................................................... 86
6.3. Makrodefinicje a instrukcje...................................................................................... 90
6.4. Makrodefinicje a definicje typów............................................................................. 91
Rozdział 7. Kwestie przeno&no&ci ......................................................................93
7.1. W obliczu zmian....................................................................................................... 94
7.2. Co z nazwami? ......................................................................................................... 95
7.3. Rozmiar liczby całkowitej........................................................................................ 96
7.4. Czy znaki maj( znaki?.............................................................................................. 97
7.5. Operatory przesuni: bitowych................................................................................ 98
7.6. Zerowa komórka pami:ci......................................................................................... 99
7.7. Obcinanie przy dzieleniu........................................................................................ 100
7.8. Rozmiar liczby losowej.......................................................................................... 101
7.9. Zamiana wielkoci liter .......................................................................................... 102
7.10. Najpierw zwalnia, potem przydziela ponownie?................................................. 103
7.11. Przykładowe problemy nieprzenonoci ................................................................ 104
Rozdział 8. Porady i odpowiedzi do (wicze)......................................................109
8.1. Porady .................................................................................................................... 110
8.2. Odpowiedzi do wiczeA ......................................................................................... 113
Dodatek A Funkcja printf i zmienne listy argumentów......................................129
A.1. Rodzina funkcji printf............................................................................................ 129
A.1.1. Proste specyfikatory formatu........................................................................ 131
A.1.2. Modyfikatory................................................................................................ 135
A.1.3. Znaczniki...................................................................................................... 138
A.1.4. Zmienna precyzja i szeroko pola............................................................... 140
A.1.5. Neologizmy.................................................................................................. 141
A.1.6. Anachronizmy.............................................................................................. 141
A.2. Zmienne listy argumentów — varargs.h................................................................ 142
A.2.1. Implementacja varargs.h............................................................................... 146
A.3. Zmienne listy argumentów w wydaniu ANSI — stdarg.h..................................... 147
Skorowidz......................................................................................149
Rozdział 1.
Pułapki leksykalne
Czytajc zdanie, nie zastanawiamy si nad znaczeniem poszczególnych liter, tworzcych
kolejne słowa. Litery same w sobie nios bowiem niewiele treci; grupujemy je wic
w słowa i im przypisujemy znaczenie.
Podobnie jest z programami w jzyku C i innych jzykach programowania. Pojedyncze
znaki programu nie znacz prawie nic, jeli rozpatrywa# je osobno; znaczenia nabieraj
dopiero w otoczeniu innych znaków, czyli w pewnym kontekcie. Dlatego w wierszu
kodu:
oba wystpienia znaku znacz zupełnie co innego. Mówic precyzyjniej, oba znaki wy-
stpuj w ró(nych elementach leksykalnych: pierwszy jest czci symbolu , drugi
czci cigu znaków. Dalej, znaczenie elementu leksykalnego jest całkowicie ró(ne
od znaczenia jego poszczególnych znaków.
Pojcie symbolu czy te( elementu leksykalnego odnosi si do jednostki programu, która
odgrywa w nim mniej wicej tak rol jak słowo w zdaniu — element leksykalny ma
podobne znaczenie wszdzie, gdzie wystpuje. Identyczna sekwencja znaków mo(e
w jednym kontekcie nale(e# do jednego elementu leksykalnego, a w innym — do
zupełnie innego. Mechanizm kompilatora, który jest odpowiedzialny za podział tekstu
programu na elementy leksykalne, nosi czsto nazw analizatora leksykalnego.
Rozwa(my nastpujc instrukcj:
. Nastpnym jest znak otwierajcy
nawias, dalej mamy identyfikator , symbol relacji wikszoci, identyfikator itd.
W jzyku C pomidzy elementy leksykalne mo(emy wstawia# dowoln liczb znaków
odstpów (spacji, tabulatorów i znaków nowego wiersza), wic instrukcj t moglibymy
zapisa# równie( tak:
Pierwszym elementem tej instrukcji jest słowo
 
16
W potrzasku jzyka C
W niniejszym rozdziale zajmiemy si szczegółowo niektórymi najczciej popełnianymi
błdami wynikajcymi z niezrozumienia znaczenia elementów leksykalnych i zale(-
noci pomidzy nimi a tworzcymi je znakami.
1.1. Porównanie a przypisanie
, a porówna-
nia — znakami . W jzyku C przypisanie reprezentuje znak , a porównanie — znaki
. Poniewa( w programie czciej wystpuj przypisania ni( porównania, taka repre-
zentacja jest bardzo wygodna dla programisty, bo dla operacji czstszej stosuje krótszy
zapis. Co wicej, w jzyku C przypisanie jest operatorem, co umo(liwia składanie
wielu operacji przypisania w jednym wyra(eniu.
Wygoda ta jest jednak 2ródłem wielu błdów wynikajcych z omyłkowego zapisania
operatora przypisania w miejscu, gdzie powinien znajdowa# si operator porównania;
jak w poni(szej instrukcji warunkowej, która powinna wykonywa# instrukcj
,
kiedy jest równe :
W rzeczywistoci instrukcja ta przypisuje do warto# , a potem sprawdza, czy wyni-
kiem operacji przypisania jest warto# niezerowa. Nastpnym przykładem mo(e by#
ptla, która miała pomija# w pliku znaki odstpów (spacji, tabulacji i nowego wiersza):
W ptli tej w pierwszym porównaniu znaku zamiast zapisano . Poniewa( operator
przypisania ma priorytet ni(szy od operatora , „porównanie” w rzeczywistoci po-
woduje przypisanie do wartoci wyra(enia:
niezale(nie od
pierwotnej wartoci . Dlatego ptla spowoduje „przewinicie” całego pliku. Co sta-
nie si po wyczerpaniu znaków pliku, zale(y od tego, czy implementacja jzyka po-
zwala na kontynuowanie odczytu po osigniciu ko5ca pliku. Jeli tak, program wejdzie
w ptl niesko5czon.
jest ró(na od zera, całe wyra(enie ma warto#
W wikszoci jzyków programowania wywodzcych si z jzyka Algol, na przykład
w Pascalu czy Adzie, operacja przypisania reprezentowana jest znakami
Poniewa( warto#
Zgłoś jeśli naruszono regulamin