Symbole podstawowe
Alfabet języka C, tj. zbiór znaków, za pomocą których zapisuje się programy w tym języku zawiera:
małe i duże litery alfabetu łacińskiego oraz "_" (znak podkreślenia zaliczany do liter),
cyfry arabskie,
znaki specjalne: + - * / = < > ( ) [ ] { } . , : ; ′ ′ ″ ″ ^ ! # & % | ~ ?
Konwencje Leksykalne
Program składa się z jednej lub więcej jednostek tłumaczenia zapisanych w plikach. Kompilacja programu odbywa się w kilku fazach.
W fazie pierwszej - preprocesora, dokonuje się wstępnej leksykalnej transformacji programu, tzn. interpretuje się wiersze rozpoczynające się znakiem # oraz wykonuje makrodefinicje i makrorozwinięcia. Po zakończeniu fazy preprocesora program jest zredukowany do ciągu jednostek leksykalnych.
Jednostki Leksykalne
Istnieje sześć klas jednostek leksykalnych:
- identyfikatory,
- słowa kluczowe,
- stałe,
- napisy,
- operatory,
- separatory.
Identyfikatory
Identyfikatorem nazywamy ciąg liter i cyfr zaczynający się od litery. Rozróżnia się małe i wielkie litery alfabetu.
Liczba znaków identyfikatora może być dowolna.
Dla identyfikatorów wewnętrznych znaczenie ma co najmniej pierwszych 31 znaków, ale w niektórych implementacjach może być ich więcej.
Identyfikatory o zewnętrznej łączności są bardziej ograniczone, np. w konkretnej implementacji ich znacząca długość może wynosić tylko sześć początkowych znaków bez rozróżniania małych i wielkich liter.
Słowa kluczowe
auto |
break |
case |
char |
const |
continue |
default |
do |
double |
else |
enum |
extern |
float |
for |
goto |
if |
int |
long |
register |
return |
short |
signed |
sizeof |
static |
struct |
switch |
typedef |
union |
unsigned |
void |
volatile |
while |
Słowa kluczowe pisane są małymi literami.
Stałe
Wyróżnia się kilka rodzajów stałych:
- całkowite,
- znakowe,
- zmiennopozycyjne,
- wyliczeniowe.
Wszystkie stałe maja jakiś typ.
Stałą całkowitą składającą się z ciągu cyfr uważa się za:
- dziesiętną, jeśli rozpoczyna się cyfrą różną od 0;
- ósemkową, jeśli rozpoczyna się cyfrą 0 - stałe ósemkowe nie zawierają cyfr 8 i 9;
- szesnastkową, jeśli rozpoczyna się znakami 0x lub 0X - do cyfr szesnastkowych zalicza się litery od a do f dla 0x (lub od A do F dla 0X).
Stała całkowita może być opatrzona przyrostkiem, np. u lub U - ang. unsigned, l lub L - ang. long.
Typ stałej całkowitej zależy od jej postaci, wartości i przyrostka.
Stała znakowa jest ciągiem jednego lub wielu znaków zawartym w apostrofach, np. 'x'.
Wartością stałej znakowej zawierającej tylko jeden znak jest numeryczna wartość tego znaku w zbiorze maszyny wykonującej program.
Wartość stałej wieloznakowej zależy od implementacji.
Dla wyrażenia znaków, których nie zawierają stałe znakowe można stosować sekwencje specjalne.
Stała zmiennopozycyjna składa się z:
- części całkowitej,
- kropki dziesiętnej,
- części ułamkowej,
- litery e lub E;
- wykładnika potęgi - może być ze znakiem,
- opcjonalnego przyrostka typu (f,F,l lub L).
Niektóre z tych elementów można pominąć.
Przykłady:1.2e5f (float), 3.85 (double), 1e-2L (long double)
Stałe wyliczeń - identyfikatory zadeklarowane jako wyliczniki są stałymi typu int.
Napisy
Napis (stała napisowa) jest ciągiem znaków ujętym w znaki cudzysłowu, np. "abc".
W stałych napisowych można stosować te same sekwencje specjalne, co w stałych znakowych.
Sąsiadujące napisy mogą być sklejane podczas kompilacji programu.
Stała napisowa jest tablicą, której elementami są znaki.
Ostatnim elementem tablicy jest znak '\0', który nie należy do napisu.
Operatory
Język C jest bardzo bogato wyposażony we wszelkiego rodzaju operatory. Przedstawiają to poniższe tabele, w których zestawiono wybrane operatory języka C i ich pascalowe odpowiedniki.
Operatory arytmetyczne
C |
Pascal |
Opis |
+ | + | dodawanie |
- | - | odejmowanie |
/ | / lub div | dzielenie |
* | * | mnożenie |
% | mod | reszta z dzielenia dwóch liczb całkowitych |
Operatory zwiększania i zmniejszania
C |
Pascal |
Opis |
++ | brak | zwiększenie o 1 |
-- | brak | zmniejszenie o 1 |
Operator przypisania = przypisuje wartość wyrażenia z prawej strony do zmiennej umiejscowionej po lewej jego stronie. Operator ten to odpowiednik Pascalowego :=. W poniższym przykładzie zadeklarowana zmienna znakowa test posiada przypisaną wartość początkową 'A':
char test='A';
Operatory porównania.
C |
Pascal |
Opis |
> | > | większe niż |
< | < | mniejsze niż |
>= | >= | większe lub równe |
<= | <= | mniejsze lub równe |
== | = | równe |
!= | <> | nie równe |
Operatory logiczne
C |
Pascal |
Funkcja |
! | not | negacja |
&& | and | koniunkcja |
|| | or | alternatywa |
Operatory porównania i logiczne zwracają zawsze wartość 1 (prawda) albo 0 (fałsz).
Operatory bitowe
C |
Pascal |
Operacja |
~ | not | negacja |
& | and | iloczyn logiczny |
| | or | suma logiczna |
^ | xor | różnica symetryczna |
<< | shl | przesunięcie bitowe w lewo |
>> | shr | przesunięcie bitowe w prawo |
Separatory
Separatorami są:
- komentarz - ciąg dowolnych znaków, pomiędzy znakami /*, a */ lub występujący po znakach // do końca wiersza.
- odstępy (spacje),
- znaki poziomej i pionowej tabulacji,
- przejście do nowego wiersza, strony, itp.
Są one nazywane "białymi plamami".
Typy danych
W języku C są cztery podstawowe proste typy danych: char - znak, int - liczba całkowita, float - liczba zmiennopozycyjna (rzeczywista) pojedynczej dokładności i double - liczba zmiennopozycyjna podwójnej dokładności. Typy te można zmodyfikować poprzez dodanie przy deklaracji następujących kwalifikatorów: signed, aby uzyskać liczbę ze znakiem (jest to ustawienie domyślne); unsigned, aby uzyskać liczbę bez znaku; short, aby zmniejszyć wielkość zmiennej (ale zmniejszeniu ulega także zakres); long, aby zwiększyć wielkość zmiennej (zwiększeniu ulega zakres, ale zmienna zajmuje więcej miejsca w pamięci).
W poniższej tabeli zestawiono wybrane typy danych:
Nazwa typu |
Typ |
Zakres |
Wielkość (w bajtach) |
char | całkowity | -128..127 | 1 |
unsigned char | całkowity | 0..255 |
1 |
int | całkowity | -2^31..2^31-1 |
4 (2)* |
unsigned int | całkowity | 0..2^32 |
4 |
short int | całkowity | -32768..32767 |
2 |
unsigned short int | całkowity | 0..65535 |
2 |
longint | całkowity | -2^31..2^31-1 |
4 (2)* |
unsigned long int | całkowity | 0..2^32 |
4 |
float | rzeczywisty | 6 znaków precyzji |
4 |
double | rzeczywisty | 10 znaków precyzji | 8 |
*- dla systemów 16 bitowych
Definicje zmiennych
W języku C wszystkie zmienne muszą być zdefiniowane i zadeklarowane przed ich użyciem w programie. Zdefiniowanie i zadeklarowane zmiennej oznacza nadanie jej nazwy, określenie typu i zażądanie przydzielenia dla niej miejcsa w pamięci.
Podstawowe cechy zmiennej:
- nazwa (identyfikator)
- typ
- wartość
Wyrażenia i instrukcje
Wyrażenie to kombinacja nazw funkcji, zmiennych, stałych, operatorów i podwyrażeń, która zapisana jest w konwencji języka C.
Instrukcja prosta to wyrażenie zakończone średnikiem.
Instrukcja przypisania:
z = w;
Instrukcja wywołania funkcji:
nazwa_funkcji (lista parametrów);
Instrukcja złożona (blok):
{
instrukcja 1
instrukcja 2
...
instrukcja n
}
Instrukcja if:
if (wyrażenie) instrukcja 1 [else instrukcja 2]
Wyrażenie warunkowe musi być typu skalarnego, instrukcja zaś może być dowolną instrukcją, w tym również warunkową. Jeżeli wartość wyrażenia warunkowego jest różna od zera (prawda), wówczas wykonywana jest instrukcja. Użycie fragmentu instrukcji w nawiasach kwadratowych jest opcjonalne, wówczas jeżeli wartość wyrażenia warunkowego jest różna od zera (prawda), to wykonywana jest instrukcja1, w przeciwnym razie (fałsz) - instrukcja2.
Instrukcje if mogą być zagnieżdżane dowolną liczbę razy. Przy użyciu instrukcji if z opcją else należy pamiętać, że słowo kluczowe else jest wiązane z ostatnim słowem if.
Instrukcja for
for (wyrażenie1; wyrażenie2; wyrażenie3) instrukcja
wyrażenie1 - warunek poczatkowy
wyrażenie2 - powtarzaj pętle dopóki warunek 2 jest spełniony
wyrażenie3 - wykonaj w każdym obiegu pętli
Wyrażenie1 może być dowolnego rodzaju, najczęściej jest ono wyrażeniem wyliczeniowym, zawierającym listę inicjacji liczników pętli.
Wartość wyrażenia2 musi być typu skalarnego, zaś wyrażenia3 mogą być dowolnymi poprawnymi wyrażeniami języka C lub C++. Każde z wyrażeń występujących w instrukcji for może zostać pominięte. Instrukcja może być pojedynczą instrukcją lub blokiem instrukcji.
Instrukcja while:
while (wyrażenie) instrukcja
Przed wykonaniem instrukcji w petli while najpierw sprawdzana jest wartość wyrażenia. Składnia języka C wymaga by wyrażenie było zawarte w nawiasach. Jeżeli wyrażenie jest prawdziwe wykonywana jest instrukcja i następuje powrót do ponownego obliczenia wyrażenia. Jeżeli wyrażenie jest fałszywe, następuje natychmiastowe przejście do kolejnej instrukcji znajdującej się po instrukcji while.
Wewnątrz pętli moze być wykonywana jedna instrukcja lub też lista instrukcji zgrupowanych w blok, tzn. zapisanych w nawiasach { }.
Instrukcja do while
do instrukcja while (wyrażenie);
Instrukcja do while jest podobna do instrukcji while, z ta różnicą, że wyrażenie kontrolujące wykonanie pętli jest umieszczone na końcu pętli.
Najpierw wykonywana jest instrukcja, a następuje sprawdzana jest wartość wyrażenia. Jeżeli wyrażenie jest prawdziwe pętla wykonywana jest jeszcze raz, jeżeli wyrażenie jest fałszywe, następuje wyjście z petli i wykonywana jest kolejna instrukcja programu. Instrukcja w pętli wykonywana jest przynajmniej jeden raz. Może ona być pojedynczą instrukcją lub blokiem instrukcji.
Instrukcja switch
switch (wyrażenie)
{
case wyrażenie stałe: instrukcje
default: instrukcje
}
Instrukcja switch służy do wybierania jednego przypadku z wielu.
W pierwszej kolejności obliczana jest wartość wyrażenia w instrukcji switch. Następnie jest ona porównywana z wartościami kolejnych wyrażeń stałych. Jeśli wartość wyrażenia jest równa wartości wyrażenia stałego, to wykonywane są odpowiadające mu instrukcje. Jeżeli wartość wyrażenia nie została dopasowana do żadnego wyrażenia stałego, to wykonywane są instrukcje występujące po słowie kluczowym default.
Wyrażenie stałe, to takie wyrażenie, którego wartość może być obliczona w momencie kompilacji.
Chcąc przerwać wykonywanie instrukcji switch należy użyć instrukcji break.
Instrukcja break
break;
Instrukcja break może wystąpić tylko wewnątrz pętli lub instrukcji switch i powoduje przerwanie ich wykonywania. W przypadku instrukcji zagnieżdzonych break powoduje wyjście z najbardziej zagnieżdżonej pętli lub instrukcji switch.
Instrukcja continue
continue;
Instrukcja continue może wystąpić tylko wewnątrz pętli. Powoduje ona przejście do następnej instrukcji za ostatnią instrukcją w pętli (czyli do instrukcji sprawdzającej warunek kontynuacji pętli).
- w przypadku pętli while i do...while - przeniesienie sterowania z wnętrza pętli do wyrażenia warunkowego, które zostaje obliczone. W zależności od uzyskanego wyniku wykonywanie pętli jest kontynuowane lub ulega zakończeniu,
- w przypadku pętli for - przeniesienie sterowania do wyrażenia zwiększającego liczniki pętli,
- w przypadku wielokrotnie zagnieżdżonych pętli instrukcja continue jest wiązana z najbliższą instrukcją iteracyjną.
Funkcje matematyczne: nagłówek math.h
sin(x) - sinus x (kąt podany w radianach),
cos(x) - cosinus x (kąt podany w radianach),
tan(x) - tangens x (kąt w radianach),
asin(x) - arcus sinus x (wynik w przedziale [-p/2, p/2]),
acos(x) - arcus cosinus x (wynik w przedziale [ 0 , p ]),
atan(x) - arcus tangens x (wynik w przedziale [-p/2, p/2]),
atan2(x,y) - arcus tangens x/y (wynik w przedziale [-p, p]),
sinh(x) - sinus hiperboliczny x,
cosh(x) - cosinus hiperboliczny x,
tanh(x) - tangens hiperboliczny x,
exp(x) - funkcja wykładnicza: ex,
log(x) - logarytm naturalny: ln(x), x > 0,
log10(x) - logarytm o podstawie 10: log10(x), x > 0,
pow(x,y) - potęgowanie: xy, błąd zakresu wystąpi gdy:
x=0 i y<=0 lub x<0 i y nie jest całkowite,
sqrt(x) - pierwiastek kwadratowy z x, dla x>=0
fabs(x) - wartość bezwzględna |x|
ceil(x) - najmniejsza liczba całkowita nie mniejsza niż x,
wynik typu double,
floor(x) - największa liczba całkowita nie większa niż x,
wynik typu double,
Priorytety i łączność operatorów
Operatory |
Łączność |
( ) [ ] - > . | lewostronna |
! ~ ++ - - + - * & (typ) sizeof
| prawostronna |
* / %
| lewostronna |
<< >>
| lewostronna |
< <= > >=
| lewostronna |
== !=
| lewostronna |
&
| lewostronna |
^
| lewostronna |
|
| lewostronna |
&&
| lewostronna |
||
| lewostronna |
?:
| prawostronna |
= += -= *= /= %= ^= |= <<= >>= | prawostronna |
, | lewostronna |