1 ELEMENTARZ
jest wyrażeniem i ma wartość - jest nią wartość lewego argumentu przypisania po wykonaniu tej operacji. Oznacza to, że przypisanie może pojawić się jako część j większego wyrażenia. Jeśli przypisanie znaku zmiennej c zostanie umieszczone w części warunkowej pętli while, to program kopiowania można napisać tak:
/* przepisz wejście na wyjście; wersja 2 */ I
while ((c = getcharO) != EOF) I
Pętla while otrzymuje znak, przypisuje go zmiennej c, a następnie sprawdza, czy to,I
co otrzymała, jest sygnałem końca pliku. Jeśli nie, to wykonuje się treść pętli, w którejj jest wypisywany znak, i wszystko powtarza się od początku. Po osiągnięciu końca-; pliku pętla while kończy działanie, a wraz z nią cały program main.
Wersja ta skupia w jednym miejscu obsługę wejścia - jest tylko jedno odwołanie doj funkcji getchar - oraz skraca tekst programu. Nowa wersja jest bardziej zwarta i, poj przyswojeniu nowego zwrotu języka, bardziej czytelna. Często spotkasz się z takird stylem programowania. (Można także przesadzić i tworzyć programy zupełnie nieczytelne; jest to jednak tendencja, którą usiłujemy zwalczać.)
Nawiasy otaczające przypisanie wewnątrz warunku pętli while są konieczne. Priorytet operatora relacji != jest wyższy niż priorytet operatora przypisania =, co znaczy że przy braku nawiasów sprawdzenie warunku != wykonałoby się przed przypisaniem = Zatem zwrot
c = getchar() != EOF
co ma zupełnie niepożądany skutek, przypisuje bowiem zmiennej c wartość 0 lu*
1 w zależności od tego, czy funkcja getchar osiągnęła koniec pliku czy nie. (Więce informacji na ten temat znajdziesz w rozdz. 2.) \
Ćwiczenie 1.6. Sprawdź, że wyrażenie getchar() != EOF może mieć wartość 0 lub 1.
1.5 WEJŚCIE I WYJŚCIE ZNAKOWE Ćwiczenie 1.7. Napisz program wypisujący wartość stałej symbolicznej EOF.
Następny program zlicza znaki; jest on podobny do programu kopiowania.
#jnclude <stdio.h>
/* zlicz znaki wejściowe; wersja 1 */ main()
long nc; nc = 0;
while (getchar() != EOF)
-H-nc;
printf(”%ld\n”, nc);
Instrukcja
•H-nc;
prezentuje nowy operator -t-f, który oznacza zwiększenie o jeden. Zamiast tego możesz napisać nc=nc+1, ale -H-nc jest bardziej zwięzłe i często bardziej efektywne. W języku C istnieje także operator zmniejszania o jeden\ oznacza się go symbolem —. Operatory -H- i — mogą występować albo jako operatory przedrostkowe (-H-nc), albo przyrostkowe (nc-H-). Obie formy różnią się wartościami przyjmowanymi w wyrażeniach, co opiszemy w rozdz. 2, jednak -H-nc i nc-H- tak samo zwiększają o jeden wartość nc. Na razie ograniczymy się do formy przedrostkowej.
Program zliczania znaków gromadzi ich liczbę w zmiennej typu long, a nie int. Obiekty całkowite typu long zajmują co najmniej 32 bity. Chociaż typy int i long na pewnych maszynach są tego samego rozmiaru, to na innych typ int zajmuje tylko 16 bitów. Oznacza to maksymalną wartość 32 767, a więc nawet dla względnie krótkiego pliku wejściowego mogłoby powstać przepełnienie licznika typu int. Specyfikacja przekształcenia %ld jest sygnałem dla funkcji printf, że odpowiedni argument jest liczbą całkowitą typu long.
Można sobie poradzić z jeszcze większymi liczbami, stosując typ double (tj. typ float podwójnej precyzji). Ponadto, aby zilustrować inny sposób tworzenia pętli, użyjemy instrukcji for zamiast while.
39