C (język programowania)

C (język programowania)
Polecane artykuły

C jest to strukturalny język programowania wysokiego poziomu stworzony przez Dennisa Ritchiego oraz Briana Kernighana w latach 1969-1973. Język ten tworzony był z zamiarem wykorzystania go do tworzenia oprogramowania systemowego z czasem jednak stał się narzędziem szerszego zastosowania.

Niezbędne narzędzia

Aby móc programować w języku C potrzebne są do tego:

  • komputer z systemem operacyjnym np: Linux, Windows lub FreeBSD.
  • edytor tekstowy
  • kompilator języka C – odpowiada za tłumaczenie kodu źródłowego programu do kodu maszynowego (ciąg zer i jedynek)
  • linker – program odpowiadający za łączenie skompilowanych plików źródłowych, które były dołączone do naszego programu za pomocą dyrektywy #include
  • debugger – (opcjonalnie) umożliwia on prześledzenie kodu linijka po linijce w celu zdiagnozowania błędów

Historia

Język B (język interpretowany) był poprzednikiem i dał podstawy do stworzenia języka programowania ANSI C. Język B został stworzony przez Kena Thompsona i był używany w początkowych wersjach systemu operacyjnego UNIX. Firma Bell Labs rozwijała ten język nazywając go później NB (NewB), dalszy rozwój dał język C, który inaczej niż poprzednik jest językiem kompilowanym. Język C zyskał na znaczeniu, ponieważ dawał możliwość uruchamiania systemu UNIX na wielu maszynach, bez potrzeby pisania systemu od nowa.

Wystarczyło bowiem napisać kompilator dopasowany do danego urządzenia. Obecnie wykorzystywane popularne systemy operacyjne takie jak: Linux czy Microsoft Windows zostały napisane w języku ANSI C.

Zastosowania

Język C dzięki swojej uniwersalności posłużył do celów ogólnych. Posłużył do pisania systemów operacyjnych, swą skuteczność potwierdził i sprawdził się również w przypadku programów nadzorujących maszyny przemysłowe. Język ten jest dużo szybszy od języków interpretowanych oraz tych uruchamianych w maszynach wirtualnych takich jak na przykład Java. Używa się go również do oprogramowania mikro-kontrolerów oraz systemów wbudowanych. Nie nadaje się jednak do wszystkiego na przykład słabo sprawdza się w obliczeniach matematycznych wysokiej precyzji. [1]

Przykładowy prosty program

# include <stdio.h>
int main (void)
{
 printf ("Witaj świecie!”),
 return 0,
}

Zadaniem tego prostego programu jest wypisanie na ekranie napisu "Witaj świecie!”.

Linia 1: Za pomocą dyrektywy #include załączamy standardową bibliotekę C do obsługi strumieni wejścia i wyjścia (ang. Standard Input/Output). Biblioteka ta zawiera definicję funkcji printf pozwalającej wyświetlić napis. Kolejną rzeczą, którą potrzebujemy zrobić to stworzyć główną funkcję main, która jest uruchamiana przy starcie programu. Poza nazwą main funkcja musi również posiadać określony typ danych, który zwraca oraz parametry, które przyjmuje podczas uruchomienia.

Linia 2: Zawiera deklarację funkcji main, która jest typu int (Integer - oznacza liczbę całkowitą). Napis void oznacza brak parametrów przekazywanych podczas wywołania funkcji.

Linia 3 oraz 6: klamry oznaczające początek i koniec bloku instrukcji należących do funkcji main.

Linia 4: Wywołanie funkcji printf przyjmującej jako parametr ciąg znaków "Witaj świecie!”, który wyświetla na standardowym wyjściu. Każda instrukcja w języku C zakończona musi zostać średnikiem.

Linia 5: Polecenie, w którym funkcja zwraca swój wynik. Przyjęło się, że liczba 0 oznacza zakończenie funkcji powodzeniem. Zamiast zera można również użyć EXIT_SUCCESS zdefiniowanego w pliku nagłówkowym stdlib.h.

Składnia i typy danych

Zmienne w języku C definiuje się w następujący sposób:

int x = 5,

Dostępnych jest wiele typów zmiennych, takich jak int dla liczb całkowitych, float dla liczb zmiennoprzecinkowych, enum - typ wyliczeniowy, char przeznaczony do przechowywania pojedynczych znaków. Poza wbudowanymi typami można rozróżnić pochodne typy, na przykład tablice, wskaźniki, unie (union) czy struktury (struct). Komentarze liniowe rozpoczynają się po //, natomiast komentarze blokowe umieszcza się pomiędzy /* oraz */ Ponieważ język C jest strukturalny, programiści mogą używać następujących instrukcji sterujących:

  • if, else
  • pętle while, do..while, for
  • instrukcja switch[2]

Można oczywiście tworzyć swoje własne funkcje. Poniżej przedstawiona jest funkcja, która zwraca podaną wartość przemnożoną razy dwa.

int mnozenie (int x){
return 2*x,
}

Zarządzanie pamięcią

Język C pozwala programiście na dostęp do dowolnego obszaru pamięci poprzez wskaźniki. Jest to duże zagrożenie, przez które szczególnie niedoświadczeni programiści popełniają wiele błędów i powodują błędne działanie programu. Najczęstsze błędy to:

  • niezainicjalizowanie wskaźnika,
  • odczytywanie lub zapisywanie elementów poza zasięgiem tablicy,
  • nieodpowiednie używanie funkcji typu malloc () oraz free (), które pozwalają na dynamiczne alokowanie pamięci

Powyższe działania mogą prowadzić do sytuacji, w której program nadpisze jakiś obszar w pamięci komputera, do której nie powinien mieć dostępu.[3]

Przypisy

  1. King K. N. (2011), Język C: nowoczesne programowanie, Wydawnictwo Helion, Gliwice
  2. Banahan M., Brady D., Doran M. (1991), The C Book wydanie drugie, Wydawnictwo Addison-Wesley
  3. Johnson S. C. (1979), UNIX Programmer’s Manual, AT&T Bell Laboratories, Murray Hill

Bibliografia

  • Hinek J. (2013), Arrays and Pointers, Carleton University, Ottawa
  • Kernighan B., Ritchie D. (2010),Język ANSI C. Programowanie. Wydanie II, Wydawnictwo Helion, Gliwice, ISBN: 978-83-246-2578-9, s. 17-23
  • King K. N. (2011), Język C: nowoczesne programowanie, Wydawnictwo Helion, Gliwice, ISBN: 978-83-246-2805-6
  • Prata S. (2006), Język C. Szkoła programowania. Wydanie V, Wydawnictwo Helion, Gliwice, ISBN: 83-246-0291-7, s. 23-29
  • Reek K. A. (1997), Pointers on C, Wydawnictwo Pearson, Londyn, ISBN: 0673999866
  • Thompson K., A New C Compiler, AT&T Bell Laboratories, Murray Hill, New Jersey
  • Wikibooks, Programowanie w C, Wersja 2.0 z dnia 14 listopada 2010, s. 13-24

Autor: Jarosław Zembal, Arkadiusz Bugajski