Documente Academic
Documente Profesional
Documente Cultură
Exten
sii fiși .c , .h
ere
Parad
Imperativ (procedural), structurat
igmă
Apăru
1972; acum 52 ani[2]
t în
Proiec
Dennis Ritchie
tat de
Tipar
Static, slab, manifest, nominal
e
Imple
mentă
ri GCC, Clang, Intel C, MSVC, Pelles C, Watcom C
major
e
Dialec
Cyclone, Unified Parallel C, Split-C, Cilk, C*
te
Influe
B (BCPL, CPL), ALGOL 68,
nțat [3]
Assembly, PL/I, FORTRAN
de
Siste Multiplatformă
m de
opera
re
Tip
MIM text/plain[5]
E
Preze
nță site web oficial
online
C Programming la Wikibooks
A fost dezvoltat la începutul anilor 1970 de Ken Thompson și Dennis Ritchie, care aveau nevoie
de un limbaj simplu și portabil pentru scrierea nucleului sistemului de operare UNIX.
Sintaxa limbajului C a stat la baza multor limbaje create ulterior și încă populare azi: C+
+, Java, JavaScript, C#, D.[6]
C a fost creat având drept scop important de a face ca programele mari să poată fi scrise mai
ușor și cu mai puține erori în paradigma programării procedurale, dar fără a pune obstacole în
scrierea compilatorului de C, care este încărcat de caracteristicile complexe ale limbajului. C are
urmatoarele caracteristici importante:
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
#include <stdio.h>
int main(void)
Următoarea linie definește funcția numită main . Funcția main are un loc bine stabilit în
programele C. Când un program C este executat, aceasta este prima funcție executată (punctul
de intrare în program). Prezența acesteia este obligatorie pentru ca un program să poată fi
executat. Porțiunea de cod int indică faptul că valoare întoarsă — valoare pe care
funcția main o va întoarce procesului apelant — este un întreg. (void) indică faptul că
funcția main nu primește nici un argument la apelare.
printf("Hello World\n");
Aceasta linie apelează — caută și execută codul — funcția printf , care a fost definită în fișierul
header stdio.h . În cadrul acestui apel, funcției printf îi este pasat (transmis) un singur
argument, șirul de caractere "Hello, World!\n" . Secvența \n este denumită secvență
escape (cu semnificație specială), care se traduce prin caracterul EOL (end-of-line, sfârșitul
liniei), pentru a muta cursorul pe linia următoare. Valoarea de întoarcere a funcției printf este
un întreg int , dar nu este folosită în acest caz (este "ignorată").
return 0;
Această instrucțiune termină execuția codului funcției main și face ca aceasta să întoarcă
valoarea 0 procesului apelant, în cazul acesta sistemului de operare.
C utilizează foarte mult pointerii, un tip de referință foarte simplu, care păstrează adresa unui
obiect din memorie. Adresa poate fi manipulată cu ajutorul aritmeticii pointerilor. În momentul
compilării, un pointer este un tip de dată complex, ce reprezintă atât adresa de memorie cât și
tipul de dată. Acest lucru permite expresiilor ce utilizează pointeri să fie evaluate după tipul de
dată. Pointerii au mai multe utilizări în C. De exemplu, șirurile de caractere (engleză text string)
sunt adesea reprezentate printr-un pointer la un vector de caractere. Alocarea dinamică a
memoriei este realizată tot cu ajutorul pointerilor.
Un pointer null are o valoare rezervată, indicând faptul că face referire la o locație nevalidă. Acest
lucru este folositor în cazuri speciale cum ar fi pointerul next (următorul) în nodul final al unei liste
înlănțuite. Dereferențierea unui pointer null poate cauza un comportament imprevizibil al
aplicației. De asemenea, există și pointeri de tip void , fapt ce indică referirea la un obiect de tip
necunoscut. Acești pointeri sunt foarte folositori în programarea generică. Deoarece dimensiunea
și tipul obiectelor la care acest tip de pointeri face referire sunt necunoscute, aceștia nu pot fi
dereferențiați, dar pot fi convertiți la alt tip de pointeri.
În C, anterior standardului C99, tablourile (vectorii) sunt de dimensiune fixă, statică, cunoscută la
momentul compilării; în practică, acest lucru nu reprezintă o piedică, având în vedere că se pot
aloca blocuri de memorie în momentul rulării, tratându-le ca pe tablouri utilizând librăria standard.
Spre deosebire de multe alte limbaje de programare, C evalueaza numele tablourilor ca și
pointeri: o adresă și un tip de dată. Prin urmare, valorile index pot depăși dimensiunea actuală a
unui tablou.
Acolo unde este posibil, alocarea automată sau statică este preferată deoarece alocarea
memoriei este coordonată de compilator, nemaifiind nevoie ca programatorul să aloce iar apoi să
elibereze memoria - operație ce adesea generează erori. Totuși, multe structuri de date sunt
variabile în dimensini și deoarece alocarea automată și cea statică trebuie să fie de dimensiune
fixă în momentul compilării, sunt multe situații în care alocarea dinamică trebuie folosită. Un
exemplu ar fi tablourile de dimensiuni variabile.
Fiecare fișier sursă conține declarații de variabile și definiții de funcții. Funcțiile, la rândul lor,
conțin alte declarații de variabile și comenzi. Declarațiile de variabile fie definesc noi tipuri
folosind cuvinte cheie precum struct , union și enum sau atribuind un tip de date
predefinite, prin scrierea tipului de dată și urmat de numele variabilei. Cuvinte cheie
precum char , int , precum și pointerul la unul din aceste tipuri * reprezintă tipuri de date
implementate nativ în C. Secțiuni de cod sunt incluse între paranteze acolade ( { și } ),
pentru a indica pentru ce porțiune a codului se aplică declarațiile de variabile și celelalte
structuri de control.
Comenzile execută acțiuni cum ar fi cele de modificare ale valorii unei variabile sau afișarea
unui text la consolă. Structurile de control sunt variabile pentru execuții condiționale sau
iterații, realizate cu ajutorul cuvintelor rezervate if , else , switch , do , while și for .
Salturi arbitrare sunt posibile prin folosirea cuvântului cheie goto . Cu ajutorul unei varietăți
de operatori implementați în C, se pot realiza operații aritmetice, logice, comparative, pe biți,
indexarea tablourilor și atribuiri. Comenzile pot de asemenea apela funcții, incluzând un
număr mare de funcții din bibliotecile standard ale limbajului C, necesare pentru realizarea
diferitelor sarcini cerute de programator.
Sunt multe legende despre originea limbajului C și legătura sa cu sistemul de operare Unix,
cum ar fi:
În primele versiuni C, numai funcțiile care returnau o valoare non-integer trebuiau să fie
definite sau declarate înainte de folosire. Despre o funcție folosită fără ca aceasta să fi fost
declarată în prealabil se presupunea că întoarce un întreg. Parametrii funcțiilor nu erau
verificați după tip, totuși unele compilatoare afișau un mesaj de atenționare dacă o funcție era
apelată cu un număr greșit de argumente.
În 1983, American National Standards Institute (ANSI) a format un comitet, X3J11, pentru a
stabili specificațiile unui limbaj C standard. După un proces îndelungat, standardul a fost
terminat în 1989 și ratificat ca ANSI X3.159-1989 "Programming Language C". Această
versiune a limbajului ne este cunoscută sub numele ANSI C. în 1990, standardul ANSI C (cu
mici modificări) a fost adoptat de International Organization for Standardization (ISO)
ca ISO/IEC 9899:1990.
Una din țintele procesului de standardizare ANSI C a fost acela de a produce un superset al
K&R C, încorporând multe dintre caracteristicile neoficiale introduse secvențial. Totuși,
comitetul pentru standardizare a introdus câteva caracteristici noi, cum ar fi prototipul
funcțiilor (împrumutat din C++) și un preprocesor mult mai capabil.
ANSI C este suportat de marea majoritate a compilatoarelor folosite astăzi. Mare parte din
codul C scris acum este bazat pe ANSI C. Orice program scris exclusiv în standardul C este
garantat să funcționeze corect pe orice platformă cu o implementare C conformă. Totuși,
multe programe sunt scrise astfel încât aceste vor putea fi compilate numai pe anumite
platforme, sau folosind un anumit compilator, deoarece (i) se folosesc biblioteci non-
standard, de exemplu pentru interfața grafică, (ii) unele compilatoare ce nu respectă
standardul ANSI C, deci și urmașii lor în mod implicit sau (iii) bazarea pe dimensiunea unui
anumit tip de date pe anumite platforme.
funcții inline
variablele pot fi declarate oriunde în cadrul unui program (la fel ca și în C++)
câteva noi tipuri de date, incluzând și long long int (pentru a reduce efortul
legat de tranziția de la 32-biți la 64-biți), un tip explicit de date boolean și un tip
complex de date reprezentând numerele complexe
tablourile de dimensiuni variabile
suport pentru comentariile pe o singură linie, marcate la început de // , ca și în
BCPL sau C++ și care au fost suportate de multe compilatoare ca o extensie a
limbajului C
noi funcții, cum ar fi snprintf()
noi fișiere header, cum ar fi stdint.h
În ceea ce privește interesul în adoptarea noului standard C99, dacă GCC și alte
compilatoare suportă noile caracteristici C99, compilatoarele celor de la Microsoft și Borland
nu suportă C99 și cele două companii nu par interesate în a oferi nici un fel de suport.
while(<cond>)
while(<cond>) Repetă cat timp <cond> adevărat
do
i:=i+1 sau
i++; Incrementare
inc(i);
i:=i-1 i--; Decrementare
var i: integer int i; Declarare variabilă (în C++ și C99 se poate declara
oriunde în program/funcție)
Bjarne Stroustrup, creatorul limbajului C++, a sugerat de nenumărate ori [2] să se reducă
incompatibilitățile pe cât de mult posibil pentru a maximiza interoperabilitatea dintre cele două
limbaje de programare. Unii au argumentat că C și C++ sunt două limbaje de programare
distincte, compatibilitatea dintre ele fiind utilă dar nu vitală; potrivit acestei opinii, eforturile de
a reduce incompatibilitatea nu trebuie să reducă eforturile de a aduce elemente noi în mod
independent celor două limbaje de programare.
C99 a adoptat unele funcționalități ce au apărut inițial în C++. Printre acestea se enumeră:
Pascal:
program test;
var i:integer;
begin
writeln('introduceti un nr:');
read(i); //citire număr introdus de la tastatură
writeln(i); //afișare număr citit
end.
C: