Home » Articole » Articole » Calculatoare » Programare » C » Particularitățile limbajului de programare C

Particularitățile limbajului de programare C

postat în: C 0

C este un limbaj eficient, minimalist, care are unele particularități de care un programator trebuie să fie conștient. Pentru a aborda acestea, uneori o soluție bună este să combinați un alt limbaj cu C pentru un plus de flexibilitate și putere, cum ar fi combinația Emacs-LISP și C utilizate pentru Emacs. Uneori, acestea pot fi abordate cu prețul unei viteze mai lente și al unei complexități crescute prin utilizarea unor constructe speciale care vor garanta funcționarea și securitatea. În mare parte însă, prin practică, programatorii C nu au probleme cu lucrurile menționate aici și preferă să folosească un limbaj care modelează îndeaproape scopul general, arhitectura hardware Von Neumann.

Mai jos sunt câteva dintre aceste particularități ale ANSI C (care uneori sunt și punctele sale forte), unele minore și altele majore:

Lipsa de diferențiere între matrice și pointeri

  • Primul C (în jurul anului 1973) nu avea deloc matrice; implementările moderne sunt zone contigue din memorie accesate cu aritmetica pointerului (notă: o matrice declarată nu poate fi atribuită ca un pointer), ceea ce eludează necesitatea de a declara matrice cu o dimensiune fixă. Această capacitate, totuși, poate provoca erori de depășire a tamponului cu o utilizare neglijentă.

Matricele nu își stochează lungimea

  • O consecință a caracteristicii de mai sus. Aceasta înseamnă că programul ar putea avea nevoie să efectueze în mod explicit o verificare a limitelor înainte de a accesa o matrice. Cu excepția cazului în care unei funcții i se transmite o matrice de dimensiune fixă, nu există nicio modalitate prin care aceasta să descopere lungimea matricei care i-a fost dată: Deci, funcției trebuie să i se dea lungimea, poate să fie transmisă funcției ca o variabilă separată sau într-o structura. Din acest motiv, majoritatea implementărilor nu oferă verificarea automată a limitelor matricei, iar verificarea manuală a limitelor este predispusă la erori.
  • Dacă un program C (sau C++) încearcă să acceseze un element de matrice în afara memoriei alocate efective, atunci are loc o depășire a memoriei tampon, de obicei blocând programul. De asemenea, erorile de depășire a tamponului sunt o vulnerabilitate comună de securitate. Multe alte limbaje de computer oferă verificarea automată a limitelor și, prin urmare, sunt aproape imune la astfel de erori. [1][2][3][4][5]

Matrice de lungime variabilă

  • O VLA ‒ matrice de lungime variabilă (Variable Length Arrays) ‒ poate fi utilizată numai pentru parametrii funcției și variabilele automate. VLA-urile nu pot fi utilizate în interiorul unei structuri (cu excepția ultimului element din structură). Nu este posibil să se definească o structură care să corespundă definiției standard a dicționarului Forth (care are 2 părți cu lungime variabilă), decât ca o matrice nediferențiată de caractere.

Matricele 2D sau 3D încorporate de dimensiuni arbitrare nu sunt acceptate pe scară largă

  • Această caracteristică a fost adăugată începând cu specificația C99 pentru matrice de lungime variabilă, deși multe compilatoare C încă nu o acceptă. Fără VLA, nu există nicio modalitate ca o funcție să accepte matrice 2D sau 3D de dimensiuni arbitrare. În special, este imposibil să definiți o funcție care acceptă int a[5][4][3]; la un apel, iar mai târziu acceptă int b[10][10][10]; într-un apel ulterior. În loc să folosească tipul de date matrice 2D sau 3D încorporat, programatorii C folosesc un alt tip de date pentru a păstra matrice 2D sau 3D (matematice) de dimensiuni arbitrare (matrice multidimensionale) – vezi Practici comune#Matrici multidimensionale dinamice pentru detalii.

Niciun tip de date șir formal

  • Șirurile sunt matrice de caractere (lipsind orice abstracție) și moștenesc toate constrângerile lor (structurile pot oferi o abstracție, într-o anumită măsură).

Siguranță de tip slab

  • C nu este foarte sigur de tip. Funcțiile de gestionare a memoriei funcționează pe pointeri netipați, nu există nicio aplicare încorporată a tipului la timp de execuție, iar sistemul de tip poate fi ocolit cu pointeri. În plus, typedef nu creează un tip nou, ci doar un alias, astfel că servește doar pentru lizibilitatea codului. Cu toate acestea, este posibil să se utilizeze structuri cu un singur membru pentru a impune siguranța tipului.

Fără colectare de gunoi

  • Fiind un limbaj de nivel mic, conceput pentru o suprasolicitare minimă, C are doar gestionarea manuală a memoriei, ceea ce poate permite scurgerii simple de memorie să continue neverificate.

Variabilele locale sunt neinițializate la declarare

  • Variabilele locale (dar nu globale) trebuie inițializate manual; înainte de aceasta, ele conțin tot ceea ce era deja în memorie la momentul respectiv. Acest lucru nu este neobișnuit, dar standardul C nu interzice accesul la variabilele neinițializate (ceea ce este neobișnuit).

Sintaxă greoaie de indicator al funcției

  • Indicatorii de funcție iau forma [return type] [name]([arg1
    type])([arg2 type])
    , ceea ce le face oarecum dificil de utilizat. Typedef-urile pot ușura această sintaxă împovărătoare. De exemplu,
    typedef int fn(int i);
    . Vezi Pointeri și matrice#Pointeri către funcții pentru mai multe detalii.

Fără reflexie

  • Nu este posibil ca un program C – în timpul rulării – să evalueze un șir ca și cum ar fi o instrucțiune de cod sursă C.

Funcțiile imbricate nu sunt standard

  • Cu toate acestea, multe compilatoare C acceptă funcții imbricate, inclusiv GNU C.[6]

Nicio gestionare formală a excepțiilor

  • Unele funcții standard returnează valori speciale care trebuie gestionate manual. De exemplu, malloc() returnează null la eșec. De exemplu, trebuie să stochezi valoarea returnată a lui
    getchar()
    într-un int (nu, așa cum s-ar putea aștepta, într-un char) pentru a detecta în mod fiabil sfârșitul fișierului – vezi Fișier I/O#Capcana EOF. Programele care nu includ gestionarea adecvată a erorilor pot funcționa bine de cele mai multe ori, dar se pot bloca sau se pot defecta în alt mod atunci când apar cazuri excepționale. Sistemele POSIX folosesc adesea signal() pentru a gestiona unele tipuri de excepții. (Consultați Gestionarea erorilor#Semnale pentru detalii). Unele programe folosesc setjmp(), longjmp() sau goto pentru a gestiona manual unele tipuri de excepții. (Consultați Control#Un ultim lucru: goto și Coroutine pentru detalii).

Nu există definiții ale funcției anonime

Referințe

(Include texte traduse și adaptate din Wikibooks de Nicolae Sfetcu)

Rolul social media în democrație, noul management public, și guvernanța electronică
Rolul social media în democrație, noul management public, și guvernanța electronică

În peisajul contemporan al administrației publice, au avut loc schimbări semnificative, determinate de nevoia de eficiență, transparență și implicarea sporită a cetățenilor . Trei concepte esențiale încapsulează aceste schimbări: noul management public, guvernanța electronică, și rolul omniprezent al rețelelor sociale. … Citeşte mai mult

Nu a fost votat 9.51 lei20.94 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Ghidul Google SEO
Ghidul Google SEO

Ghidul de iniţiere Google privind optimizarea pentru motoarele de căutare, Versiunea 1.1, 13 noiembrie 2008 Acest document a fost lansat iniţial ca un efort pentru a ajuta echipele Google, însă este la fel de util şi pentru webmasterii începători în … Citeşte mai mult

Nu a fost votat 0.00 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *