Apprendimento C A Primer

Potresti aver sentito che è necessario avere familiarità con Objective-C se si prevede di sviluppare applicazioni iOS. Mentre Objective-C è davvero una componente importante dello sviluppo di iOS, le persone tendono a dimenticare che Objective-C è un superset di C. rigoroso. In altre parole, è anche importante avere familiarità con i fondamenti di C come sviluppatore iOS. Non preoccuparti però. Se conosci già le basi della programmazione, C non sarà troppo difficile da raccogliere.

Prerequisiti

Non è possibile coprire le basi della programmazione e imparare C in un articolo. Pertanto presumo che tu abbia già un'esperienza di programmazione. Ruby, PHP o JavaScript sono buoni punti di partenza per l'apprendimento di C e Objective-C, quindi se vieni da uno sfondo di sviluppo web non dovresti avere problemi a imparare le basi di C leggendo questo articolo.

In questo articolo, mi concentrerò su ciò che rende C univoco o diverso da altri linguaggi di programmazione. Ciò significa che non tratterò concetti e schemi di programmazione di base, come variabili e cicli. Quello che tratterò è come vengono dichiarate le variabili in C e quali sono i puntatori. In altre parole, l'attenzione si concentra sulle cose che devi conoscere per familiarizzare con C.

introduzione

Dennis Ritchie ha iniziato a sviluppare C alla fine degli anni '60 mentre lavorava presso AT & T Bell Labs. Grazie al suo uso diffuso e alla sua semplicità di design, C può essere utilizzato su quasi tutte le piattaforme. Non è legato a nessun sistema operativo o piattaforma. Se hai esplorato altri linguaggi di programmazione, potresti aver notato che condividono molte somiglianze. Molte lingue sono state ispirate da C, come C #, Java, PHP e Python.

Dennis Ritchie ha chiamato il suo nuovo linguaggio C perché ha tratto ispirazione da un linguaggio precedente sviluppato da Ken Thompson chiamato B. Nonostante il fatto che C sia ispirato da linguaggi senza scrittura (BC Martin di Martin Richards e Ken Thompson B), C è un linguaggio tipizzato. Tratterò la digitazione più in dettaglio più avanti in questo articolo.

Non ci vuole molto per imparare le basi di C, perché è un linguaggio abbastanza piccolo con solo un piccolo insieme di parole chiave. Si potrebbe dire che C è ossa molto nude e offre solo ciò che è veramente necessario. Altre funzionalità, come le operazioni di input / output, sono delegate alle librerie. La raccolta dell'heap e dei rifiuti è assente in C e solo una forma base di modularità è possibile. Tuttavia, la piccola dimensione della lingua ha il vantaggio che può essere appresa rapidamente.

Nonostante il fatto che C sia un linguaggio di basso livello, non è difficile da imparare o da usare. Molti sviluppatori iOS e Mac sono diventati così abituati a Objective-C e alla sua progettazione orientata agli oggetti che hanno paura di provare a lavorare con librerie C o C "dirette". Objective-C è un superset rigido di C e nient'altro che uno strato sopra C.

La pratica rende perfetti

Un linguaggio di programmazione è meglio apprendere praticando, quindi creiamo un nuovo progetto in Xcode e scriviamo alcune righe di C per conoscere la lingua. Avvia Xcode e crea un nuovo progetto selezionando Nuovo> Progetto ... dal File menu.

Non creeremo un'applicazione iOS come abbiamo fatto in precedenza in questa serie. Invece, creeremo un OS X progetto. Selezionare Applicazione nella sezione etichettata OS X e scegliere Strumento da riga di comando forma l'elenco di modelli sulla destra. Clicca il Il prossimo pulsante per continuare.

Dai un nome al tuo progetto C Primer e dargli un nome e un identificativo aziendale come abbiamo visto in precedenza. Impostare il genere menu a discesa a C. L'unica opzione di configurazione che conta davvero per questo tutorial è il tipo. Non preoccuparti per le altre opzioni per ora. Clicca il Il prossimo pulsante per continuare.

Dillo a Xcode dove vuoi salvare il nuovo progetto Xcode. Non è necessario creare un repository git per questo progetto. Utilizzeremo questo progetto solo per l'apprendimento di C invece di creare un utile strumento a riga di comando.

Panoramica del progetto

Rispetto all'applicazione iOS creata in precedenza in questa serie, questo progetto è sorprendentemente minimo. Infatti, contiene solo due file sorgente, main.c e C_Primer.1. Ai fini dell'apprendimento di C, solo main.c è di interesse per noi. L'estensione del file, .c, indica che si tratta di un file sorgente C.

Prima di creare ed eseguire lo strumento da riga di comando, diamo un'occhiata al contenuto di main.c. Oltre ad alcuni commenti nella parte superiore del file e una funzione denominata principale in basso, il file sorgente non contiene molto. Il file contiene anche un includere dichiarazione di cui parlerò un po 'più avanti in questo articolo.

// // main.c // C Primer // // Creato da Bart Jacobs il 15/02/14. // Copyright (c) 2014 Tuts +. Tutti i diritti riservati. // #includere  int main (int argc, const char * argv []) // inserisci qui il codice ... printf ("Hello, World! \ n"); ritorno 0; 

Uno sguardo più da vicino al principale la funzione rivela alcune caratteristiche interessanti del linguaggio di programmazione C. Ho detto prima che C è un linguaggio tipizzato, il che significa che le variabili e le funzioni sono state digitate. L'implementazione del principale la funzione inizia specificando il tipo di ritorno della funzione, a int. Si noti inoltre che gli argomenti della funzione sono stati digitati. La parola chiave funzione, che è comune in molte altre lingue, è assente in C.

Il corpo del principale la funzione inizia con un commento (i commenti a riga singola iniziano con //). La seconda riga del corpo della funzione è un'altra funzione, che fa parte della libreria standard C, da cui il #includere dichiarazione nella parte superiore del file. Il printf la funzione invia l'output allo standard output, "Ciao, Mondo! \ N", in questo caso. Il \ n specifica una nuova linea. In Xcode, tuttavia, l'output viene reindirizzato alla console Xcode, di cui parlerò un po 'di più.

Il principale la funzione termina ritornando 0. Quando un programma ritorna 0, significa che è terminato con successo. Questo è tutto ciò che accade nel principale funzione. Non importa gli argomenti del principale funziona come questo va oltre lo scopo di questo tutorial.

Costruisci ed esegui

Ora che sappiamo cosa sono principale funziona, è tempo di costruire ed eseguire lo strumento da riga di comando. Costruendo l'applicazione, il codice in main.c è compilato in un binario, che viene poi eseguito. Costruisci ed esegui lo strumento da riga di comando facendo clic sul pulsante di riproduzione triangolare nella parte superiore sinistra della finestra.

Se tutto è andato bene, Xcode dovrebbe mostrare l'area di debug nella parte inferiore della finestra. È possibile mostrare e nascondere l'area di debug facendo clic sul pulsante centrale del vista controllo nella barra degli strumenti in alto a destra.

L'area di debug ha due sezioni. A sinistra è il variabili finestra e sulla destra è il consolle finestra. Nella console, dovresti vedere le parole Ciao mondo!. Xcode ti dice anche che il programma è terminato con il codice di uscita 0, il che significa che il programma è terminato normalmente.

In poche parole

Nel resto di questo articolo, tratterò le più importanti caratteristiche di C. Ciò che è trattato in questo tutorial è limitato a ciò che è necessario sapere per iniziare con lo sviluppo di iOS. Nel prossimo articolo di questa serie, parlerò di Objective-C.

A differenza dei linguaggi interpretati, come Ruby, PHP e JavaScript, C è un linguaggio compilato. Il codice sorgente di un programma scritto in un linguaggio compilato viene prima compilato in un binario specifico per la macchina su cui è stato compilato. Il processo di compilazione riduce il codice sorgente alle istruzioni che possono essere comprese dalla macchina su cui gira. Ciò significa anche che un'applicazione non compilata su una macchina non è garantita per l'esecuzione su un'altra macchina.

Va da sé che anche i programmi scritti in linguaggi interpretati devono essere ridotti a istruzioni che la macchina di destinazione può comprendere. Questo processo, tuttavia, ha luogo durante il runtime. Il risultato è che, in generale, i programmi scritti in un linguaggio compilato sono più veloci quando eseguiti rispetto a quelli scritti in un linguaggio interpretato.

Tipi di dati

Un'altra importante differenza con linguaggi come PHP, Ruby e JavaScript è che C è un linguaggio tipizzato. Ciò significa che il tipo di dati che una variabile può contenere deve essere specificato esplicitamente. In C, i tipi di dati fondamentali sono caratteri (carbonizzare), numeri interi (int) e numeri a virgola mobile (galleggiante). Da questi tipi fondamentali, vengono derivati ​​un numero di tipi aggiuntivi, come ad esempio Doppio (numero a virgola mobile a doppia precisione), lungo (numero intero che può contenere valori maggiori) e unsigned (numero intero che può contenere solo valori positivi e quindi valori maggiori). Per un elenco completo dei tipi di dati C di base, consiglio di dare un'occhiata alla pagina di Wikipedia sui tipi di dati C.

Avete notato che le stringhe non sono state menzionate nell'elenco dei tipi di dati C di base? Una stringa C viene archiviata come una matrice di caratteri. Un char può memorizzare un carattere ASCII, il che significa che una serie di caratteri può memorizzare una stringa. Dai un'occhiata al seguente esempio per vedere cosa significa in pratica. Le parentesi quadre subito dopo il nome della variabile indicano che abbiamo a che fare con un array di caratteri. Una stringa C è zero terminata, il che significa che l'ultimo carattere è 0.

char firstName [] = "Bart";

Esploriamo la digitazione in modo più dettagliato confrontando due snippet di codice. Il primo snippet di codice è scritto in JavaScript, mentre il secondo snippet è scritto in C. In JavaScript, una variabile viene generalmente dichiarata con var parola chiave. C non ha una parola chiave per dichiarare le variabili. Invece, una variabile in C viene dichiarata con il prefisso della variabile con un tipo di dati, ad esempio int o carbonizzare.

var a = 5; var b = 13.456; var c = 'a';
int a = 5; float b = 13.456; char c = 'a';

Introduciamo alcune variabili nel principale funzione che abbiamo visto in precedenza. Cambia il corpo del principale funzione per assomigliare allo snippet di codice qui sotto. Per stampare le variabili usando il printf funzione, usiamo specificatori di formato. Per un elenco più completo di specificatori di formato disponibili, visita questo link.

int main (int argc, const char * argv []) // inserisci qui il codice ... printf ("Hello, World! \ n"); // Variabili int a = 5; flottante b = 6,3; char c = 'r'; printf ("questo è un int:% i \ n", a); printf ("questo è un float:% f \ n", b); printf ("questo è un char:% c \ n", c); ritorno 0; 

Come abbiamo visto in precedenza, in C, la digitazione non è limitata alle variabili. Le funzioni devono anche specificare il tipo che restituiscono e il tipo di argomenti che accettano. Vediamo come funziona.

funzioni

Suppongo che tu abbia già familiarità con le funzioni. Come in altri linguaggi, una funzione C è un blocco di codice che esegue un'attività specifica. Facciamo main.c più interessante introducendo una funzione. Prima di principale funzione, abbiamo aggiunto un prototipo di funzione. Indica al compilatore la funzione, che tipo restituisce e quali argomenti accetta. In fondo a main.c, inseriamo l'implementazione della funzione. Tutta la funzione fa moltiplicare l'argomento che viene passato alla funzione per cinque e restituire il risultato.

#includere  int multiplyByFive (int a); // Funzione Prototype int main (int argc, const char * argv []) // inserisci qui il codice ... printf ("Hello, World! \ N"); // Variabili int a = 5; flottante b = 6,3; char c = 'r'; printf ("questo è un int>% i \ n", a); printf ("questo è un float>% f \ n", b); printf ("questo è un carattere>% c \ n", c); // Funzioni printf ("Cinque moltiplicato per cinque è% i \ n", multiplyByFive (5)); ritorno 0;  int multiplyByFive (int a) return a * 5; 

Abbiamo anche aggiornato il principale funzione invocando il multiplyByFive funzione. Si noti che un prototipo di funzione non è strettamente necessario a condizione che l'implementazione della funzione venga eseguita prima di essere richiamata per la prima volta. Tuttavia, l'utilizzo di prototipi di funzioni è utile in quanto consente agli sviluppatori di diffondere il codice sorgente su più file e quindi di organizzare un progetto.

Se una funzione non restituisce un valore, il tipo restituito viene dichiarato come vuoto. In sostanza, ciò significa che nessun valore viene restituito dalla funzione. Dai un'occhiata al seguente esempio. Si noti che la funzione non accetta argomenti. Le parentesi dopo il nome di una funzione sono richieste anche se la funzione non accetta alcun argomento.

// Function Prototype void helloWorld (); // Implementazione della funzione void helloWorld () printf ("Hello, World! \ N"); 

Prima di andare avanti, voglio menzionare che il linguaggio C non ha un funzione parola chiave per dichiarare una funzione come in JavaScript o PHP. Le parentesi dopo il nome della funzione indicano che Ciao mondo è una funzione. Lo stesso vale per le variabili come ho detto prima. Con il prefisso di un nome di variabile con un tipo, il compilatore sa che una variabile viene dichiarata.

Potresti chiederti quali sono i vantaggi di un linguaggio tipizzato, come ad esempio C. Per i programmatori che provengono da Ruby o PHP, l'apprendimento di una lingua dattiloscritta potrebbe inizialmente creare confusione. Il vantaggio principale della digitazione è che sei costretto ad essere esplicito riguardo al comportamento del programma. Gli errori di cattura al momento della compilazione sono un grande vantaggio, come vedremo più avanti in questa serie. Anche se C è un linguaggio tipizzato, non è un linguaggio fortemente tipizzato. La maggior parte dei compilatori C fornisce conversioni implicite (ad esempio a carbonizzare che viene convertito in un int).

strutture

Cos'è una struttura? Permettetemi di citare Kernighan e Ritchie. Una struttura è una raccolta di una o più variabili, possibilmente di tipi diversi, raggruppate sotto un unico nome per una comoda gestione. Diamo un'occhiata a un esempio per vedere come funzionano le strutture. Aggiungi il seguente frammento di codice subito prima del principale la funzione di ritorno dichiarazione.

// Structures struct Album int anno; tracce int; ; struct Album myAlbum; struct Album youralbum; myAlbum.year = 1998; myAlbum.tracks = 20; yourAlbum.year = 2001; yourAlbum.tracks = 18; printf ("Il mio album è stato rilasciato in% i e aveva% i tracce. \ n", myAlbum.year, myAlbum.tracks); printf ("Il tuo album è stato rilasciato in% i e aveva% i tracce. \ n", yourAlbum.year, yourAlbum.tracks);

Iniziamo dichiarando un nuovo tipo di struttura e gli diamo un nome Album. Dopo aver dichiarato il nuovo tipo, lo usiamo specificando che la variabile che stiamo per dichiarare è una struct e specifichiamo il nome della struct, Album. La notazione a punti viene utilizzata per assegnare valori e leggere i valori dalle variabili che la struct detiene.

puntatori

I puntatori sono spesso un ostacolo per le persone che vogliono imparare C. La definizione di un puntatore è molto semplice. Un puntatore è una variabile che contiene un indirizzo di memoria. Tieni presente che un puntatore è solo un altro tipo di dati C. I puntatori sono meglio compresi con un esempio. Incolla il seguente codice immediatamente prima del ritorno dichiarazione del principale funzione.

// Puntatori int d = 5; int * e = & d; printf ("d ha un valore di% i \ n", d); printf ("e ha un valore di% p \ n", e); printf ("l'oggetto che punta a ha un valore di% i \ n", * e);

Iniziamo dichiarando un int e assegnandogli un valore. Nella riga seguente, dichiariamo un puntatore a int di nome e anteponendo il nome della variabile con un asterisco. La e commerciale prima della variabile d è un operatore unario (un nome di fantasia per un operatore che ha un operando) che è noto come l'operatore di indirizzo. In altre parole, anteponendo la variabile d con una e commerciale, il nostro puntatore e è dato non il valore di d, ma l'indirizzo in memoria dove il valore di d è memorizzato. Ricorda la definizione di un puntatore, è una variabile che contiene l'indirizzo di una variabile.

Le istruzioni di stampa dopo le dichiarazioni delle variabili renderanno questo esempio più chiaro. Costruisci ed esegui l'esempio e ispeziona l'output nella console. Il valore di d è 5 come ci aspettiamo. La seconda dichiarazione di stampa potrebbe sorprendervi. Il puntatore chiamato e contiene un indirizzo di memoria, il luogo in memoria in cui il valore di d è memorizzato. Nella dichiarazione finale, usiamo un altro operatore unario, l'operatore di dereferenziazione o indiretta. Cosa fa questo operatore, sta accedendo all'oggetto che è memorizzato nella posizione a cui punta il puntatore. In altre parole, utilizzando l'operatore di dereferenziazione recuperiamo il valore di d.

Ricorda che quando una variabile viene dichiarata nel linguaggio di programmazione C, viene assegnato un blocco di memoria per quella variabile. Un puntatore punta semplicemente a quel blocco di memoria. In altre parole, contiene un riferimento alla variabile che è memorizzata nel blocco di memoria. Assicurati di aver compreso il concetto dei puntatori prima di passare al prossimo articolo in cui diamo uno sguardo a Objective-C. I puntatori vengono utilizzati tutto il tempo quando si lavora con gli oggetti.

Non preoccuparti se i suggerimenti non hanno senso dopo aver letto questo articolo. Spesso ci vuole del tempo per comprendere davvero il concetto. C'è un post eccellente scritto da Peter Hosey che non posso raccomandare abbastanza.

Mente il punto e virgola

Sembra che i punti e virgola non siano più alla moda. A Ruby non piacciono i punti e virgola e anche il nuovo simpatico ragazzo in città, CoffeeScript, non gli piace. In C e Objective-C, sono richiesti i punti e virgola alla fine di ogni istruzione. Il compilatore non è molto indulgente come forse hai notato.

Conclusione

C'è di più nel linguaggio di programmazione C rispetto a quello che ho trattato in questo articolo. Nel prossimo articolo, tuttavia, parlerò di Objective-C e gradualmente migliorerò la tua comprensione di C. Una volta iniziato a lavorare con l'SDK di iOS, sono sicuro che imparerai a lavorare con gli oggetti e i puntatori non c'è tempo.