Dois-je apprendre C avant d'apprendre C ++? [fermé]

116

J'ai visité une journée portes ouvertes du département CS de l'université aujourd'hui et lors de la tournée des laboratoires, nous nous sommes assis pour jouer avec quelques projets de dernière année d'étudiants de premier cycle. L'un était particulièrement bon - une sorte de jeu d'astéroïdes FPS. J'ai décidé de jeter un œil dans le srcrépertoire pour constater que cela avait été fait en C ++ (la plupart des autres projets étaient des applications Java 3D).

Je n'ai jamais fait de C avant mais j'ai regardé du code C avant. D'après ce que j'ai vu dans le code .cpp de ce jeu, cela n'avait pas l'air très différent.

Je suis intéressé par l'apprentissage du C ou du C ++, mais j'apprendrai probablement l'autre plus tard. Y a-t-il un avantage à apprendre l'un avant l'autre et si oui, lequel?

Ross
la source
Dupliquer: stackoverflow.com/questions/171126/…
David Segonds
7
Ce n'est pas vraiment un doublon. Implicitement, cette question pose également la question "
Dois-
2
Avant de descendre au - dessous des réponses (OMI ils vont dans les milieux), permettez - moi d'offrir quelques conseils: TRUE : C ++ ne conserver toutes les caractéristiques et attributs appliqués à C, donc implicitement « obsolète » C (Le point le plus de réponses ci - dessous essayer faire). CEPENDANT : C n'est pas , pas , PAS MORT. Les gens semblent saisir le trope « il n'y a pas besoin d'apprendre les deux » pour la vie chère, mais en réalité, cela n'a aucun fondement. Pour la syntaxe provenant de C emprunter, C ++! = C . Connaître C ++ ne fera PAS de vous un développeur C qualifié, et de même, connaître C ne fera PAS de vous un développeur C ++ qualifié.
Super Cat
4
CELA DIT : Il n'y a aucun mal à prendre C avant de se plonger dans C ++ - Plus vous en savez, mieux vous êtes - Mais au contraire, il n'est pas nécessaire d'apprendre C si votre objectif ultime est d'apprendre C ++ . SI vous voulez apprendre C ++, allez apprendre C ++ , et si vous voulez apprendre C, allez apprendre C . Les deux ont des avantages et des inconvénients (la simplicité de C et les fonctionnalités -ultra en profondeur- de C ++ sont à la fois des malédictions et des bénédictions à leur manière), et les deux sont encore utilisés aujourd'hui (C pour les systèmes embarqués, Unity, PHP, etc. - C ++ également pour Unity, Unreal, etc.).
Super Cat
3
POINT: Vous voulez apprendre le C ++? Puis sautez C. Vous n'en avez pas besoin. Voulez-vous apprendre C? Alors bon, allez apprendre C. Si vous voulez apprendre les deux, allez d'abord pour C. Ils ont tous les deux leur place dans le monde, alors ne pensez pas que l'un ou l'autre soit suffisant pour l'autre.
Super Cat

Réponses:

121

Il n'est pas nécessaire d'apprendre le C avant d'apprendre le C ++.

Ce sont des langues différentes . C'est une idée fausse courante que C ++ dépend en quelque sorte de C et non d'un langage entièrement spécifié en soi.

Ce n'est pas parce que C ++ partage beaucoup de la même syntaxe et beaucoup de la même sémantique que vous devez d'abord apprendre le C.

Si vous apprenez C ++, vous apprendrez éventuellement la plupart de C avec quelques différences entre les langages que vous apprendrez au fil du temps. En fait, il est très difficile d'écrire du C ++ correct car les programmeurs C ++ intermédiaires ont tendance à écrire en C / C ++. C'est vrai que vous ayez ou non commencé avec C ou C ++.

Si vous connaissez d'abord C, c'est un avantage supplémentaire pour apprendre le C ++. Vous commencerez par connaître une partie de la langue. Si vous ne connaissez pas C d'abord, il est inutile de vous concentrer sur une autre langue. Il existe de nombreux bons livres et tutoriels disponibles qui vous permettent de ne rien savoir et qui couvriront tout ce que vous apprendriez de C qui s'applique également au C ++.

Veuillez consulter le raisonnement supplémentaire dans cette réponse .

Brian R. Bondy
la source
33
Je ne pourrais pas être plus en désaccord. L'apprentissage du C ++ rend d'abord une expérience très difficile «revenir» à C. Le C est un langage système fondamental, uniquement basique. C ++ est un tout nouveau jeu de balle, les approches de tout problème dans l'une ou l'autre langue différeront énormément. J'ai eu la chance de bricoler avec C avant de me lancer dans un travail C ++. Par la suite, je suis capable de "faire bouillir" mentalement le sucre syntaxique fourni par C ++, et je peux aborder les problèmes avec les deux langues. Il est très facile pour moi d'identifier C comme la partie «fait des choses» de la paire de langues. Apprendre d'abord C ++ conduira à des programmeurs confus et trompés.
Matt Joiner
24
@Matt: J'ai d'abord appris le C ++ et je ne suis pas un programmeur induit en erreur. Donc votre affirmation n'est pas vraie, preuve par contre-exemple. Et oui, j'ai aussi un badge d'or en C. La vérité est qu'il s'agit de 2 langues distinctes et différentes. Vous n'avez pas besoin d'une langue comme dépendance pour apprendre l'autre. C'est juste une idée fausse.
Brian R. Bondy
8
@Matt: Aussi à partir de mon article lié: Vous devriez d'abord apprendre C ++, pas parce qu'apprendre C d'abord vous fera du mal, non pas parce que vous devrez désapprendre quoi que ce soit (vous ne le ferez pas), mais parce qu'il n'y a aucun avantage à apprendre C d'abord. Vous apprendrez finalement à peu près tout sur C de toute façon car il est plus ou moins contenu dans C ++.
Brian R. Bondy
11
@Matt: Je suis désolé que vous ne compreniez toujours pas. Dessinez un diagramme de Venn de C et C ++ et regardez les parties qui se croisent. C ++ est composé de tout le cercle C ++ que vous dessinez, pas seulement des parties qui ne se croisent pas. Si vous connaissez d'abord C, tant mieux pour vous, vous pouvez apprendre le C ++ plus rapidement. Si vous ne connaissez pas d'abord C, il n'y a aucune raison de l'apprendre en premier. Pensez-vous que chaque livre sur C ++ ne couvrira pas les pointeurs et la gestion de la mémoire, les littéraux de chaîne, etc.? Je vais arrêter de discuter maintenant, mais n'hésitez pas à laisser vos commentaires de clôture.
Brian R. Bondy
11
@Matt: comment le C conduit-il à une meilleure compréhension du C ++? Habituellement, les programmeurs C qui apprennent C ++ finissent par écrire du code de style "C avec classes" laid et sujet aux erreurs. Je ne dis pas que cela arrive toujours , mais c'est la progression la plus naturelle en commençant par C, car C est beaucoup plus proche de cet horrible style de C ++ que du C ++ "moderne".
jalf
77

J'adore cette question - c'est comme demander "que dois-je apprendre en premier, le snowboard ou le ski"? Je pense que cela dépend si vous voulez faire du snowboard ou du ski. Si vous voulez faire les deux, vous devez apprendre les deux.

Dans les deux sports, vous dévalez une colline sur la neige en utilisant des dispositifs suffisamment similaires pour provoquer cette question. Cependant, ils sont également suffisamment différents pour que l'apprentissage de l'un ne vous aide pas beaucoup avec l'autre. Même chose avec C et C ++. Bien qu'ils semblent être des langages suffisamment similaires en termes de syntaxe, l'état d'esprit dont vous avez besoin pour écrire du code OO par rapport au code procédural est suffisamment différent pour que vous deviez pratiquement commencer par le début, quelle que soit la langue que vous apprenez en second.

cdonner
la source
70

J'ai d'abord appris le C, et j'ai suivi un cours sur les structures de données utilisant le C, avant d'apprendre le C ++. Cela a bien fonctionné pour moi. Un cours sur les structures de données en C m'a donné une solide compréhension des pointeurs et de la gestion de la mémoire. Cela a également mis en évidence les avantages du paradigme orienté objet, une fois que j'ai appris ce que c'était.

D'un autre côté, en apprenant d'abord le C, j'ai développé des habitudes qui m'ont initialement amené à écrire du mauvais code C ++, comme une utilisation excessive des pointeurs (alors que les références C ++ feraient) et du préprocesseur.

C ++ est vraiment un langage très complexe avec de nombreuses fonctionnalités. Ce n'est pas vraiment un sur-ensemble de C, cependant. Il existe plutôt un sous-ensemble de C ++ composé des constructions de programmation procédurale de base (boucles, ifs et fonctions), qui est très similaire à C.Dans votre cas, je commencerais par cela, puis je progresserais vers des concepts plus avancés comme des classes et des modèles.

La chose la plus importante, à mon humble avis, est d'être exposé à différents paradigmes de programmation, comme procédural, orienté objet, fonctionnel et logique, dès le début, avant que votre cerveau ne se fige dans une seule façon de regarder le monde. Incidemment, je vous recommande également fortement d'apprendre un langage de programmation fonctionnel, comme Scheme. Cela élargirait vraiment vos horizons.

Dima
la source
18

Si vous décidez d'apprendre les deux (et comme d'autres personnes l'ont mentionné, il n'est pas nécessaire explicitement d'apprendre les deux), apprenez d'abord C. Passer du C au C ++ ressemble à une progression naturelle; aller dans l'autre sens, c'est comme attacher délibérément une main derrière le dos. :-)

Chef Geek
la source
13

Je pense que vous devriez d'abord apprendre C, car j'ai appris C d'abord. C m'a donné une bonne compréhension de la syntaxe et des pièges avec des choses comme des pointeurs, qui se retrouvent tous dans C ++.

Je pense que C ++ permet de résumer facilement tous ces pièges (besoin d'un tableau qui ne débordera pas lorsque vous utilisez l'opérateur [] et un index douteux? Bien sûr, créez une classe de tableau qui vérifie les limites) mais vous devez savoir quoi ils le sont et se font mordre par eux avant que vous ne compreniez pourquoi les choses se font de certaines manières.

En fin de compte, la façon dont le C ++ est généralement enseigné est "C ++ est C avec des objets, voici les trucs C et voici comment tous ces trucs OO fonctionnent", donc vous êtes susceptible d'apprendre le C de base avant tout C ++ réel si vous suivez la plupart des textes de toute façon.

Adam Hawes
la source
Je ne suis pas d'accord. Tout livre de programmation en C ++ digne de ce nom couvrira au moins certains des "pièges", tels que le fonctionnement des tableaux (et comment éviter le débordement)
moonman239
12

Je ne suis pas d'accord avec la majorité ici. Je pense que vous devriez apprendre le C avant d'apprendre le C ++. Ce n'est certainement pas nécessaire, mais je pense que cela rend l'apprentissage du C ++ beaucoup plus facile. C est au cœur du C ++. Tout ce que vous apprenez sur C est applicable au C ++, mais C est beaucoup plus petit et plus facile à apprendre.

Prenez K&R et lisez cela. Il est court et vous donnera un sens suffisant de la langue. Une fois que vous avez les bases des pointeurs et des appels de fonctions, vous pouvez passer un peu plus facilement au C ++.

Steve Rowe
la source
15
Faux. Presque tout ce que C vous enseigne est une mauvaise pratique en C ++. C n'est pas au cœur du C ++, il partage juste beaucoup de syntaxe. S'il vous plaît, le monde a déjà plus qu'assez de programmeurs "C avec classes". Apprenez C ou C ++. Mais ne prétendez pas que C est un C ++ lite.
jalf
13
Je maintiens mes paroles. C ++ est construit sur C et donc C est au cœur. Les idiomes utilisés en C ++ sont très différents de ceux utilisés en C, mais la syntaxe est la même. On peut apprendre la bonne façon de programmer C ++ en commençant par C. Regardez C ++ Primer. Il fait essentiellement cela.
Steve Rowe
6
+1. C est une langue plus petite, donc plus facile à apprendre. La tentative d'être rétrocompatible avec C est une source des problèmes majeurs avec C ++, une autre étant le système de modèles trop compliqué à utiliser pour 90% des programmeurs C ++.
hillu
1
Une compréhension des variables, des types [y compris les pointeurs et les qualifications], la portée, les fonctions, le préprocesseur et la liaison est essentielle à la fois en C et en C ++. Je dirais que l'apprentissage de ces concepts avec C sera plus facile afin que vous n'ayez pas à gérer également la connaissance des classes, une autre signification de static, des modèles (et les erreurs de modèle ridiculement intimidantes que les compilateurs émettent), etc.
dreamlax
1
Vous avez un point. En fait, il peut être bon d'apprendre le C pour pouvoir ensuite passer au C ++ avec une meilleure connaissance de ses racines.
Daniel Daranas
10

Au cours du processus d'apprentissage du C ++, vous apprendrez également la majeure partie du C. Mais gardez à l'esprit que beaucoup de code C ++ n'est pas valide C. C ++ a été conçu pour être compatible avec le code C, donc je dirais d'abord apprendre C ++. Brian a écrit une excellente réponse à ce sujet.

John T
la source
8

Comme les réponses à de nombreuses autres questions de la vie, cela dépend. Cela dépend de vos intérêts et objectifs en matière de programmation. Si vous voulez programmer des applications de bureau, peut-être avec une interface graphique, alors C ++ (et POO) est probablement une meilleure solution. Si vous êtes intéressé par la programmation matérielle sur autre chose qu'un chipset x86, C est souvent un meilleur choix, généralement pour sa vitesse. Si vous souhaitez créer un nouveau lecteur multimédia ou écrire une application professionnelle, je choisirais C ++. Si vous voulez faire des simulations scientifiques de collisions de galaxies ou de dynamique des fluides, voyez la puissance de C.

Scottie T
la source
4
Dans de nombreux scénarios de calcul haute performance, ces quelques centaines de cycles d'horloge comptent en effet.
Scottie T
1
@ScottieT: Étant donné qu'à part le restrictspécificateur, C n'a pas d'autre construction syntaxique / sémantique liée aux performances que C ++, pourquoi pensez-vous exactement que le code C ++, avec sa syntaxe plus riche et par exemple la méta-programmation, devrait produire un code plus lent? Connaissez-vous même les modèles d'expression?
Sebastian Mach
1
@phresnel: Pertinence. Le C ++ est un langage extrêmement complexe avec des fonctionnalités qui ne valent souvent pas la peine d'être achetées. En règle générale, C offre les mêmes opportunités de performances que C ++ à un coût de complexité nettement inférieur.
Matt Joiner
1
@MattJoiner: La maintenabilité / l'extensibilité sont également des facteurs de performance, même si je réalise que le code scientifique est souvent ponctuel. Cependant, en répétant l'argument expression-templates-argument (à titre d'exemple), je dis que C ++ a plus d'opportunités d'optimisation, (également parce qu'il est plus facile d'écrire du code-modèle-expression que du code-intrinsèque), à ​​une exception près ( restrictqui cependant tous les principaux compilateurs C ++ fournissent une extension). Et pensez-vous vraiment que, étant donné le même code, il y aura une différence de performances entre C ++ et C, étant donné le même compilateur? [...]
Sébastien Mach
1
@MattJoiner: [...], et en lisant des déclarations comme "autant que je n'aime pas le C ++", je suppose que vous êtes légèrement biaisé dans cette discussion. Selon vous, qu'est-ce qui rend le code C ++ plus performant? Si C a les mêmes opportunités de performances, quel est l'équivalent des modèles d'expression, des modèles en général, des calculs à la compilation sur des types de données non intrinsèques, des foncteurs? Et en ajoutant le facteur coût / maintenabilité: RAII, surcharge d'opérateurs / fonctions, conteneurs standards génériques, threads standards, algorithmes standards génériques, références?
Sebastian Mach
8

L'apprentissage de C vous oblige à réfléchir davantage à certains problèmes tels que la gestion de la mémoire explicite et implicite ou les tailles de stockage des types de données de base au moment où vous écrivez votre code.

Une fois que vous avez atteint un point où vous vous sentez à l'aise avec les fonctionnalités et les dysfonctionnements de C , vous aurez probablement moins de difficulté à apprendre et à écrire en C ++.

Il est tout à fait possible que le code C ++ que vous avez vu n'ait pas l'air très différent du C standard, mais cela pourrait bien être dû au fait qu'il n'était pas orienté objet et n'utilisait pas d'exceptions, d'orientation objet, de modèles ou d'autres fonctionnalités avancées.

Hillu
la source
8

Je pense qu'apprendre d'abord C est une bonne idée.

Il y a une raison pour laquelle les cours comp sci utilisent toujours C.

À mon avis, c'est pour éviter tout «surpeuplement» de l'objet de l'obligation d'exiger la POO.

Je pense que la programmation procédurale est le moyen le plus naturel d'apprendre d'abord la programmation. Je pense que c'est vrai parce qu'en fin de compte, c'est ce que vous avez: des lignes de code qui s'exécutent les unes après les autres.

De nombreux textes poussent aujourd'hui à une approche «objets d'abord» et commencent à parler de voitures et de changements de vitesse avant d'introduire des tableaux.

bobobobo
la source
4
Il semble que de nombreux cours de science-fiction utilisent de nos jours Java, ce qui exacerbe le problème dont vous parlez.
Dima
2
Vous faites un très bon point. En plus d'être beaucoup trop compliqué pour un premier langage, le C ++ encourage la plupart du temps à masquer les interactions de bas niveau avec le système d'exploitation et la mémoire, qui sont essentielles à de bons cours d'informatique. Les tableaux doivent être enseignés bien avant les objets.
Matt Joiner
1
D'un autre côté, si vous n'êtes pas mauvais en maths, la programmation fonctionnelle pourrait être plus naturelle, car elle semble et fonctionne plus familier.
Sebastian Mach
2
"Il y a une raison pour laquelle les cours de science-fiction utilisent toujours C." Ouais, parce que la plupart des cours de science-fiction sont mal enseignés.
Courses de légèreté en orbite
8

Non.

Il est généralement plus utile d'apprendre le C ++ car il est plus proche des langages basés sur OO les plus modernes, comme Eiffel ou C #.

Si votre objectif est d'apprendre le C ++, commencez par apprendre le C ++ moderne et standard. Laissez les mallocs de côté.


Mais Steve Rowe a raison ...

Daniel Daranas
la source
C ++ de nos jours n'est pas plus proche des langages OO comme C # ou Eifel.
einpoklum
7

Ayant observé des gens, qui ont d'abord appris Java, se débattent avec les concepts de pointeurs et de gestion de la mémoire en C ++, je dirais qu'apprendre d'abord C est une bonne idée, afin de saisir ces deux concepts, isolés des complexités des autres C ++ fonctionnalités.

TrayMan
la source
6

Mes deux centimes:

Je suggère d'apprendre d'abord C, car:

  • c'est un langage fondamental - beaucoup de langages descendant du C
  • plus de plates-formes prennent en charge le compilateur C que C ++, qu'il s'agisse de systèmes embarqués, de puces GPU, etc.
  • selon l' indice TIOBE, C est encore environ 2 fois plus populaire que C ++.
Agnius Vasiliauskas
la source
3

je pense que c est un langage de programmation vraiment sympa, il est compact et assez facile à apprendre. mais si vous voulez seulement apprendre le C ++, commencez par C ++. mais je vous suggère d'apprendre les deux. et si vous voulez faire cela; je pense qu'il vaut mieux commencer par c. comme dit précédemment: c'est petit et assez facile à apprendre. pourrait être une belle avancée vers un langage de programmation plus complexe comme le c ++. (puisque c vous donne quelques notions de base)

bonne chance.

Marnix c. R.
la source