ANSI C 4

ANSI C 4



2 TYPY, OPERATORY I WYRAŻENIA__.______

n = 0;

for (i = 0; s[i] >= ’0’ && s[i] <= ’9’; ++1) n = 10 * n + (s[i] - ’0’); return n;

}

Jak już wspomnieliśmy w rozdz. 1, wyrażenie s[i] - ’0’

daje numeryczną wartość cyfry zawartej w s[i], gdyż wartości kodów znaków ’0\ T itd. tworzą ciąg rosnących liczb całkowitych.

Innym przykładem przekształcenia typu char na int jest funkcja lower, która zamienia wielkie litery alfabetu na małe i działa poprawnie tylko dla zbioru znaków ASCII. Jeśli znak nie jest wielką literą, to funkcja lower zwraca jego wartość bez zmian.

I* lower: zamień c na małą literę; tylko dla ASCII */ int lower(int c)

{

if (c >= ’A’ && c <= T)

return    c + ’a’    - 'A’;    1

else

return c;

}    1

Poprawność działania dla zbioru ASCII wynika z tego, że odległość między kodami odpowiednich wielkich i małych liter jest stała oraz że oba alfabety są ciągłe - między literami A i Z występują jedynie litery. Ta ostatnia właściwość nie obowiązuje jednak w zbiorze znaków EBCDIC, toteż dla tego zbioru nasza funkcja zamieniłaby nie tylko litery.    1

W standardowym    pliku    nagłówkowym <ctype.h> (opisanym w dodatku B) zdefinio

wano rodzinę funkcji realizujących podobne sprawdzenia i przekształcenia niezależnie od zbioru znaków. Jedną z nich, na przykład, jest funkcja tolower(c), która zwraca wartość małej litery alfabetu określonej przez C, jeśli c jest wielką literą; tolower jest zatem przenośnym zamiennikiem naszej funkcji lower. Podobnie sprawdzenie

c >= ’0’ && c <= *9*

można zastąpić ogólniejszym

isdigit(c) /* czy c jest cyfrą */

Od tej pory będziemy używać funkcji z pliku nagłówkowego <ctype.h>.

27 PRZEKSZTAŁCENIA TYPÓW


Przekształcanie znaków na liczby całkowite ma jeden słaby punkt. Ję; la, czy zmienne typu char są wielkościami ze znakiem liczby czy bez. Gdy typ char jest zamieniany na int, czy kiedykolwiek może powstać liczba ujemna? Odpowiedź zmienia się z maszyny na maszynę, odzwierciedlając różnice w ich architekturze. W niektórych znak, którego skrajnie lewy bit jest równy 1, będzie przekształcony na liczbę ujemną (przez tzw. „powielenie bitu znaku”). W innych typ char awansuje do typu int przez dodanie zer z lewej strony, a więc jest zawsze dodatni.

Definicja języka C gwarantuje, że żaden znak ze standardowego maszynowego zbioru znaków drukowalnych nie będzie ujemny, a więc takie znaki w wyrażeniach będą zawsze wartościami dodatnimi. Lecz dowolne wzorce bitowe zapamiętane w zmiennych znakowych mogą być dla jednych maszyn ujemne, dla innych zaś dodatnie. Ze względu na przenośność oprogramowania, w deklaracjach zmiennych typu char używaj kwalifikatora signed lub unsigned. jeśli masz zamiar przechowywać w nich dane „nieznakowe”.

Z definicji wyrażenia relacyjne typu i > j oraz wyrażenia logiczne połączone operatorami && i 11 będą miały wartość 1 - jeśli są prawdziwe, bądź 0 - jeśli są fałszywe. Zatem w przypisaniu

d = c >= ’0’ && c <= ’9’

zmienna d otrzyma wartość 1, jeśli c jest cyfrą, lub 0, jeśli nie jest. Funkcje biblioteczne, jak np. isdigit, mogą dla oznaczenia stanu „prawda” zwracać dowolne wartości różne od zera. W instrukcjach takich, jak if, while czy for, nie robi to jednak większej różnicy, gdyż „prawda” w ich częściach warunkowych znaczy tyle samo, co „nie zero”.

Niejawne przekształcenia arytmetyczne działają zgodnie z oczekiwaniami. Ogólnie, jeśli argumenty operatora dwuargumentowego (np. + czy 1) są różnego typu, to typ „mniejszy” jest promowany do typu „większego” przed wykonaniem operacji. Typem wyniku jest typ „większy”. Szczegółowe reguły przekształceń typów przedstawiono w dodatku w p.A6. Jeśli jednak nie używasz argumentów unsigned, to na razie wystarczy Ci następujący, nieformalny zestaw reguł:

71

1

   Jeśli którykolwiek z argumentów jest typu long double, to ten drugi zostanie przekształcony do long double.

•    W przeciwnym przypadku, jeśli typem któregokolwiek argumentu jest double, to drugi argument będzie przekształcony do double.

•    W przeciwnym przypadku, jeśli typem jednego z argumentów jest float, to drugi argument będzie przekształcony do float.

•    W przeciwnym przypadku, wszystkie obiekty typu char i short są przekształcane do int.


Wyszukiwarka

Podobne podstrony:
ANSI C 1 2 TYPY, OPERATORY I WYRAŻENIA Stała znakowa ’’ reprezentuje znak o wartości zero, tzw. z
ANSI C 2 2 TYPY, OPERATORY I WYRAŻENIA_____— kiej zmiennej, jest poprawną wartością wyliczenia. Zm
ANSI C 3 2 TYPY, OPERATORY I WYRAŻENIA_______ W tablicy 2.1 na końcu tego rozdziału podano prioryt
ANSI C 5 2 TYPY. OPERATORY I WYRAŻENIA • Następnie, jeśli którykolwiek z argumentów ma kwalifikato
ANSI C 6 2 TYPY, OPERATORY I WYRAŻENIA unsigned long int next = 1; I* rand: daj pseudo-losowo licz
ANSI C 7 2 TYPY, OPERATORY I WYRAŻENIA możemy zapisać w bardziej zwartej postaci if (c != ’

ANSI C 8 2 TYPY, OPERATORY I WYRAŻENIA________ -077 jest wyrażeniem stałym, które może być obliczo
ANSI C 9 TYPY, OPERATORY I WYRAŻENIA Zmienne i stałe są podstawowymi obiektami danych, jakimi posł
ANSI C 0 2 TYPY, OPERATORY I WYRAŻENIA Kwalifikatory signed (ze znakiem liczby) i unsigned (bez zn
ANSI C 9 2 TYPY, OPERATORY I WYRAŻENIA______________ „weź i, dodaj 2, a następnie umieść wynik z p
ANSI C 0 2 TYPY, OPERATORY I WYRAŻENIA struktury; będą szczegółowo opisane w rozdz. 6 razem z oper
ANSI C 4 case ’s’: for (sval = va_arg(ap, char *); *sval; sval++)
IMG 07 (9) sf,4ifeVvĄf<-4«.4®r *2,054 to’ 7jf (%■ 0» o Oft) *U’k1r • «M o O.SttłV*».,W<.&
Klastry Klastry wydajnościowe: •    MOSIX (Multicomputer Operating System for UNIX)
IMAG0190 (1) r.2. 3. 4. 5.6. 7.8. 9. 10. test (!) -28 listopada 20/1 Wartość wyrażenia: (x>0) OR

więcej podobnych podstron