C Language Samouczek
Rozpoczęcie pracy z językiem C.
Szukaj…
Uwagi
C jest imperatywnym językiem programowania komputerowego ogólnego przeznaczenia, obsługującym programowanie strukturalne, zakres zmiennej leksykalnej i rekurencję, podczas gdy system typu statycznego zapobiega wielu niezamierzonym operacjom. Z założenia C zapewnia konstrukcje, które skutecznie mapują na typowe instrukcje maszynowe, i dlatego znalazło trwałe zastosowanie w aplikacjach, które wcześniej były kodowane w języku asemblera, w tym w systemach operacyjnych, a także w różnych aplikacjach komputerowych od superkomputerów po systemy wbudowane .
Pomimo niskiego poziomu możliwości język został zaprojektowany, aby zachęcać do programowania na wielu platformach. Zgodny ze standardami i przenośny program C można skompilować dla bardzo szerokiej gamy platform komputerowych i systemów operacyjnych z niewielkimi zmianami w kodzie źródłowym. Język stał się dostępny na bardzo szerokiej gamie platform, od wbudowanych mikrokontrolerów po superkomputery.
C został pierwotnie opracowany przez Dennisa Ritchiego w latach 1969–1973 w Bell Labs i wykorzystany do ponownego wdrożenia systemów operacyjnych Unix . Od tego czasu stał się jednym z najczęściej używanych języków programowania wszechczasów, a kompilatory C od różnych dostawców są dostępne dla większości istniejących architektur komputerowych i systemów operacyjnych.
Wspólne kompilatory
Proces kompilacji programu C różni się w zależności od kompilatora i systemu operacyjnego. Większość systemów operacyjnych jest dostarczana bez kompilatora, więc będziesz musiał go zainstalować. Niektóre popularne opcje kompilatorów to:
- GCC, kolekcja kompilatorów GNU
- clang: front-end dla rodziny C dla LLVM
- Narzędzia do kompilacji MSVC, Microsoft Visual C / C ++
Poniższe dokumenty powinny dać ci dobry przegląd tego, jak zacząć korzystać z kilku najpopularniejszych kompilatorów:
Obsługa wersji kompilatora C.
Zauważ, że kompilatory mają różne poziomy wsparcia dla standardowego C, przy czym wiele wciąż nie obsługuje całkowicie C99. Na przykład, od wydania 2015, MSVC obsługuje wiele C99, ale wciąż ma kilka ważnych wyjątków dla obsługi samego języka (np. <tgmath.h>
przetwarzanie wydaje się niezgodne) i biblioteki C (np. <tgmath.h>
), ani czy koniecznie dokumentują „wybory zależne od implementacji”. Wikipedia ma tabelę pokazującą wsparcie oferowane przez niektóre popularne kompilatory.
Niektóre kompilatory (zwłaszcza GCC) oferowały lub kontynuują oferowanie rozszerzeń kompilatora, które implementują dodatkowe funkcje, które producenci kompilatorów uznają za konieczne, pomocne lub uważające, że mogą stać się częścią przyszłej wersji C, ale które obecnie nie są częścią żadnego standardu C. Ponieważ rozszerzenia te są specyficzne dla kompilatora, można je uznać za niezgodne, a twórcy kompilatorów mogą je usunąć lub zmienić w późniejszych wersjach kompilatora. Korzystanie z takich rozszerzeń może być ogólnie kontrolowane przez flagi kompilatora.
Ponadto wielu programistów ma kompilatory, które obsługują tylko określone wersje C narzucone przez środowisko lub platformę, na którą są kierowane.
Wybierając kompilator, zaleca się wybranie kompilatora, który ma najlepszą obsługę najnowszej wersji C dozwolonej dla środowiska docelowego.
Styl kodu (tutaj nie na temat):
Ponieważ białe znaki są nieznaczne w C (to znaczy nie wpływają na działanie kodu), programiści często używają białych znaków, aby kod był łatwiejszy do odczytania i zrozumienia, nazywa się to stylem kodu . Jest to zbiór zasad i wytycznych używanych podczas pisania kodu źródłowego. Obejmuje takie kwestie, jak sposób wcięcia linii, użycie spacji lub tabulatorów, sposób umieszczenia nawiasów, sposób użycia spacji wokół operatorów i nawiasów, nazwy zmiennych i tak dalej.
Styl kodu nie jest objęty tym standardem i opiera się głównie na opiniach (różni ludzie uważają, że różne style są łatwiejsze do odczytania), dlatego jest ogólnie uznawany za nie na temat w SO. Nadrzędną radą dotyczącą stylu we własnym kodzie jest to, że spójność jest najważniejsza - wybierz lub stwórz styl i trzymaj się go. Wystarczy wyjaśnić, że istnieje wiele nazwanych stylów w powszechnym użyciu, które są często wybierane przez programistów, zamiast tworzenia własnego stylu.
Niektóre popularne style wcięć to: styl K&R, styl Allmana, styl GNU i tak dalej. Niektóre z tych stylów mają różne warianty. Na przykład Allman jest używany jako zwykły Allman lub popularny wariant Allman-8. Informacje na temat niektórych popularnych stylów można znaleźć na Wikipedii . Takie nazwy stylów są zaczerpnięte ze standardów, które autorzy lub organizacje często publikują, do użytku przez wiele osób przyczyniających się do ich kodu, dzięki czemu każdy może łatwo odczytać kod, gdy zna styl, na przykład przewodnik formatowania GNU, który stanowi część dokument standardów kodowania GNU .
Niektóre typowe konwencje nazewnictwa to: UpperCamelCase, lowerCamelCase, lower_case_with_underscore, ALL_CAPS itp. Style te są łączone na różne sposoby w celu użycia z różnymi obiektami i typami (np. Makra często używają stylu ALL_CAPS)
Styl K&R jest ogólnie zalecany do stosowania w dokumentacji SO, podczas gdy bardziej ezoteryczne style, takie jak Pico, są odradzane.
Biblioteki i interfejsy API nieobjęte standardem C (i dlatego są tutaj nie na temat):
Wersje
Wersja | Standard | Data publikacji |
---|---|---|
K&R | nie dotyczy | 1978-02-22 |
C89 | ANSI X3.159-1989 | 1989-12-14 |
C90 | ISO / IEC 9899: 1990 | 1990-12-20 |
C95 | ISO / IEC 9899 / AMD1: 1995 | 1995-03-30 |
C99 | ISO / IEC 9899: 1999 | 1999-12-16 |
C11 | ISO / IEC 9899: 2011 | 15.12.2011 |
Witaj świecie
Aby utworzyć prosty program C, który wypisze na ekranie napis „Hello, World” , użyj edytora tekstu, aby utworzyć nowy plik (np. hello.c
- rozszerzenie pliku musi mieć rozszerzenie .c
) zawierające następujący kod źródłowy:
cześć, c
#include <stdio.h>
int main(void)
{
puts("Hello, World");
return 0;
}
Spójrzmy na ten prosty program wiersz po wierszu
#include <stdio.h>
Ten wiersz mówi kompilatorowi, aby włączył zawartość standardowego pliku nagłówka biblioteki stdio.h
. Nagłówki są zwykle plikami zawierającymi deklaracje funkcji, makra i typy danych, i musisz dołączyć plik nagłówka przed ich użyciem. Ta linia zawiera stdio.h
więc może wywoływać funkcję puts()
.
int main(void)
Ten wiersz rozpoczyna definicję funkcji. Podaje nazwę funkcji ( main
), typ i liczbę argumentów, których oczekuje ( void
, co oznacza brak) oraz typ wartości zwracanej przez tę funkcję ( int
). Wykonywanie programu rozpoczyna się w funkcji main()
.
{
…
}
Nawiasy klamrowe są używane parami, aby wskazać, gdzie zaczyna się i kończy blok kodu. Można ich używać na wiele sposobów, ale w tym przypadku wskazują miejsce rozpoczęcia i zakończenia funkcji.
puts("Hello, World");
Ta linia wywołuje funkcję puts()
celu wypisania tekstu na standardowe wyjście (domyślnie ekran), po której następuje nowa linia. Ciąg wyjściowy jest zawarty w nawiasach.
"Hello, World"
to ciąg znaków, który zostanie zapisany na ekranie. W języku C każda wartość literału ciągu musi znajdować się w podwójnym cudzysłowie "…"
.
W programach C każda instrukcja musi być zakończona średnikiem (tj ;
).
return 0;
Kiedy określona main()
, zadeklarowaliśmy ją jako funkcję zwrócenie int
, co oznacza, że musi wrócić liczbę całkowitą. W tym przykładzie zwracamy wartość całkowitą 0, która jest używana do wskazania, że program zakończył się pomyślnie. Po return 0;
instrukcja, proces wykonywania zostanie zakończony.
Edycja programu
Proste edytory tekstu to vim
lub gedit
w systemie Linux lub Notepad
w systemie Windows. Edytory wieloplatformowe zawierają również Visual Studio Code
lub Sublime Text
.
Edytor musi tworzyć pliki tekstowe, a nie RTF lub inny dowolny format.
Kompilowanie i uruchamianie programu
Aby uruchomić program, ten plik źródłowy ( hello.c
) musi najpierw zostać skompilowany do pliku wykonywalnego (np. hello
w systemie Unix / Linux lub hello.exe
w systemie Windows). Odbywa się to za pomocą kompilatora dla języka C.
Kompiluj za pomocą GCC
GCC (GNU Compiler Collection) to szeroko stosowany kompilator C. Aby z niego skorzystać, otwórz terminal, użyj wiersza polecenia, aby przejść do lokalizacji pliku źródłowego, a następnie uruchom:
gcc hello.c -o hello
Jeśli w kodzie źródłowym ( hello.c
) nie zostaną znalezione żadne błędy, kompilator utworzy plik binarny , którego nazwę podaje argument w opcji wiersza poleceń -o
( hello
). To jest ostateczny plik wykonywalny.
Możemy również użyć opcji ostrzegawczych -Wall -Wextra -Werror
, które pomagają zidentyfikować problemy, które mogą spowodować awarię programu lub spowodować nieoczekiwane wyniki. Nie są one konieczne do tego prostego programu, ale można je dodać w następujący sposób:
gcc -Wall -Wextra -Werror -o hello hello.c
Korzystanie z kompilatora clang
Aby skompilować program za pomocą clang
, możesz użyć:
clang -Wall -Wextra -Werror -o hello hello.c
Z założenia opcje wiersza polecenia clang
są podobne do opcji GCC.
Korzystanie z kompilatora Microsoft C z wiersza polecenia
Jeśli używasz kompilatora Microsoft cl.exe
w systemie Windows, który obsługuje Visual Studio i jeśli wszystkie zmienne środowiskowe są ustawione, ten przykład C można skompilować za pomocą następującego polecenia, które utworzy plik wykonywalny hello.exe
w katalogu, w którym polecenie jest wykonywane (Istnieją opcje ostrzegania, takie jak /W3
dla cl
, z grubsza analogiczne do -Wall
itp. Dla GCC lub clang).
cl hello.c
Wykonywanie programu
Po skompilowaniu plik binarny można następnie ./hello
wpisując ./hello
w terminalu. Po wykonaniu skompilowany program wypisze w wierszu polecenia Hello, World
, a następnie nowy wiersz.
Oryginalne „Witaj, świecie!” w K&R C.
Oto oryginalne „Witaj, świecie!” program z książki The C Programming Language autorstwa Briana Kernighana i Dennisa Ritchiego (Ritchie był oryginalnym twórcą języka programowania C w Bell Labs), zwanym „K&R”:
#include <stdio.h>
main()
{
printf("hello, world\n");
}
Zauważ, że język programowania C nie był ustandaryzowany w momencie pisania pierwszego wydania tej książki (1978) i że ten program prawdopodobnie nie skompiluje się na większości współczesnych kompilatorów, chyba że otrzyma instrukcje, by zaakceptować kod C90.
Ten pierwszy przykład w książce K&R jest obecnie uważany za kiepską jakość, po części dlatego, że brakuje mu wyraźnego typu zwrotu dla main()
a po części dlatego, że brakuje instrukcji return
. Drugie wydanie książki zostało napisane dla starego standardu C89. W C89, typ main
będzie domyślnie int
, a K i Przykład R nie zwraca określonej wartości dla środowiska. W standardach C99 i późniejszych wymagany jest typ zwrotu, ale można bezpiecznie pominąć instrukcję return
main
(i tylko main
), ze względu na specjalny przypadek wprowadzony w C99 5.1.2.2.3 - jest to równoważne zwracaniu 0 , co wskazuje na sukces.
Zalecaną i najbardziej przenośną formą main
dla systemów hostowanych jest int main (void)
gdy program nie używa żadnych argumentów wiersza poleceń, lub int main(int argc, char **argv)
gdy program używa argumentów wiersza poleceń.
C90 §5.1.2.2.3 Zakończenie programu
Powrót z początkowego wywołania do funkcji
main
jest równoważny z wywołaniem funkcjiexit
z wartością zwróconą przez funkcjęmain
jako argument. Jeśli funkcjamain
wykonuje zwrot, który nie określa żadnej wartości, status zakończenia zwracany do środowiska hosta jest niezdefiniowany.
C90 §6.6.6.4 Instrukcja return
Jeśli wykonywana jest instrukcja
return
bez wyrażenia, a wywołujący używa wartości wywołania funkcji, zachowanie jest niezdefiniowane. Dotarcie do}
kończącego funkcję jest równoważne wykonaniu instrukcjireturn
bez wyrażenia.
C99 §5.1.2.2.3 Zakończenie programu
Jeśli typ zwracany przez funkcję
main
jest typem zgodnym zint
, powrót z początkowego wywołania do funkcjimain
jest równoważny z wywołaniem funkcjiexit
z wartością zwróconą przez funkcjęmain
jako argument; osiągnięcie}
które kończy działanie funkcjimain
zwraca wartość 0. Jeśli typ zwracany jest niezgodny zint
, status zakończenia zwracany do środowiska hosta jest nieokreślony.