Dozwolone jest wykonywanie na nich niektórych operacji arytmetycznych. Dowolny wskaźnik można przyrównać do zera (oznaczającego literał pusty, zapisywany też jako Czym różni się handel od inwestowania w 5 minut NULL)78. Porównywanie oraz odejmowanie dwóch wskaźników jest zdefiniowane wyłącznie wtedy, kiedy dotyczą one tej samej tablicy lub – wyłącznie w przypadku porównywania – tego samego obiektu złożonego79. Do wartości wskaźnika można również dodać lub odjąć dowolną liczbę całkowitą. Zabronione jest wykonywanie innych działań, takich jak mnożenie czy dzielenie78. W działaniach arytmetycznych, w których biorą udział liczby całkowite oraz wskaźniki, liczba jest traktowana jako liczba elementów tablicy odpowiedniego typu, a nie liczba bajtówe80.
Służy zarówno do pisania elementów systemów operacyjnych, jak i aplikacji użytkowych. Mimo to spotyka się z krytyką z powodu pewnych decyzji projektowych, takich jak priorytety operatorów lub nadmiernie lakoniczna składnia. Z kolei w PYPL – alternatywnym rankingu popularności języków programowania – liczone łącznie języki C i C++ osiągnęły w czerwcu 2022 piątą lokatę148. Głównym celem, który przyświecał Dennisowi Ritchiemu przy tworzeniu języka C było ułatwienie pisania oprogramowania systemowego.
Zastosowanie ręcznej alokacji pamięci może prowadzić do wystąpienia błędów w kodzie, wynikających np. Z odwołań do wiszących wskaźników(inne języki), ale także przepełnienia bufora i próby powtórnej dealokacji. Obecne w programie podatności mogą zależeć od wykorzystanego algorytmu rezerwacji pamięci120. Istnieje również klasa pamięci _Thread_local, której czas życia jest powiązany z wątkiem. Obiekty zadeklarowane w ten sposób są tworzone w momencie rozpoczęcia wątku.
Około 1977 roku Dennis Ritchie, Ken Thompson i Stephen Johnson skupili się na przenośności oprogramowania napisanego w C4. W tym celu przyjrzeli się często wykorzystywanym konstrukcjom i zachowaniom, które były zależne od architektury komputera. Obiektowi można również nadać klasę extern, która jawnie informuje, że cechuje się on linkowaniem zewnętrznym. Jest to domyślna własność zmiennych deklarowanych na zewnątrz funkcji116. Zmienne statyczne i zewnętrzne są inicjalizowane zerem, jeśli nie podano żadnej wartości początkowej117. Miejscami pozostawiała miejsce do interpretacji szczegółów języka.
Przykładowy program
Edelson podali typową implementację funkcji, zmieniającej małe litery na wielkie. Wykorzystuje ona operacje arytmetyczne na liczbach całkowitych oraz zmiennych typu char, mimo działania – na poziomie koncepcji – wyłącznie w dziedzinie znakowej49. Powszechne wykorzystanie wskaźników, pozwalających na niskopoziomowy dostęp do pamięci jest czynnikiem osłabiającym bezpieczeństwo programów.
Implementacje wspierające wersję C99 powinny ustawić makro __STDC_VERSION__ na 21. Od standardu C99 zdefiniowany jest sposób obsługi liczb zespolonych w języku. Służą do tego typy z określeniami _Imaginary oraz _Complex19, przechowujące – odpowiednio – wartości urojone oraz zespolone. Kwalifikatorów tych można używać jedynie z typami zmiennoprzecinkowymi21. W książce Kernighana i Ritchiego znalazł się również opis biblioteki wejścia/wyjścia.
Składnia
Definiując sposoby zarządzania i synchronizowania wątków oraz wprowadzając typy atomowe (w tym kwalifikator typu _Atomic). Umożliwiono również oznaczenie Zarobki z 14 kwietnia: Morgan Stanley, Wells Fargo i UnitedHealth Group funkcji bez powrotu słowem kluczowym _Noreturn, co pozwala kompilatorom na pewne optymalizacje generowanego kodu22. Zastosowanie języka C pozwoliło części producentów oprogramowania zrezygnować ze stosowania języka asemblera132. Z Oracle Database w 1983 roku, co pozwoliło na osiągnięcie jego przenośności.
- Jego specyfikacja pozwala na rzutowanie typów wskaźnikowych na dowolne inne typy wskaźnikowe.
- Według Stack Overflow Developer Survey 2022, co szósty profesjonalny programista zna język C.
- Przede wszystkim najbardziej podobnym i kompatybilnym jest język C++, który powstawał jako rozszerzenie „C z klasami”150.
- Reprezentacja bitowa wartości, które można zapisać zarówno w wariancie signed, jak i unsigned danego typu jest w obu wariantach taka sama66.
W konsekwencji, Oracle Database 3 stało się pierwszym silnikiem relacyjnych baz danych, który można było uruchomić zarówno na komputerach typu mainframe, minikomputerach jak Adres na konferencji przez Jerome Powell, szef US Federal Reserve Board i komputerach osobistych135. W C został napisany również najpopularniejszy na świecie silnik bazodanowy, SQLite136. Innym rodzajem zmiennych są zmienne statyczne (deklarowane słowem static).
Obiekty
Są one dostępne przez cały czas wykonywania bloku, gdzie zostały zadeklarowanef. W przypadku rekurencyjnego wkroczenia do tego samego bloku, za każdym razem tworzona jest osobna instancja obiektu. Tę klasę pamięci można również określić jawnie słowem kluczowym auto110. Do przechowywania adresu obiektu określonego typu służą wskaźniki77.
Na przykład obiekt typu short nie może być dłuższy niż int, który z kolei musi być niedłuższy od long64. Funkcje w języku C nie mogą być przeciążane50, ale istnieje mechanizm definiowania funkcji o zmiennej liczbie argumentów51. Identyfikatory mogą składać się jedynie z liter, cyfr i znaku podkreślenia, choć cyfra nie może występować na pierwszym miejscu35. Aby zastosować w nazwie znaki spoza tego zbioru, konieczne jest użycie sekwencji ucieczki(inne języki) \uxxxx lub \Uxxxxxxxx (gdzie x to cyfra szesnastkowa)36.
Instrukcje sterujące
Razem z typem int można stosować kwalifikatory short oraz long. Pozwalają one programiście wykorzystywać typy danych krótsze i dłuższe niż naturalne dla danej architektury. Ponadto nazwę każdego typu, służącego do przechowywania liczb całkowitych, można również poprzedzić słowem signed lub unsigned, aby określić, czy dany obiekt ma być w stanie przechowywać liczby ujemne65. Reprezentacja bitowa wartości, które można zapisać zarówno w wariancie signed, jak i unsigned danego typu jest w obu wariantach taka sama66. C++ – język programowania ogólnego przeznaczenia, zaprojektowany przez Bjarne’a Stroustrupa jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych i silną statyczną kontrolę typów. Zachowanie zgodności z językiem C na poziomie kodu źródłowego pozostaje jednym z podstawowych celów projektowych kolejnych standardów języka.
Niezainicjowana zmienna(inne języki) to problem, który dotyczy wielu języków programowania177. Kompilator języka jedynie rezerwuje dla zmiennej obszar w pamięci, a jej wartość jest taka jaka wynika ze stanu bitów, która się w tej pamięci aktualnie znajduje181. Kompilator często ostrzega o próbie dostępu do niezainicjowanej zmiennej182. Standard języka C nie ustala w sposób sztywny zakresów wartości, jakie muszą się zmieścić w obiektach poszczególnych typów. Podobnie nie są określone ich rozmiary w bitach lub bajtach64.
Pierwszym kompilatorem natywnym (produkującym od razu kod asemblerowy) dla języka C++ był g++ z pakietu GCC, pierwszym autorem którego był Michael Tiemann, założyciel Cygnus Solutions. Środowiska wykonawcze dla programów napisanych w innych językach również powstają z wykorzystaniem kodu w C. Java Runtime Environment141, CPythona (referencyjnej implementacji Pythona)142 czy interpretera PHP143. Ponadto C bywa także stosowany jako język pośredni dla kompilatorów języków wyższego poziomu. Niektóre języki wymagają jednak cech, których C nie oferuje, np. Standard języka C definiuje również typy atomowe, choć stanowią one opcjonalną funkcjonalność, która nie musi być obsługiwana przez implementacje90.
Na zmianę wartości zmiennych takich typów w sposób atomowy, tj. Z gwarancją, że operacja nie zostanie przerwana przez inne działanie na tej samej zmiennej91. W języku C istnieje kilka bazowych typów danych, które można dookreślać z użyciem odpowiednich słów kluczowych w celu uzyskania odpowiedniego zakresu wartości. Służą do przechowywania liczb całkowitych (char i int) oraz zmiennoprzecinkowych (float i double)64. XX wieku język C++ zdobył pozycję jednego z najpopularniejszych języków programowania ogólnego przeznaczenia.
Klasy pamięci
Składa się ono z listy stałych symbolicznych, każda o wartości będącej liczbą całkowitą. Typy wyliczeniowe funkcjonalnie są równoważne całkowitoliczbowym7163. Dzięki dyrektywie #pragma możliwe jest przekazywanie instrukcji specyficznych dla kompilatora58b. Zalicza się go do tej grupy dla wygody, choć nie służy do deklarowania pamięci118. Kwalifikatory typów nadają specyficzne znaczenia wyrażeniom, które są l-wartością98.
- Sama składnia deklarowania typów pochodnych również może konfundować.
- Zmienna typu funkcyjnego, jeśli nie jest argumentem operatora pozyskania adresu &, niejawnie przekształca się we wskaźnik do funkcji46.
- Komitet ANSI przygotował opis biblioteki standardowej języka C, wymagający dostarczenia programiście odpowiednich funkcji o ściśle określonym działaniu i przeznaczeniu14.
Mimo to struktura może zawierać wskaźnik na inną strukturę tego samego typu83. Zarówno przypisywanie do zmiennej typu strukturalnego nowej wartości, jak i przekazywanie jej jako argument oraz zwracanie z funkcji są dopuszczalnymi operacjami84. Z niezerowej liczby obiektów tego samego typu można stworzyć tablicę72. Jej elementy są ułożone w pamięci komputera po kolei i bez żadnych przerw73, a dostęp do nich można uzyskać za pomocą składni tablicaindeks, gdzie indeksy rozpoczynają się od zera74d. Do raz utworzonej zmiennej typu tablicowego nie jest możliwe przypisanie innej tablicy76. Kiedy nazwa tablicy zostanie użyta w wyrażeniu, dokonuje się jej niejawna konwersja na wskaźnik do zerowego elementu tablicy.
Biblioteki C++ związane z interfejsami systemów nie są przenośne poza ich obręb, co wynika z faktu, że takie interfejsy są specyficzne dla danego systemu i nie dotyczy to wyłącznie C++. Wielowymiarowe tablice są w rzeczywistości tablicami jednowymiarowymi, co w przeszłości utrudniało pisanie funkcji wykonujących np. Elementów macierzy wykorzystywano pomocniczą tablicę wskaźników do pierwszych elementów każdego wiersza170. Odśmiecania pamięci, ale też stanowi powszechne źródło trudnych do wykrycia błędów w oprogramowaniu167.