158 votes

Pourquoi C++ est relativement plus « difficile » au choix de l’utilisation/mauvaise pour un débutant ?

La plupart des opinions sur un Débordement de Pile semblent exprimer une opinion semblable: C++ est plus "dure" à utiliser et il est un "mauvais" choix pour un débutant. Parlant comme quelqu'un qui a été l'apprentissage de C++ comme première langue, sur mon propre temps comme un hobby, pour quelques mois, il ne semble pas du tout dur. Certes, la première fois que j'ai pris un coup d'oeil à pointeurs et leur relation à raw tableaux, le raisonnement derrière eux semblait fragile. C'était avant que j'ai créé ma première pile.

En fait, quand je regarde C# ou Java, le code, il semble restrictif - pourquoi devrais-je écrire une classe à imprimer "bonjour le monde?"

Je suppose que ma question est: qu'est-ce exactement (caractéristiques réelles; ne me donnez pas de telles généralisations, s'il vous plaît) fait C++ plus difficile/mauvais pour un débutant comme moi? Sinon, ce que fait Java/C#/Python etc. plus facile?

(Cette question peut sembler naïve, parce que je ne pourrais pas être familier avec le plus faible niveau des installations. Je n'ai pas foiré autour avec bits/décalage de bits ou quelque chose comme ça. J'ai aussi n'ont pas fait l'interface graphique/jeu de programmation.)


Ce sont quelques raisons accumulées par les postes suivants:

  • Relation entre les tableaux et les pointeurs
    • L'arithmétique des pointeurs
    • par l'une des erreurs (pas C++ exclusive), et pas de vérification des limites
  • Modèles
  • Manuel de gestion de la mémoire
  • les modules de code (pas C++ exclusive)
  • Préprocesseur
  • chaîne de soutien ne sont pas construits dans

Certaines des solutions à ces problèmes sont les suivants:

  • Pointeurs intelligents pour la gestion de la mémoire
  • RAII pour la gestion de la mémoire
  • les itérateurs pour par l'une des erreurs
  • std::string et std::vector pour atténuer les dmg que char* et arr[] cause


Une autre plainte fréquente semble être du peuple insistance sur le C++ étant "C with Classes". Je pense que la qualité de l'émission, en fait un point discutable, depuis un bon programme en C++ permettra d'éviter la programmation procédurale dans la mesure du possible. Un bon programmeur peut également éviter l'utilisation du préprocesseur lorsque cela est possible (à l'exception du module de prise en charge, où il est plus pratique).

Plusieurs réponses de dire que le C++ est "trop grand", en référence à soit intégré dans des installations ou de la STL. Je pense que c'est moins le mérite parce que les débutants puissent se concentrer sur une petite partie de la langue pour commencer.

Jalf.com soulève un point intéressant que le C++ n'est pas nécessairement difficile en raison de sa large gamme de fonctionnalités, mais parce qu'il vous oblige (il n'y a pas d'option pour ignorer) jongler avec qui, TOUT en apprenant à fait programme. Cette interprétation est l'un des plus plausible que j'ai vu pour le moment.

D'autres personnes à ce jour ont soulevé la question avec le supposé: C++ est plus difficile à apprendre pour les débutants. Je pense que ça a été assez dur à apprendre, mais évidemment je n'ai rien d'autre pour comparer. Vous ne savez pas si votre première voiture se comporte bien jusqu'à ce que vous avez été dans un autre. Je pense que c'est un a compris la vérité que l'apprentissage du C++, c'est comme l'apprentissage d'une transmission manuelle de votre première voiture. Vous comprendrez mieux plus tard, mais vous avez encore jusqu'à la fin de l'équitation que l'embrayage trop. (Il faut du courage pour monter une métaphore longtemps, mais je l'ai fait.)

Un consensus semble être que, une fois que vous maîtrisez le C++, la maîtrise de toute autre langue est extrêmement facile (à l'exception peut-être d'un langage fonctionnel comme F# ou Haskell). Cela semble être l'un des plus utiles raisons d'apprendre le C++ la première fois.


Jalf.com soulève quelques questions intéressantes au sujet de ma propre connaissance de la langue, avec cette question:

Juste pour le plaisir, regardons quelques exemples de code:

int arr[10] = {};
int* p0 = arr + 1; // 1
int* p1 = arr + 10; // 2
int* p2 = arr + 11; // 3
int v0 = arr[11]; // 4

int arr2[5];
int* p3 = arr2 + 2;
int diff = p0 - p3; // 5
float* fp = reinterpret_cast<float*>(p0); // 6

int i = 42;
int j = i++ + ++i; // 7

Lequel de ces lignes sont légales, et quel est le résultat? (Indice: trois Seulement sont valide en C++, et de ceux-ci, l'un d'entre eux renvoie une valeur indéterminée)

Mes suppositions étaient de 1, 5, et 7 étaient légales. Il s'avère que le 1 et 2 sont la morale et de la 6 est légal. C'est un peu d'un appel de réveil pour le degré de complexité ma connaissance de l'usage de pointeurs en C++.

Mise à jour:

Depuis que cette question a commencé à défendre mon choix du C++ comme première langue (et, de plein droit maintenant, ma seule langue), j'ai pensé que je devrais mettre à jour les personnes qui ont répondu à mes progrès.

Mon plus gros problème avec la programmation, de plein droit maintenant, c'est simple: je ne sais pas comment faire quelque chose. Bien sûr, je peux écrire une classe qui est utile à quelqu'un d'autre, mais je ne peux pas écrire tout ce qui serait utile pour moi en quelque sorte. Je ne suis pas sûr, toutefois, si cela n'a rien à voir avec le C++ comme première langue, je me demande si je ne suis pas construit pour être un programmeur. C'est agréable (et très frustrant à la fois), mais je ne suis pas sûr si je pouvais me voir faire cela à temps plein dans l'avenir.

Une chose que je n'aime pas c'est qu'il y a trop de solutions à un même problème. Ceci est favorable à plusieurs différents types de programmeurs, mais je ne me sens pas comme je entrer dans le moule de l'un d'eux. Je pense que c'EST en partie en C++de la faute, mais je ne pouvais pas vous dire comment je me sentirais à propos d'un autre langage comme Python jusqu'à ce que j'ai essayé.

Je vais jouer au tennis dans mon temps libre, puis de les résoudre sudoku si que ou de la socialisation ne sont pas des options. Deux d'entre eux ont de multiples façons de résoudre les problèmes - si mon adversaire se précipite sur le net, il faut que j'métier ou d'essayer et a frappé une croix-cour tir qu'il est impossible de volley? Les deux méthodes ont facilement visible avantages et des inconvénients (le premier étant, si l'on n'est pas assez élevé ou il va? Ce dernier étant, si il les balises pour un gagnant sur la croix-cour?)

Ce n'est pas vrai dans la programmation. Une méthode qui semble absolument parfait pour moi, peut-être hackish, lent, trop complexe, trop ou trop simpliste à un autre programmeur. Ceci, couplé avec mon manque de temps/motivation pour continuer la programmation, m'a empêché de faire plus que l'écriture d'une petite quantité de code à chaque semaine.

Quelqu'un peut penser à un moyen de me motiver cette étape passée, ou pensent-ils que je doit juste donner à ce hobby?

110voto

jalf Points 142628

Parlant comme quelqu'un qui a été l'apprentissage de C++ comme première langue, sur mon temps comme un hobby, pour quelques mois, il ne semble pas du tout dur

Eh bien, vous pourriez avoir appris une autre langue dans une semaine. ;)

Mais plus important encore, combien de bogues subtils pensez-vous que votre pile contient? Il n'est pas difficile d'écrire quelque chose qu'un compilateur C++ accepte. Avec un peu d'effort, vous pouvez même faire le programme qui en résulte apparemment de se comporter comme vous le souhaitez. Mais il y aura presque certainement être encore d'innombrables subtile mais bogues critiques. Bien sûr, je ne peux pas les déterminer sans y voir certains de votre code, mais je suis prêt à parier qu'ils sont là.

Vous avez raison, C# et Java sont restrictives. Ce qui est une bénédiction et une malédiction. À certains égards, c'est une douleur (comme vous le dites, d'avoir à créer une classe pour un simple "hello world" est stupide, même si elle fait moins de différence pour les grands programmes - autres langues ne nécessitent pas la classe), mais l'avantage c'est qu'en plus restrictive, le compilateur est capable de capturer un grand nombre d'erreurs qu'en C++, n'aurait pas été détectée jusqu'à ce que vous avez exécuté le programme. Ou peut-être jusqu'à ce que quelqu'un d'autre a couru le programme sur un autre ordinateur, le premier lundi de Mai. Le problème avec le C++, c'est que les bugs deviennent extrêmement imprévisible.

C++ est un énorme langue, et l'apprentissage de toutes les subtilités de il prend une éternité, mais ce n'est pas la raison, c'est une mauvaise débutants de la langue (si c'était tous, débutants pourrait juste se concentrer sur un petit sous-ensemble de la langue initialement). Le vrai problème, c'est qu'il est extrêmement difficile d'obtenir le droit.

Et tout simplement que lorsque vous êtes à l'apprentissage de la programmation, l'important, c'est vraiment indépendant de la langue. Apprendre à s'exprimer dans le code, la rupture de tout problème en quelque chose qui peut être exprimé en termes d'un langage de programmation, c'est la compétence importante. Mais le C++ vous oblige à apprendre que tout en jonglant très complexe de la langue, où vous avez également de comprendre les pointeurs, manuel de gestion de la mémoire, de traiter avec l'extérieur des limites d'un tableau accède, cryptique modèle des erreurs de compilation, les fuites de mémoire, plus de fuites de mémoire et d'innombrables cas de comportement indéfini. (cas où le compilateur accepte le code, mais la langue standard ne précise pas le comportement, ce qui signifie que quelque chose pourrait se produire, même si le code semble fonctionner. C++ dispose d'un grand nombre de ces cas, alors que la plupart des langues essayer d'attraper ou d'éviter toutes ces erreurs à la compilation)

Il serait généralement beaucoup plus efficace de se concentrer sur un seul à la fois. Commencer l'apprentissage de la programmation dans une langue qui ne place pas trop d'obstacles en face de vous. Et puis, quand vous avez eu une emprise sur la programmation en général, vous pouvez vous concentrer sur les subtilités de C++.

(Je sais que je n'ai pas mentionné de nombreuses fonctionnalités spécifiques comme vous l'avez demandé. Le problème est que la plupart des fonctionnalités de C++ sont relativement simples (modèle de spécialisations et des pointeurs ont tendance à aller les gens, mais ils sont gérables, au moins. Modèle de métaprogrammation serait probablement vous conduire fou, mais c'est normal ;)). Le problème, c'est toute la plomberie dans le reste de la langue. Les nombreuses erreurs imprévisibles que de temps à la surface, et uniquement lorsque vous exécutez le programme sur certains ordinateurs, dans un mauvais jour, ou les problèmes que vous pourriez rencontrer en essayant d'obtenir le constructeur, constructeur de copie, opérateur d'affectation et le destructeur de la classe à tous de travailler ensemble afin d'assurer les ressources sont en fuite, et que la classe est toujours dans un état valide.

Le problème avec le C++ est de toutes les choses qui semblent fonctionner.

Modifier

Juste pour le plaisir, regardons quelques exemples de code:

int arr[10] = {};
int* p0 = arr + 1; // 1
int* p1 = arr + 10; // 2
int* p2 = arr + 11; // 3
int v0 = arr[11]; // 4

int arr2[5];
int* p3 = arr2 + 2;
int diff = p0 - p3; // 5
float* fp = reinterpret_cast<float*>(p0); // 6

int i = 42;
int j = i++ + ++i; // 7

Lequel de ces lignes sont légales, et quel est le résultat? (Indice: trois Seulement sont valide en C++, et de ceux-ci, l'un d'entre eux renvoie une valeur indéterminée)

46voto

Comptrol Points 4415

Il n’est pas que dur, vous pouvez l’apprendre en 21 jours ! :

alt text

35voto

jeffamaphone Points 31732

Restrictive est plus facile. C et C++ vous permettent de vous tirer une balle dans la tête (et ceux qui vous entourent) à chaque tour.

Cela dit, je pense que C et C++ sont des langues très bien pour un débutant, mais vous devriez vraiment quelqu'un autour d’avoir pour vous guider et de revoir votre travail si c’est du tout critique. Un mentor, si vous voulez.

27voto

Konrad Rudolph Points 231505

J'ai hate de contribuer à cette question si tard, mais je pense qu'il reste une chose importante non-dit.

Les langages tels que C++ sont difficiles à apprendre "correctement" (quoi que cela signifie) et incroyablement facile à apprendre, à tort: en tant que débutant, sans expérience, vous permettra de couper les coins ronds dans la mesure du possible et vous allez faire des choses contraires à la conception parce que vous ne comprenez pas les raisons derrière un (apparemment complexe) de la conception.

Il n'y a certainement pas une seule bonne façon de programmer en C++ mais il y a certainement une foule de mauvaises façons. Pire encore, la plupart des ressources d'apprentissage sont incroyablement. mal. Ils sont vraiment que de mauvais. Ils ont non seulement encourager les mauvais, les erreurs de style, ils l'enseignent que le canon. Déclarant main avec le type de retour void peut-être une chose, mais pas de libérer des ressources (correctement), de ne pas donner des classes de base virtuelles destructeurs, à l'aide de tableaux polymorphes, en favorisant void* de modèles sont quelques-unes des choses hors de ma tête que la plupart des livres de enseignement pour C++ obtenir, en permanence, mal.

Si vous êtes en train d'apprendre le C++ sans orientation adéquate, vous êtes une proie facile pour ces pratiques dangereuses et il faut de l'année à désapprendre ces mécanismes. Ayant commencé avec BASE moi-même, je peux témoigner de la force destructrice de la mauvaise matériel d'enseignement. Fondamentalement, les trois premières années de mon apprentissage de la programmation ont été complète des déchets. Trois années perdues. Qui est de me donner un remboursement?

18voto

SeanX Points 1475

C++ est beaucoup plus difficile à apprendre que le python. Il est également beaucoup plus pédagogique.

Si vous avez un prêt, enseignant compétent, je voudrais profiter de l'occasion pour apprendre le c++. Une fois que vous comprenez la gestion de la mémoire, pointeurs, typage fort et comme vous serez beaucoup mieux équipés pour un éventail de programmes.

C'est comme apprendre à conduire une voiture, si vous apprenez à l'aide d'un stick shift puis automatique est facile. Si vous apprendre à conduire sur une automatique, la conduite d'un levier de vitesse est un cauchemar.

Voir Joël article pour son point de vue sur Java écoles. Beaucoup de choses identiques s'appliquent.

Le revers de la médaille est, pour la plupart des choses que vous voulez programmer, c++ n'est pas le meilleur choix. Pour les applications web, utiliser .net, python, ruby, etc. Pour windows les applications de bureau, d'utiliser delphi ou .etc net. Mais si vous savez, c++, puis les autres sont faciles à ramasser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X