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:
  1. identyfikatory,
  2. słowa kluczowe,
  3. stałe,
  4. napisy,
  5. operatory,
  6. 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:

  1. całkowite,
  2. znakowe,
  3. zmiennopozycyjne,
  4. wyliczeniowe.
Wszystkie stałe maja jakiś typ.

Stałą całkowitą składającą się z ciągu cyfr uważa się za:
  1. dziesiętną, jeśli rozpoczyna się cyfrą różną od 0;
  2. ósemkową, jeśli rozpoczyna się cyfrą 0 - stałe ósemkowe nie zawierają cyfr 8 i 9;
  3. 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:
  1. części całkowitej,
  2. kropki dziesiętnej,
  3. części ułamkowej,
  4. litery e lub E;
  5. wykładnika potęgi - może być ze znakiem,
  6. 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 divdzielenie
**mnożenie
%modreszta z dzielenia dwóch liczb całkowitych

Operatory zwiększania i zmniejszania

C Pascal Opis
++brakzwiększenie o 1
--brakzmniejszenie 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
!notnegacja
&&andkoniunkcja
||oralternatywa

Operatory porównania i logiczne zwracają zawsze wartość 1 (prawda) albo 0 (fałsz).

Operatory bitowe

C Pascal Operacja
~notnegacja
&andiloczyn logiczny
|orsuma logiczna
^xorróżnica symetryczna
<< shlprzesunięcie bitowe w lewo
>> shrprzesunięcie bitowe w prawo

Separatory

Separatorami są:

  1. komentarz - ciąg dowolnych znaków, pomiędzy znakami /*, a */ lub występujący po znakach // do końca wiersza.
  2. odstępy (spacje),
  3. znaki poziomej i pionowej tabulacji,
  4. 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)
charcałkowity-128..1271
unsigned charcałkowity0..255 1
intcałkowity-2^31..2^31-1 4 (2)*
unsigned intcałkowity0..2^32 4
short intcałkowity-32768..32767 2
unsigned short intcałkowity0..65535 2
longintcałkowity-2^31..2^31-1 4 (2)*
unsigned long intcałkowity0..2^32 4
floatrzeczywisty6 znaków precyzji 4
doublerzeczywisty10 znaków precyzji8

*- 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:

  1. nazwa (identyfikator)
  2. typ
  3. 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).
    1. 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,
    2. w przypadku pętli for - przeniesienie sterowania do wyrażenia zwiększającego liczniki pętli,
    3. 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