Dovrei imparare C prima di imparare C ++? [chiuso]


116

Oggi ho visitato un open day del dipartimento di informatica dell'università e durante il tour dei laboratori ci siamo seduti a giocare con un paio di progetti dell'ultimo anno di studenti universitari. Uno era particolarmente buono: una sorta di gioco di asteroidi FPS. Ho deciso di dare un'occhiata alla srcdirectory per scoprire che è stato fatto in C ++ (la maggior parte degli altri progetti erano app Java 3D).

Non ho fatto alcun C prima, ma ho già esaminato un po 'di codice C. Da quello che ho visto nel codice .cpp in questo gioco non sembrava molto diverso.

Mi interessa imparare il C o il C ++ ma probabilmente imparerò l'altro in seguito. C'è qualche vantaggio nel fatto che io impari l'uno prima dell'altro e, se sì, quale?



7
Non è davvero un duplicato. Implicitamente questa domanda chiede anche "dovrei imparare prima la programmazione
oraria

2
Prima di scendere al di sotto risposte (IMO vanno in tondo), mi permettono di offrire alcuni consigli: TRUE : C ++ fa conservano tutte le caratteristiche e attributi applicati a C, così implicitamente ' obsoleto ' C (Il punto più di risposte qui sotto prova produrre). TUTTAVIA : C non è , non , NON MORTO. Le persone sembrano afferrare il tropo " non c'è bisogno di imparare entrambi " per la cara vita, ma in realtà questo non ha alcun fondamento. Per prendere in prestito la sintassi provenienti da C, C ++! = C . Conoscere C ++ NON ti renderà uno sviluppatore C qualificato e, allo stesso modo, conoscere C NON ti renderà uno sviluppatore C ++ qualificato.
Super Cat

4
CHE HA DETTO : Non c'è nulla di male nell'affrontare C prima di approfondire C ++ - Più sai, meglio sei - Ma al contrario, non c'è bisogno di imparare C se il tuo obiettivo finale è imparare C ++ . SE volete imparare il C ++, andare imparare il C ++ , e se si vuole t imparare il C, andare imparare C . Entrambi hanno pro e contro (la semplicità di C e le caratteristiche -ultra in profondità- di C ++ sono entrambe maledizioni e benedizioni a modo loro), ed entrambe sono ancora usate oggi (C per sistemi embedded, Unity, PHP, ecc - C ++ anche per Unity, Unreal, ecc.).
Super Cat

3
PUNTO: vuoi imparare il C ++? Quindi salta C. Non ne hai bisogno. Vuoi imparare il C? Allora bene, vai a imparare C. Se vuoi imparare entrambi, allora scegli prima C. Entrambi hanno il loro posto nel mondo, quindi non pensare che uno sia sufficiente per l'altro.
Super Cat

Risposte:


121

Non è necessario imparare il C prima di imparare il C ++.

Sono lingue diverse . È un malinteso comune che il C ++ dipenda in qualche modo da C e non da un linguaggio completamente specificato da solo.

Solo perché il C ++ condivide molta della stessa sintassi e molta della stessa semantica, non significa che devi prima imparare il C.

Se impari il C ++ alla fine imparerai la maggior parte del C con alcune differenze tra i linguaggi che imparerai nel tempo. In effetti è molto difficile scrivere C ++ corretto perché i programmatori C ++ intermedi tendono a scrivere C / C ++. Questo è vero sia che tu abbia iniziato o meno con C o con C ++.

Se conosci prima il C, questo è un vantaggio per l'apprendimento del C ++. Inizierai con la conoscenza di una parte della lingua. Se prima non conosci il C, non ha senso concentrarsi su una lingua diversa. Ci sono molti buoni libri e tutorial disponibili che ti fanno iniziare dal non sapere nulla e tratteranno tutto ciò che impareresti da C che si applica anche a C ++.

Si prega di vedere ulteriori ragionamenti in questa risposta .


33
Non potrei essere più in disaccordo. Imparare prima il C ++ rende un'esperienza molto difficile "tornare" a C. Il C è un linguaggio di sistema fondamentale, solo di base. Il C ++ è un gioco completamente nuovo, gli approcci a qualsiasi problema in entrambe le lingue differiranno notevolmente. Ho avuto la fortuna di armeggiare con il C prima di lanciarmi in un lavoro in C ++. Successivamente sono in grado di "bollire" mentalmente lo zucchero sintattico fornito dal C ++ e posso affrontare i problemi con entrambi i linguaggi. È molto facile per me identificare il C come la parte "fa le cose" della coppia linguistica. Imparare prima il C ++ porterà a programmatori confusi e fuorviati.
Matt Joiner

24
@ Matt: ho imparato prima il C ++ e non sono un programmatore fuorviato. Quindi la tua affermazione non è vera, prova per contro esempio. E sì, ho anche un distintivo d'oro in C. La verità è che sono 2 lingue distinte e diverse. Non hai bisogno di una lingua come dipendenza per imparare l'altra. Questo è solo uno stupido malinteso.
Brian R. Bondy

8
@ Matt: Anche dal mio post collegato: dovresti prima imparare il C ++, non perché imparare prima il C ti farà male, non perché dovrai disimparare qualcosa (non lo farai), ma perché non c'è alcun vantaggio nell'apprendere prima il C. Alla fine imparerai quasi tutto su C comunque perché è più o meno contenuto in C ++.
Brian R. Bondy,

11
@ Matt: mi dispiace che tu ancora non capisca. Disegna un diagramma di Venn di C e C ++ e guarda le parti che si intersecano. Il C ++ è composto dall'intero cerchio C ++ che disegni, non solo dalle parti che non si intersecano. Se ti capita di conoscere prima il C, bene per te, puoi imparare C ++ più velocemente. Se non conosci prima C, non c'è motivo di impararlo prima. Presumi che ogni libro in C ++ non tratterà i puntatori e la gestione della memoria, i valori letterali delle stringhe, ecc.? Smetterò di discutere ora, ma sentiti libero di lasciare i tuoi commenti di chiusura.
Brian R. Bondy

11
@ Matt: in che modo il C porta a una migliore comprensione del C ++? Di solito, i programmatori C che imparano il C ++ finiscono per scrivere codice di stile "C con classi" brutto e soggetto a errori. Non sto dicendo che questo accada sempre , ma è la progressione più naturale quando si inizia con C, perché il C è molto più vicino a quello stile orribile di C ++ che al C ++ "moderno".
jalf

77

Adoro questa domanda: è come chiedere "cosa dovrei imparare prima, lo snowboard o lo sci"? Penso che dipenda se vuoi fare snowboard o sciare. Se vuoi fare entrambe le cose, devi impararle entrambe.

In entrambi gli sport, si scivola giù da una collina sulla neve utilizzando dispositivi sufficientemente simili da provocare questa domanda. Tuttavia, sono anche sufficientemente diversi in modo che impararne uno non ti aiuti molto con l'altro. Stessa cosa con C e C ++. Anche se sembrano essere linguaggi sufficientemente simili nella sintassi, la mentalità di cui hai bisogno per scrivere codice OO rispetto al codice procedurale è sufficientemente diversa in modo che devi praticamente iniziare dall'inizio, qualunque lingua impari per seconda.


70

Ho imparato il C prima e ho seguito un corso sulle strutture dati che utilizzavano il C, prima di imparare il C ++. Questo ha funzionato bene per me. Un corso sulle strutture dati in C mi ha fornito una solida conoscenza dei puntatori e della gestione della memoria. Ha anche reso evidenti i vantaggi del paradigma orientato agli oggetti, una volta appreso di cosa si trattava.

Il rovescio della medaglia, imparando prima il C, ho sviluppato alcune abitudini che inizialmente mi hanno portato a scrivere codice C ++ pessimo, come l'uso eccessivo di puntatori (quando i riferimenti C ++ lo farebbero) e il preprocessore.

Il C ++ è davvero un linguaggio molto complesso con molte funzionalità. Tuttavia, non è davvero un superset di C. Piuttosto c'è un sottoinsieme di C ++ costituito dai costrutti di programmazione procedurale di base (cicli, se e funzioni), che è molto simile a C. Nel tuo caso, inizierei con quello e poi lavorerei fino a concetti più avanzati come classi e modelli.

La cosa più importante, IMHO, è essere esposto a diversi paradigmi di programmazione, come procedurale, orientato agli oggetti, funzionale e logico, all'inizio, prima che il tuo cervello si blocchi in un modo di guardare il mondo. Per inciso, ti consiglio anche vivamente di imparare un linguaggio di programmazione funzionale, come Scheme. Espanderebbe davvero i tuoi orizzonti.


18

Se decidi di imparare entrambi (e come altre persone hanno detto, non c'è bisogno esplicito di imparare entrambi), impara prima C. Passare da C a C ++ sembra una progressione naturale; andare dall'altra parte è come legare deliberatamente una mano dietro la schiena. :-)


13

Penso che dovresti imparare prima C, perché ho imparato prima C. Il C mi ha dato una buona conoscenza della sintassi e dei trucchi con cose come i puntatori, che fluiscono tutti in C ++.

Penso che il C ++ renda facile concludere tutti quei trucchi (serve un array che non trabocchi quando usi l'operatore [] e un indice ingannevole? Certo, crea una classe array che controlli i limiti) ma devi sapere cosa sono e vengono morsi da loro prima di capire perché le cose vengono fatte in un certo modo.

Quando tutto è stato detto e fatto, il modo in cui il C ++ viene solitamente insegnato è "C ++ è C con oggetti, ecco le cose in C ed ecco come funzionano tutte queste cose OO", quindi è probabile che imparerai il C di base prima di qualsiasi vero C ++ se tu segui comunque la maggior parte dei testi.


Non sono d'accordo. Qualsiasi libro di programmazione in C ++ degno di questo nome coprirà almeno alcuni dei "trucchi", come come funzionano gli array (e come prevenire l'overflow)
moonman239

12

Non sono d'accordo con la maggioranza qui. Penso che dovresti imparare il C prima di imparare il C ++. Non è sicuramente necessario, ma penso che renda l'apprendimento del C ++ molto più semplice. Il C è il cuore del C ++. Tutto ciò che impari su C è applicabile a C ++, ma C è molto più piccolo e più facile da imparare.

Prendi K&R e leggilo. È breve e ti darà un senso sufficiente della lingua. Una volta che hai le basi dei puntatori e delle chiamate di funzione, puoi passare a C ++ un po 'più facilmente.


15
Sbagliato. Praticamente tutto ciò che C ti insegna è una cattiva pratica in C ++. Il C non è al centro di C ++, capita solo di condividere molta sintassi. Per favore, il mondo ha già più che sufficienti programmatori "C con classi". Impara sia C che C ++. Ma non fingere che C sia un C ++ lite.
jalf

13
Rimango fedele alle mie parole. Il C ++ è costruito sopra C e quindi C è il suo cuore. Gli idiomi usati in C ++ sono molto diversi da quelli usati in C, ma la sintassi è la stessa. Si può imparare il modo giusto per programmare C ++ a partire da C. Guarda C ++ Primer. Fondamentalmente lo fa.
Steve Rowe

6
+1. Il C è una lingua più piccola, quindi più facile da imparare. Il tentativo di essere retrocompatibili con C è una fonte dei principali problemi con C ++, un altro è il sistema di template che è troppo complicato per essere utilizzato dal 90% dei programmatori C ++.
hillu

1
La comprensione di variabili, tipi [inclusi puntatori e qualificazioni], ambito, funzioni, preprocessore e collegamento è essenziale sia per C che per C ++. Direi che imparare questi concetti con C sarà più facile in modo che tu non debba occuparti anche di lezioni di conoscenza, un altro significato di static, modelli (e gli errori di modello ridicolmente intimidatori che i compilatori emettono) ecc.
dreamlax

1
Tu hai un punto. In realtà, potrebbe essere utile imparare il C in modo da poter poi passare a C ++ con una migliore conoscenza delle sue radici.
Daniel Daranas

10

Nel processo di apprendimento del C ++ imparerai anche la maggior parte del C. Ma tieni presente che molto codice C ++ non è valido C. C ++ è stato progettato per essere compatibile con il codice C, quindi direi che impara prima C ++. Brian ha scritto un'ottima risposta riguardo a questo.


8

Come le risposte a molte altre domande nella vita, dipende. Dipende da quali sono i tuoi interessi e obiettivi di programmazione. Se vuoi programmare applicazioni desktop, magari con una GUI, allora C ++ (e OOP) è probabilmente un modo migliore per andare. Se sei interessato alla programmazione hardware su qualcosa di diverso da un chipset x86, C è spesso una scelta migliore, di solito per la sua velocità. Se desideri creare un nuovo lettore multimediale o scrivere un'app aziendale, sceglierei C ++. Se vuoi fare simulazioni scientifiche di collisioni galattiche o dinamiche dei fluidi, guarda la potenza di C.


4
In molti scenari di elaborazione ad alte prestazioni, quelle poche centinaia di cicli di clock sono davvero importanti.
Scottie T

1
@ScottieT: Dato che oltre allo restrictspecificatore C non ha nessun altro costrutto sintattico / semantico correlato alle prestazioni rispetto a C ++, perché esattamente pensi che il codice C ++, con la sua sintassi più ricca e ad esempio la meta-programmazione dovrebbe produrre un codice più lento? Conosci anche i modelli di espressione?
Sebastian Mach

1
@phresnel: rilevanza. Il C ++ è un linguaggio estremamente complesso con caratteristiche che spesso non valgono la pena di essere accettato. Come regola generale, il C offre le stesse opportunità di prestazioni del C ++ a un costo di complessità notevolmente inferiore.
Matt Joiner

1
@ MattJoiner: anche la manutenibilità / estensibilità sono fattori di prestazione, anche se mi rendo conto che il codice scientifico è spesso one-shot. Tuttavia, ripetendo l'argomento expression-templates (come esempio), dico che il C ++ ha più opportunità di ottimizzazione, (anche perché è più facile scrivere expression-template-code che intrinsic-code), con una eccezione ( restrictche però tutti i principali compilatori C ++ forniscono come estensione). E pensi davvero che, dato lo stesso codice, ci sarà qualche differenza di prestazioni tra C ++ e C, dato lo stesso compilatore? [...]
Sebastian Mach

1
@ MattJoiner: [...], e quando leggo affermazioni come "per quanto non mi piaccia il C ++", mi fa supporre che tu sia leggermente di parte in questa discussione. Cosa pensi che renda il codice C ++ meno performante? Se C ha le stesse opportunità di prestazioni, qual è l'equivalente di modelli di espressione, modelli in generale, calcoli in fase di compilazione su tipi di dati non intrinseci, funtori? E aggiungendo il fattore costo / manutenibilità: RAII, sovraccarico operatore / funzione, contenitori standard generici, thread standard, algoritmi standard generici, riferimenti?
Sebastian Mach

8

L'apprendimento del C ti costringe a pensare più attentamente ad alcuni problemi come la gestione della memoria esplicita e implicita o le dimensioni di archiviazione dei tipi di dati di base nel momento in cui scrivi il codice.

Una volta raggiunto un punto in cui ti senti a tuo agio con le funzionalità e le disfunzioni di C , probabilmente avrai meno problemi ad apprendere e scrivere in C ++.

È del tutto possibile che il codice C ++ che hai visto non fosse molto diverso dal C standard, ma potrebbe anche essere perché non era orientato agli oggetti e non utilizzava eccezioni, orientamento agli oggetti, modelli o altre funzionalità avanzate.


8

Penso che imparare prima il C sia una buona idea.

C'è una ragione per cui i corsi di informatica usano ancora C.

A mio parere è per evitare tutto l '"affollamento" della materia l'obbligo di richiedere OOP porta.

Penso che la programmazione procedurale sia il modo più naturale per imparare prima a programmare. Penso che sia vero perché alla fine della giornata è quello che hai: righe di codice che vengono eseguite una dopo l'altra.

Molti testi oggi stanno spingendo un approccio "prima gli oggetti" e iniziano a parlare di auto e cambi prima di introdurre gli array.


4
Sembra che molti corsi di informatica in questi giorni utilizzino Java, il che aggrava il problema di cui parli.
Dima

2
Hai fatto una giusta osservazione. Oltre ad essere troppo complicato per una prima lingua, il C ++ per la maggior parte incoraggia a nascondere l'interazione di basso livello con il sistema operativo e la memoria che sono fondamentali per un buon insegnamento di informatica. Gli array dovrebbero essere insegnati molto prima degli oggetti.
Matt Joiner

1
D'altra parte, se non sei bravo in matematica, la programmazione funzionale potrebbe essere più naturale, perché sembra, si sente e funziona in modo più familiare.
Sebastian Mach

2
"C'è una ragione per cui i corsi di informatica usano ancora C." Sì, perché la maggior parte dei corsi di sci di fondo sono insegnati male.
Gare di leggerezza in orbita

8

No.

In genere è più utile imparare il C ++ perché è più vicino ai più moderni linguaggi basati su OO, come Eiffel o C #.

Se il tuo obiettivo è imparare il C ++, impara innanzitutto il C ++ moderno e standard. Lascia da parte i mallocs.


Ma Steve Rowe ha ragione ...


Il C ++ oggigiorno non è più vicino ai linguaggi OO come C # o Eifel.
einpoklum

7

Avendo osservato le persone, che hanno imparato prima Java, lottare con i concetti di puntatori e gestione della memoria in C ++, direi che imparare prima il C è una buona idea, al fine di cogliere questi due concetti, isolati dalle complessità di altri C ++ Caratteristiche.


6

I miei due centesimi:

Suggerisco di imparare prima il C, perché:

  • è una lingua fondamentale - molte lingue discendono da C
  • più piattaforme supportano il compilatore C rispetto a C ++, che si tratti di sistemi integrati, chip GPU, ecc.
  • secondo l' indice TIOBE C è ancora circa 2 volte più popolare di C ++.

3

Penso che c sia davvero un bel linguaggio di programmazione, è compatto e piuttosto facile da imparare. ma se vuoi imparare solo c ++ inizia con c ++. ma ti suggerisco di imparare entrambi. e se vuoi farlo; Penso che sia meglio iniziare con c. come detto prima: è piccolo e un po 'facile da imparare. potrebbe essere un bel passo avanti verso un linguaggio di programmazione più complesso come il c ++. (poiché c ti fornisce alcune nozioni di base)

in bocca al lupo.

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.