2 TYPY, OPERATORY I WYRAŻENIA
możemy zapisać w bardziej zwartej postaci
if (c != ’\n’) s[i++] = c;
Trzecim przykładem do rozważenia niech będzie standardowa funkcja strcat(s,t), która dowiązuje tekst pochodzący z argumentu t do końca tekstu w argumencie s. Zakłada ona, że istnieje wystarczająco dużo miejsca, aby pomieścić tekst wynikowy. Tak jak ją tu napisaliśmy, nie zwraca ona żadnej wartości; standardowa wersja biblioteczna funkcji strcat zwraca wskaźnik do wynikowego ciągu znaków.
/* strcat: dowiąż tekst z t do końca tekstu w s;
tablica s musi być dostatecznie duża */ void strcat(char s[], char t[])
int i, j; i = j = 0;
while (s[i] != ’\0’) /* znajdź koniec tekstu w s */ i++;
while ((s[i++] = t[j++j) != ’\0’) /* przepisz tekst */
Każdy znak z tablicy t jest przepisywany do tablicy s, a więc zastosowanie operatom przyrostkowego do obu zmiennych (i oraz j) zapewnia, że wskażą one odpowiednit pozycje w następnym przebiegu pętli. a
Ćwiczenie 2.4. Napisz inną wersję funkcji squeeze(s1 ,s2) tak, aby z tekstu w argumencie s1 usuwała każdy znak występujący w tekście argumentu s2. I
Ćwiczenie 2.5. Napisz funkcję any(s1,s2), która zwraca albo pozycję pierwszego wystąpienia dowolnego znaku z s2 w tekście argumentu s1, albo -1, jeśli tekst w s1 nie zawiera żadnego znaku z s2. (Standardowa funkcja biblioteczna strpbrk wykonuje to samo zadanie, ale zwraca wskaźnik do znalezionej pozycji.) 1
Język C oferuje sześć operatorów pozwalających na manipulację bitami; można stosować jedynie do argumentów całkowitych, to znaczy char, short, int oraz \o& zarówno ze znakiem liczby, jak i bez znaku. Oto one:
2 9 OPERATORY BITOWE __________
powered by
mTśTo 1
& bitowa koniunkcja (AND),
I bitowa alternatywa (OR),
bitowa różnica symetryczna (XOR),
« przesunięcie w lewo,
» przesunięcie w prawo,
~ dopełnienie jedynkowe (operator jednoargumentowy).
Bitowy operator koniunkcji & jest często stosowany do „zasłaniania” pewnego zbioru bitów; na przykład w instrukcji
n = n & 0177;
zeruje się wszystkie oprócz 7 najmłodszych bitów wartości zmiennej n.
Bitowego operatora alternatywy | używa się do „ustawiania” bitów; na przykład w instrukcji
x = x | SET_ON;
ustawia się jedynki na tych bitach w zmiennej x, które w SET_ON są równe 1.
Operator bitowej różnicy symetrycznej ustawia jedynkę na każdej pozycji bitowej tam, gdzie bity w obu argumentach są różne, a zero tam, gdzie są takie same.
Należy zwrócić szczególną uwagę na różnice między bitowymi operatorami & i | a logicznymi operatorami && i 11, które powodują obliczenie (od lewej do prawej) wartości logicznej „prawda” lub „fałsz”. Dla przykładu: jeśli x równa się 1, a y równa się 2, to x & y ma wartość 0, natomiast x && y ma wartość 1.
Operatory « i » służą do przesuwania bitów argumentu stojącego po lewej stronie operatora (odpowiednio w lewo i w prawo) o liczbę pozycji określoną przez argument stojący po stronie prawej - jego wartość musi być dodatnia. A więc x«2 przesuwa wartość x w lewo o dwie pozycje, zwolnione bity wypełniając zerami (operacja ta jest równoważna z mnożeniem przez 4). Przy przesuwaniu w prawo wielkości bez znaku (unsigned) zwolnione bity zawsze są wypełniane zerami. Przesuwanie w prawo wielkości ze znakiem spowoduje na pewnych maszynach wypełnienie tych miejsc bitem znaku (przesunięcie „arytmetyczne”), na innych zaś zerami (przesunięcie „logiczne”).
Jednoargumentowy operator ~ powoduje dopełnienie jedynkowe wartości swego całkowitego argumentu: zamienia każdy bit 1 na 0 i odwrotnie. Na przykład w wyrażeniu
x = x & -077
nastąpi wyzerowanie ostatnich sześciu bitów x. Zauważ, że wyrażenie x & -077 nie zależy od długości słowa maszyny i dlatego powinno być stosowane zamiast na przykład wyrażenia X & 0177700, w którym zakłada się, że x jest wielkością 16-bitową. Taka przenośna postać operacji nie pociąga za sobą dodatkowych kosztów, albowiem
77