modo pratico per imparare C? [chiuso]


10

Voglio scavare in C e normalmente quando voglio imparare una nuova lingua penso a un obiettivo di progetto semplice / raggiungibile che abbia uno scopo pratico (usare un API, automatizzare un compito, ecc ...)

Sto avendo difficoltà a trovarne uno per C principalmente perché tutto quello che leggo indica il fatto che l'uso primario di C è attualmente in sistemi embedded e progetti software più complessi come i sistemi operativi.

Questo mi indica il fatto che non ho bisogno di impararlo o che devo solo essere un po 'più contorto nella mia strategia di apprendimento?

Riferimenti a risorse di apprendimento pratico? (tutorial / come ciò produce un risultato finale che ha qualche scopo / beneficio)


3
Riceverai risposte più sensate se puoi dirci PERCHÉ vuoi imparare C?
zvrba,

2
Sono d'accordo con zvrba. C è ottimo per roba di basso livello, veloce e per il codice del driver. Se stai scrivendo codice per i giochi, è anche ottimo (anche se probabilmente lavoreresti con programmatori C ++ che si lamenteranno con te per aver scritto codice "non standard"). Sento, tuttavia, che Assembly e C sono simili al latino (nelle lingue parlate), non erano i primi, ma la maggior parte di quelli che seguirono usarono le idee e i costrutti da loro per creare le proprie lingue. Pertanto, studiare C MIGHT ti darà una migliore comprensione delle lingue di livello superiore
Jamie Taylor,

Hai verificato Zed Shaw's Learn C The Hard Way . Più pratico che si può ottenere e anche abbastanza gratuito.
Wyatt Barnett,

la persona di Python the Hard Way ora ha libri per altre lingue tra cui una versione alfa per C, vorrei iniziare da lì. C è di alto livello una grande differenza da asmare, odio il paragone da asm in quanto è falso. Relativamente sicuro ti consente di fare ciò che altre lingue non vogliono. Non importa cosa vuoi fare per qualsiasi applicazione che puoi scrivere in C, nessun motivo per indirizzare l'applicazione alla lingua.
old_timer,

Risposte:


27

Vorrei solo raccomandare di prendere una copia di The C Programming Language (2a edizione) di Kernighan e Ritchie . Ha una serie di esercizi alla fine di ogni capitolo che puoi fare, oltre a fornire un'ottima introduzione al linguaggio C. Non ti renderà padrone della lingua, ma dovresti avere una buona conoscenza alla fine del libro e degli esercizi per trovare forse un progetto open source scritto in C in cui potresti leggere la fonte e forse contribuire per.

Se vuoi vedere i progetti del mondo reale con codice C al loro interno. Sta diventando più difficile - molti progetti usano un linguaggio di "livello superiore", ma C è ancora vivo e vegeto. Se vuoi imparare il C, non aver paura di reinventare la ruota per raggiungere l'apprendimento. Non è una buona idea reinventare soluzioni sull'orologio, ma è perfettamente bene farlo come esercizio accademico.


1
Aggiungi le FAQ da comp.lang.c a questo. c-faq.com
Mike Sherrill 'Cat Recall',

3
+1 per non preoccuparti di reinventare le soluzioni per imparare.
un CVn il

4
K&R è orribile per l'apprendimento di un buon stile di programmazione in generale, e orribile per insegnare pratiche di programmazione C sicure / sane in particolare. Tutti i frammenti di codice al suo interno sono nella migliore delle ipotesi offuscati, il più delle volte insegnano abitudini assolutamente pericolose. È un libro obsoleto, non lo consiglierei per nulla oltre la nostalgia. È particolarmente inadatto per i programmatori principianti.

2
@Thomas Sì, la 2a edizione. Puoi citare praticamente qualsiasi frammento di codice da esso e posso probabilmente indicare 2-3 casi di pratica pericolosa / scarsa in esso. In questo momento aprirò il libro e selezionerò alcuni esempi casuali. Ok, andiamo, p119: assegnazione all'interno di condizioni, uso di tipi di dati primitivi nativi, uso di int implicito (senza segno), typecasting il risultato di malloc (molto cattivo!), Typecasting del parametro per liberare il vuoto * (perché ??? ), ritorni multipli (aka spaghetti), usando NULL senza #include corretto, se senza {}.

2
+ 1 per KnR C. È la migliore (e la più concisa) introduzione alla programmazione in un linguaggio specifico che abbia mai letto. Come altri hanno sottolineato, può essere un po 'dubbioso in alcuni punti - l'unico consiglio che darei è questo: se c'è mai stato un manuale di programmazione che ti richiede di leggere il rumore circostante, questo è tutto. Di solito puoi scoprirne altri dal blocco di codice, ma questo libro richiede di leggerlo da cima a fondo, almeno una volta.
Jamie Taylor,

1

Dovrai davvero capire l'allocazione della memoria. Sembra che tu abbia già usato altre lingue prima, ma è probabile che quelle altre lingue ti nascondano i dettagli cruenti della gestione della memoria. In C, la gestione della memoria è sempre esplicita. Ci sono alcuni vantaggi in questo, ma significa che devi stare attento a farlo bene o tutto l'inferno si scatenerà.

Utilizzare le funzionalità di debug della memoria disponibili per la piattaforma in uso. Per Linux c'è Electric Fence, su Mac OS X c'è Guard Malloc. Inoltre c'è Valgrind che supporta numerosi sistemi operativi.

Se non riesci a liberare memoria che dovrebbe essere liberata, avrai una perdita di memoria. Continua a farlo e rimarrai senza memoria. Anche con l'archivio di backup (ciò che la maggior parte delle persone chiama memoria virtuale), è possibile far sì che il sistema esegua una pagina eccessiva o addirittura esaurisca lo spazio di scambio.

Se si libera la memoria che è già stata liberata, si corromperanno l'heap e l'arresto anomalo, ma probabilmente non immediatamente. Inoltre danneggierai l'heap se hai superato un buffer. Gli strumenti di debug della memoria aiuteranno con tutti questi.

Anche i test unitari aiutano.


0

Concordo con la maggior parte delle persone qui sul fatto che oggi le lingue sono determinate dal compito da svolgere. C'è stato un tempo in cui avevi una scelta limitata al riguardo. Oggi C viene utilizzato principalmente nel dominio di programmazione Embedded / System dove è necessaria l'ottimizzazione del codice. Devi scrivere codici precisi per ottenere il massimo perché se mai inizi a usare quell'astrazione, le cose sottostanti devono essere molto robuste. Direi che cerchi di aggirare alcuni progetti GNU open source come Linux stesso o qualcosa che ha bisogno di sviluppatori C. Metti alla prova questi progetti invece di scrivere qualcosa da zero in C. Questo è probabilmente il modo migliore per scrivere codici e imparare una lingua.


In realtà, dubito che saltare prima in un progetto consolidato, anche se minore, sia un buon modo per iniziare a imparare una lingua da zero. È molto probabile che per entrare in modo sopra la testa, e avrà anche l'onere aggiuntivo di semplicemente cercando di navigare il codice, anche se tutti si inizia a fare è capire come funziona il codice. Un kernel del sistema operativo in particolare è un software incredibilmente complesso.
un CVn il

Sì, ma presumo che l'interrogatore abbia effettivamente esaminato il libro di K&R o qualcosa del genere. Mi è stato raccomandato questo approccio quando ho chiesto nel canale Python. Sarebbe diverso in C?
Nishant,

A rigor di termini non so se sarebbe così diverso, ma in C, devi prestare molta più attenzione ai dettagli nitidi rispetto a un linguaggio di alto livello come Python. Gestione della memoria, per citare solo una cosa. Saltare in un progetto consolidato, potenzialmente di grandi dimensioni, quando hai appena iniziato con una lingua potrebbe non essere il modo migliore per farlo.
un CVn

0

Avrai voglia di fare qualcosa che possa funzionare dalla riga di comando. La programmazione della GUI in C è un grosso problema nel culo, anche con un buon framework GUI.

Il mio solito suggerimento per un'esperienza pratica di apprendimento in C è stato un elenco di contatti o un'altra semplice app di gestione dei dati. Questo coprirà la maggior parte dei bit importanti (I / O, gestione della memoria, elaborazione del testo, ecc.) E non dovrai usare nulla al di fuori della libreria C standard per realizzarlo. C non ha alcun supporto integrato per la grafica, la rete, il suono o molto altro 1 , quindi per la tua prima incursione nella programmazione C è meglio evitare qualsiasi cosa si basi su quel tipo di cose.

C può essere utilizzato per la programmazione generale; devi solo abbattere un po 'le tue aspettative (immagina che sia il 1983 e sei seduto di fronte a un VT52 collegato a un VAX 11/750, e avrai la giusta mentalità).

Ricorda, C non ha protezioni per le lame e non ti impedirà di fare qualcosa di stupido. La definizione della lingua è un po 'allentata in alcuni punti e ci sono alcune operazioni che non sono illegali in quanto tali, ma non sono nemmeno ben definite.


1 - L'ultima revisione (2011) dello standard linguistico ha aggiunto il supporto per il threading integrato


0

Raccomando Project Euler . L'ho usato per migliorare il mio C ++ ed è fantastico. È fantastico perché ogni problema è un piccolo compito che potrebbe richiedere meno di un'ora per il completamento (almeno i primi).

Avrai bisogno di un profiler e di un libro sull'ottimizzazione del codice per la velocità. Assicurati di attenersi alla regola di 1 minuto: devi ottenere la risposta entro 1 minuto.


0

Se sei GIÀ un programmatore e SOLO hai bisogno di imparare C, e non ti dispiace imparare una versione precedente della lingua (il nucleo è ancora più o meno lo stesso), allora "C for Programmers" di Leendert Ammeraal non può essere battuto . Lavoraci attraverso, dall'inizio alla fine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.