Învățarea C Un primer

Este posibil să fi auzit că trebuie să fiți familiarizați cu obiectivul C dacă intenționați să dezvoltați aplicații iOS. Deși obiectivul C este într-adevăr o componentă importantă a dezvoltării iOS, oamenii tind să uite că obiectivul C este o suprasetare strictă a lui C. Cu alte cuvinte, este important să fiți familiarizați cu fundamentele lui C ca dezvoltator de iOS. Nu vă faceți griji, totuși. Dacă știți deja elementele de bază ale programării, C nu va fi prea dificil de preluat.

Cerințe preliminare

Nu este posibilă acoperirea programelor de bază și învățarea C într-un singur articol. Prin urmare, presupun că aveți deja o experiență de programare. Ruby, PHP sau JavaScript sunt puncte de plecare bune pentru învățarea C și Obiectiv-C, deci dacă veniți dintr-un mediu de dezvoltare web, nu ar trebui să aveți probleme de a învăța elementele de bază ale lui C prin citirea acestui articol.

În acest articol, mă voi concentra asupra a ceea ce face C unic sau diferit de alte limbi de programare. Aceasta înseamnă că nu voi acoperi conceptele de bază de programare și modelele, cum ar fi variabilele și buclele. Ceea ce voi acoperi este cum sunt declarate variabilele în C și ce indicatori sunt. Cu alte cuvinte, accentul se pune pe lucrurile pe care trebuie să le cunoașteți pentru a vă familiariza cu C.

Introducere

Dennis Ritchie a început să dezvolte C la sfârșitul anilor 1960, în timp ce lucra la AT & T Bell Labs. Datorită utilizării pe scară largă și a simplității designului, C poate fi utilizat pe aproape orice platformă. Nu este legat de niciun sistem de operare sau platformă. Dacă ați explorat alte limbi de programare, atunci este posibil să fi observat că aceștia împărtășesc o mulțime de asemănări. Multe limbi au fost inspirate de C, cum ar fi C #, Java, PHP și Python.

Dennis Ritchie și-a numit noua limbă C pentru că a inspirat o limbă anterioară dezvoltată de Ken Thompson numită B. În ciuda faptului că C este inspirat de limbile fără tip (BCPL lui Martin Richards și B, Ken Thompson), C este un limbaj scris. Voi încerca să scriu mai detaliat mai târziu în acest articol.

Nu durează mult să înveți elementele de bază ale lui C, deoarece este o limbă destul de mică, cu doar un set mic de cuvinte cheie. Ați putea spune că C este oase foarte goale și oferă doar ceea ce este cu adevărat necesar. Alte funcționalități, cum ar fi operațiile de intrare / ieșire, sunt delegate bibliotecilor. Colectarea de gunoi și de gunoi lipsesc în C și este posibilă doar o formă de bază a modularității. Cu toate acestea, dimensiunea redusă a limbajului are avantajul că poate fi învățată rapid.

În ciuda faptului că C este un limbaj de nivel scăzut, nu este dificil de învățat sau de utilizat. Mulți dezvoltatori iOS și Mac au devenit atât de obișnuiți cu obiectivul C și cu designul orientat pe obiecte, încât îi este teamă să încerce să lucreze cu biblioteci C sau C "drept". Obiectivul C este o suprasetare strictă a lui C și nimic mai mult decât un strat deasupra lui C.

Practica este perfectă

Un limbaj de programare este cel mai bine învățat prin practicare, așa că să creăm un nou proiect în Xcode și să scriem câteva linii de C pentru a cunoaște limba. Lansați Xcode și creați un nou proiect selectând Nou> Proiect ... de la Fişier meniul.

Nu vom crea o aplicație iOS, așa cum am făcut-o mai devreme în această serie. În schimb, vom crea un OS X proiect. Selectați cerere în secțiunea etichetă OS X și alegeți Instrumentul pentru linia de comandă formați lista de șabloane din dreapta. Apasă pe Următor → pentru a continua.

Denumiți proiectul C Primer și să îi oferim un nume de organizație și un identificator al companiei după cum am văzut anterior. Seteaza Tip meniul derulant C. Singura opțiune de configurare care contează cu adevărat pentru acest tutorial este tipul. Nu vă faceți griji cu privire la celelalte opțiuni pentru moment. Apasă pe Următor → pentru a continua.

Spuneți Xcode unde doriți să salvați noul proiect Xcode. Nu este necesar să creați un depozit git pentru acest proiect. Vom folosi acest proiect numai pentru a învăța C în loc de a crea un instrument util de linie de comandă.

rezumatul proiectului

În comparație cu aplicația iOS pe care am creat-o mai devreme în această serie, acest proiect este surprinzător de minim. De fapt, acesta conține doar două fișiere sursă, main.c și C_Primer.1. În scopul învățării C, numai main.c este de interes pentru noi. Extensia fișierului, .c, indică faptul că este un fișier sursă C.

Înainte de a construi și a rula instrumentul liniei de comandă, să aruncăm o privire asupra conținutului main.c. În afară de câteva comentarii din partea de sus a fișierului și o funcție numită principal în partea de jos, fișierul sursă nu conține mult. Fișierul conține, de asemenea, un include afirmația că voi vorbi despre ceva mai târziu în acest articol.

// // main.c // C Primer // // Creat de Bart Jacobs pe 15/02/14. // Drepturi de autor (c) 2014 Tuts +. Toate drepturile rezervate. // #include  int main (int argc, const char * argv []) // introduceți codul aici ... printf ("Hello, World! \ n"); retur 0; 

O privire mai atentă la principal funcția dezvăluie câteva caracteristici interesante ale limbajului de programare C. Am menționat mai devreme că C este un limbaj scris, ceea ce înseamnă că variabilele și funcțiile sunt tipărite. Punerea în aplicare a directivei principal funcția începe prin specificarea tipului de returnare a funcției, an int. De asemenea, rețineți că argumentele funcției sunt tipărite. Cuvântul cheie funcţie, care este comun în multe alte limbi, este absent în C.

Corpul principal funcția începe cu un comentariu (comentariile cu o singură linie încep cu //). A doua linie a corpului funcției este o altă funcție, care face parte din biblioteca standard C, prin urmare #include declarație în partea de sus a dosarului. printf funcția trimite ieșirea la ieșirea standard, "Bună ziua, lumea! \ N", în acest caz. \ n specifică o nouă linie. În Xcode, totuși, ieșirea este redirecționată către Consola Xcode, pe care o voi vorbi mai mult într-un pic.

principal funcția se termină prin întoarcere 0. Când se întoarce un program 0, înseamnă că a încetat cu succes. Asta este tot ce se întâmplă în principal funcţie. Nu te superi argumentele principal deoarece acest lucru depășește scopul acestui tutorial.

Construiți și executați

Acum că știm ce principal funcția face, este timpul să construiți și să executați instrumentul liniei de comandă. Prin construirea aplicației, codul din main.c este compilat într-un binar, care este apoi executat. Construiți și executați instrumentul liniei de comandă făcând clic pe butonul triunghiular de redare din partea stângă sus a ferestrei.

Dacă totul a mers bine, Xcode ar trebui să afișeze zona de depanare din partea de jos a ferestrei. Puteți afișa și ascunde zona de depanare făcând clic pe butonul din mijloc Vedere controlați în bara de instrumente din partea dreaptă sus.

Zona de depanare are două secțiuni. În stânga este variabile fereastră și în partea dreaptă este Consolă fereastră. În Consola, ar trebui să vedeți cuvintele Salut Lume!. De asemenea, Xcode vă spune că programul sa încheiat cu codul de ieșire 0, ceea ce înseamnă că programul sa încheiat normal.

Pe scurt

În restul acestui articol, voi acoperi cele mai importante caracteristici ale programului C. Ceea ce este acoperit în acest tutorial este limitat la ceea ce trebuie să știți pentru a începe să dezvoltați iOS. În următorul articol din această serie, voi acoperi obiectivul C.

În contrast cu limbile interpretate, cum ar fi Ruby, PHP și JavaScript, C este un limbaj compilat. Codul sursă al unui program scris într-o limbă compilată este compilat pentru prima dată într-un binar specific pentru mașina pe care a fost compilată. Procesul de compilare reduce codul sursă la instrucțiuni care pot fi înțelese de aparatul pe care rulează. Acest lucru înseamnă, de asemenea, că nu se garantează că o aplicație compilată pe o singură mașină rulează pe o altă mașină.

Este de la sine înțeles că programele scrise în limbi interpretate trebuie, de asemenea, să fie reduse la instrucțiunile pe care mașina țintă le poate înțelege. Acest proces, totuși, are loc în timpul execuției. Rezultatul este că, în general, programele scrise într-un limbaj compilat sunt mai rapide atunci când sunt executate decât cele scrise într-o limbă interpretată.

Tipuri de date

O altă diferență importantă cu limbile precum PHP, Ruby și JavaScript este că C este un limbaj scris. Ce înseamnă acest lucru este faptul că tipul de date pe care o variabilă îl poate conține trebuie specificat în mod explicit. În C, tipurile de date fundamentale sunt caracterele (carboniza), întregi (int) și numere în virgulă mobilă (pluti). Din aceste tipuri fundamentale, sunt derivate o serie de tipuri suplimentare, cum ar fi dubla (număr de punct floating cu dublă precizie), lung (întregul care poate conține valori mai mari) și nesemnat (număr întreg care poate conține numai valori pozitive și, prin urmare, valori mai mari). Pentru o listă completă a tipurilor de date C de bază, vă recomand să aruncați o privire la pagina Wikipedia despre tipurile de date C.

Ați observat că șirurile nu au fost menționate în lista tipurilor de date C de bază? Un șir C este stocat ca o matrice de caractere. Un caracter poate stoca un caracter ASCII, ceea ce înseamnă că o serie de caractere poate stoca un șir. Uitați-vă la următorul exemplu pentru a vedea ce înseamnă acest lucru în practică. Parantezele pătrate imediat după numele variabilei indică faptul că avem de-a face cu o serie de caractere. Un șir C este terminat cu zero, ceea ce înseamnă că ultimul caracter este 0.

char primaName [] = "Bart";

Să explorăm mai multe detalii prin compararea a două fragmente de cod. Primul fragment de cod este scris în JavaScript, în timp ce al doilea fragment este scris în C. În JavaScript, o variabilă este în general declarată cu var cuvinte cheie. C nu are un cuvânt cheie care să declare variabilele. În schimb, o variabilă în C este declarată prin prefixarea variabilei cu un tip de date, cum ar fi int sau carboniza.

var a = 5; var b = 13,456; var c = "a";
int a = 5; float b = 13,456; char c = "a";

Să introducem câteva variabile în principal funcție pe care am văzut-o mai devreme. Modificați corpul principal pentru a arăta ca fragmentul de cod de mai jos. Pentru a imprima variabilele utilizând printf funcția pe care o folosim formatori de format. Pentru o listă mai completă a specificatorilor de format disponibile, accesați acest link.

int main (int argc, const char * argv []) // introduceți codul aici ... printf ("Hello, World! \ n"); // Variabile int a = 5; float b = 6,3; char c = "r"; printf ("acesta este un int:% i \ n", a); printf ("acesta este un float:% f \ n", b); printf ("acesta este un caracter:% c \ n", c); retur 0; 

După cum am văzut mai devreme, în C, tastarea nu se limitează la variabile. Funcțiile trebuie, de asemenea, să specifice tipul pe care îl returnează, precum și tipul argumentelor pe care le acceptă. Să vedem cum funcționează acest lucru.

funcţii

Presupun că deja cunoașteți funcțiile. Ca și în alte limbi, o funcție C este un bloc de cod care efectuează o anumită sarcină. Să facem main.c mai interesant prin introducerea unei funcții. Inainte de principal , am adăugat un prototip de funcție. Acesta îi spune compilatorului despre funcție, tipul de retur și argumentele pe care le acceptă. La fundul main.c, vom introduce implementarea funcției. Toată funcția face este multiplica argumentul care este transmis funcției cu cinci și returnează rezultatul.

#include  int multiplyByFive (int a); // Funcția Prototype int principal (int argc, const char * argv []) // introduceți codul aici ... printf ("Hello, World! \ N"); // Variabile int a = 5; float b = 6,3; char c = "r"; printf ("acesta este un int>% i \ n", a); printf ("acesta este un float>% f \ n", b); printf ("acesta este un caracter>% c \ n", c); // Funcții printf ("Cinci multiplicat cu cinci este% i \ n", multiplyByFive (5)); retur 0;  int multiplyByFive (int a) returnați * 5; 

De asemenea, am actualizat principal funcția prin invocarea multiplyByFive funcţie. Rețineți că un prototip de funcție nu este strict necesar, cu condiția ca implementarea funcției să fie plasată înainte de a fi solicitată pentru prima dată. Cu toate acestea, utilizarea prototipurilor de funcții este utilă, deoarece permite dezvoltatorilor să răspândească codul sursă pe mai multe fișiere, menținând astfel un proiect organizat.

Dacă o funcție nu returnează o valoare, atunci tipul de returnare este declarat ca vid. În esență, aceasta înseamnă că nici o valoare nu este returnată de funcție. Uitați-vă la următorul exemplu. Rețineți că funcția nu acceptă argumente. Parantezele după numele unei funcții sunt necesare chiar dacă funcția nu acceptă argumente.

// Funcția Prototype void helloWorld (); // Implementarea funcției void helloWorld () printf ("Bună ziua, lume! \ N"); 

Înainte de a merge mai departe, vreau să menționez că limba C nu are a funcţie cuvânt cheie pentru declararea unei funcții ca în JavaScript sau PHP. Parantezele după numele funcției indică faptul că Salut Lume este o funcție. Același lucru este valabil și pentru variabilele pe care le-am menționat mai devreme. Prin prefixarea unui nume de variabilă cu un tip, compilatorul știe că este declarată o variabilă.

S-ar putea să te întrebi ce beneficii sunt de un limbaj scris, cum ar fi C. Pentru programatori care provin de la Ruby sau PHP, învățarea unei limbi tipărite ar putea fi confuză la început. Principalul avantaj al tastării este că sunteți obligat să fiți explicit în ceea ce privește comportamentul programului. Eroarea de captură în timpul compilării este un avantaj major, așa cum vom vedea mai târziu în această serie. Chiar dacă C este un limbaj scris, nu este un limbaj puternic tipărit. Majoritatea compilatoarelor C oferă conversii implicite (de ex carboniza care este convertit la un int).

structuri

Ce este o structură? Permiteți-mi să citez pe Kernighan și pe Ritchie. O structură este o colecție de una sau mai multe variabile, posibil de diferite tipuri, grupate împreună sub un singur nume pentru manipulare convenabilă. Să examinăm un exemplu pentru a vedea cum funcționează structurile. Adăugați următorul fragment de cod chiar înainte de principal funcţia lui întoarcere afirmație.

// Structures struct Album int year; int piese; ; struct Album myAlbum; struct Album yourAlbum; myAlbum.year = 1998; myAlbum.tracks = 20; yourAlbum.year = 2001; yourAlbum.tracks = 18; printf ("Albumul meu a fost lansat în% i și a avut% i piese. \ n", myAlbum.year, myAlbum.tracks); printf ("Albumul tău a fost lansat în% i și avea% i piese. \ n", Albumul tău, Albumul tău);

Începem prin a declara un nou tip de structură și îi dăm un nume de Album. După declararea tipului nou, îl folosim specificând că variabila pe care urmează să o declaram este structură și specificăm numele structului, Album. Punctul notar este folosit pentru a atribui valori și pentru a citi valorile din variabilele pe care structul le deține.

pointeri

Pointerii sunt adesea un pic de piatră de poticnire pentru cei care doresc să învețe C. Definirea unui pointer este însă foarte simplă. Un pointer este o variabilă care conține o adresă de memorie. Rețineți că un indicator este doar un alt tip de date C. Indicatorii sunt cel mai bine înțeleși cu un exemplu. Lipiți următorul cod imediat înainte de întoarcere declarație a principal funcţie.

// Indicatori int d = 5; int * e = & d; printf ("d are o valoare de% i \ n", d); printf ("e are valoarea% p \ n", e); printf ("obiectul care indică la o valoare de% i \ n", * e);

Începem prin a declara un int și atribuirea unei valori. În următoarea linie, declarăm un pointer la int numit e prin prefixarea numelui variabilei cu un asterisc. Ampersandul înaintea variabilei d este un operator unar (un nume fantezist pentru un operator care are un operand) care este cunoscut ca adresa operatorului. Cu alte cuvinte, prin prefixarea variabilei d cu un ampersand, cu pointerul nostru e este dat nu valoarea lui d, dar adresa în memorie în cazul în care valoarea d este depozitat. Amintiți-vă definiția unui pointer, este o variabilă care conține adresa unei variabile.

Declarațiile de imprimare după declarațiile de variabile vor face acest exemplu mai clar. Construiți și executați exemplul și inspectați ieșirea din consola. Valoarea a d este 5 așa cum ne așteptăm. A doua declarație de imprimare ar putea să te surprindă. A indicat indicatorul e conține o adresă de memorie, locul în memorie unde valoarea d este depozitat. În declarația finală, folosim un alt operator unar, operatorul de dereferențiere sau indirecția. Ceea ce face acest operator este accesarea obiectului care este stocat în locația în care indicatorul indică. Cu alte cuvinte, folosind operatorul de dereferencing vom recupera valoarea lui d.

Rețineți că atunci când o variabilă este declarată în limba de programare C, este alocat un bloc de memorie pentru acea variabilă. Un indicator indică doar acel bloc de memorie. Cu alte cuvinte, ea deține o referință la variabila care este stocată în blocul de memorie. Asigurați-vă că ați înțeles conceptul de pointeri înainte de a trece la următorul articol în care ne uităm la Obiectiv-C. Indicatorii sunt folosiți tot timpul când lucrați cu obiecte.

Nu vă faceți griji dacă indicatorii nu au sens imediat după citirea acestui articol. Este nevoie de ceva timp pentru a înțelege cu adevărat conceptul. Există un post excelent scris de Peter Hosey că nu pot să recomand suficient.

Minte Semicolonul

Se pare că punct și virgulă nu mai sunt șold. Ruby nu iubește punct și virgulă iar noul copil răcoros din oraș, CoffeeScript, nu le place nici ele. În C și Obiectiv-C, la sfârșitul fiecărei instrucțiuni sunt necesare punct și virgulă. Compilatorul nu este foarte iertător, după cum probabil ați observat.

Concluzie

Există mai multe limbi de programare C decât cele pe care le-am abordat în acest articol. În următorul articol, cu toate acestea, voi vorbi despre obiectivul C și vă va îmbunătăți treptat înțelegerea lui C. Odată ce vom începe să lucrăm cu SDK-ul iOS, sunt sigur că veți fi încurcați să lucrați cu obiecte și indicii în nu este timp.

Cod