¿Debería aprender C antes de aprender C ++? [cerrado]

116

Hoy visité un día de puertas abiertas del departamento de informática de la universidad y en el recorrido de los laboratorios nos sentamos a jugar con un par de proyectos de último año de estudiantes de pregrado. Uno era particularmente bueno: una especie de juego de asteroides FPS. Decidí echar un vistazo en el srcdirectorio para encontrar que estaba hecho en C ++ (la mayoría de los otros proyectos eran aplicaciones Java 3D).

No he hecho nada de C antes, pero he revisado algunos códigos de C. Por lo que vi en el código .cpp de este juego, no se veía muy diferente.

Estoy interesado en aprender C o C ++, pero probablemente aprenderé el otro más adelante. ¿Hay alguna ventaja para mí aprender uno antes que el otro y, de ser así, cuál?

Ross
fuente
Duplicado: stackoverflow.com/questions/171126/…
David Segonds
7
Realmente no es un duplicado. Implícitamente, esta pregunta también "debería aprender programación orientada a objetos o la programación de procedimiento primera"
bobobobo
2
Antes de descender a la continuación respuestas (OMI van en círculos), me permiten ofrecer algunos consejos: VERDADERO : C ++ qué conservan todas las características y atributos aplicados a C, así implícitamente ' obsoleto a ' C (el punto de la mayor parte de las respuestas a continuación intento para hacer). SIN EMBARGO : C no está , no , NO ESTÁ MUERTO. La gente parece aferrarse al tropo de ' no hay necesidad de aprender ambos ' para la vida, pero en realidad esto no tiene base. Para tomar prestada la sintaxis procedente de C, C ++! = C . Conocer C ++ NO lo convertirá en un desarrollador C calificado y, del mismo modo, saber C NO lo convertirá en un desarrollador C ++ calificado.
Super Cat
4
DICHO ESO : NO hay nada de malo en tomar C antes de profundizar en C ++. Cuanto más sepa, mejor será . Pero por el contrario, no hay necesidad de aprender C si su objetivo final es aprender C ++ . SI usted quiere aprender C ++, ir a aprender C ++ , y si quieres aprender C t, ir a aprender C . Ambos tienen pros y contras (la simplicidad de C y las características -en profundidad- de C ++ son maldiciones y bendiciones a su manera), y ambos todavía se usan hoy (C para sistemas embebidos, Unity, PHP, etc. - C ++ también para Unity, Unreal, etc.).
Super Cat
3
PUNTO: ¿Quiere aprender C ++? Luego omita C. No lo necesita. ¿Quieres aprender C? Entonces bien, ve a aprender C. Si quieres aprender ambos, entonces elige C primero. Ambos tienen su lugar en el mundo, así que no creas que uno es suficiente para el otro.
Super Cat

Respuestas:

121

No es necesario aprender C antes de aprender C ++.

Son idiomas diferentes . Es un error común pensar que C ++ depende de alguna manera de C y no de un lenguaje completamente especificado por sí solo.

El hecho de que C ++ comparta gran parte de la misma sintaxis y mucha de la misma semántica no significa que primero deba aprender C.

Si aprende C ++, eventualmente aprenderá la mayor parte de C con algunas diferencias entre los lenguajes que aprenderá con el tiempo. De hecho, es muy difícil escribir C ++ adecuado porque los programadores de C ++ intermedios tienden a escribir C / C ++. Eso es cierto tanto si empezó con C como si no.

Si conoce C primero, entonces es una buena ventaja aprender C ++. Comenzará por conocer una parte del idioma. Si no conoce C primero, entonces no tiene sentido enfocarse en un idioma diferente. Hay muchos buenos libros y tutoriales disponibles que comienzan sin saber nada y cubrirán todo lo que aprendería de C que también se aplica a C ++.

Consulte el razonamiento adicional en esta respuesta .

Brian R. Bondy
fuente
33
No podría estar más en desacuerdo. Aprender C ++ primero hace que sea una experiencia muy difícil "volver" a C. C es un lenguaje de sistemas fundamental, solo básico. C ++ es un juego de pelota completamente nuevo, los enfoques a cualquier problema en cualquiera de los lenguajes serán muy diferentes. Tuve la suerte de jugar con C antes de saltar a un trabajo de C ++. Posteriormente, soy capaz de "hervir" mentalmente el azúcar sintáctico que proporciona C ++ y puedo abordar problemas con cualquiera de los dos lenguajes. Es muy fácil para mí identificar C como la parte "hace cosas" del par de idiomas. Aprender C ++ primero conducirá a programadores confundidos y engañados.
Matt Joiner
24
@ Matt: Primero aprendí C ++ y no soy un programador engañado. Así que su afirmación no es cierta, prueba por contraejemplo. Y sí, también tengo una insignia dorada en C. La verdad del asunto es que son 2 idiomas distintos y distintos. No necesitas un idioma como dependencia para aprender el otro. Eso es solo un error tonto.
Brian R. Bondy
8
@Matt: También de mi publicación vinculada: primero debes aprender C ++, no porque aprender C primero te hará daño, no porque tendrás que desaprender algo (no lo harás), sino porque no hay beneficio en aprender C primero. Eventualmente aprenderá casi todo sobre C de todos modos porque está más o menos contenido en C ++.
Brian R. Bondy
11
@ Matt: Lamento que aún no entiendas. Dibuja un diagrama de Venn de C y C ++ y observa las partes que se cruzan. C ++ está compuesto por todo el círculo de C ++ que dibuja, no solo las partes que no se cruzan. Si conoce primero C, es bueno que aprenda C ++ más rápido. Si no conoce C primero, no hay razón para aprenderlo primero. ¿Asume que todos los libros sobre C ++ no cubrirán punteros y administración de memoria, cadenas literales, etc.? Voy a dejar de discutir ahora, pero siéntete libre de dejar tus comentarios finales.
Brian R. Bondy
11
@Matt: ¿cómo conduce C a una mejor comprensión de C ++? Por lo general, los programadores de C que aprenden C ++ terminan escribiendo un código de estilo "C con clases" feo y propenso a errores. No digo que esto siempre suceda, pero es la progresión más natural cuando se empieza con C, porque C está mucho más cerca de ese horrible estilo de C ++ que de C ++ "moderno".
jalf
76

Me encanta esta pregunta, es como preguntar "¿qué debo aprender primero, a hacer snowboard o esquiar"? Creo que depende de si quieres hacer snowboard o esquiar. Si quieres hacer ambas cosas, tienes que aprender ambas.

En ambos deportes, te deslizas por una colina sobre la nieve utilizando dispositivos que son lo suficientemente similares como para provocar esta pregunta. Sin embargo, también son lo suficientemente diferentes como para que aprender uno no te ayude mucho con el otro. Lo mismo ocurre con C y C ++. Si bien parecen ser lenguajes lo suficientemente similares en sintaxis, la mentalidad que necesita para escribir código OO frente a código de procedimiento es lo suficientemente diferente como para que tenga que comenzar desde el principio, independientemente del idioma que aprenda en segundo lugar.

cdonner
fuente
70

Primero aprendí C, y tomé un curso en estructuras de datos que usaban C, antes de aprender C ++. Esto ha funcionado bien para mí. Un curso de estructuras de datos en C me dio una sólida comprensión de los punteros y la gestión de la memoria. También hizo obvios los beneficios del paradigma orientado a objetos, una vez que aprendí lo que era.

Por otro lado, al aprender C primero, he desarrollado algunos hábitos que inicialmente me hicieron escribir código C ++ incorrecto, como el uso excesivo de punteros (cuando las referencias de C ++ bastarían) y el preprocesador.

C ++ es realmente un lenguaje muy complejo con muchas características. Sin embargo, no es realmente un superconjunto de C. Más bien, hay un subconjunto de C ++ que consta de las construcciones básicas de programación de procedimientos (bucles, ifs y funciones), que es muy similar a C.En su caso, comenzaría con eso y luego avanzaría hasta conceptos más avanzados. como clases y plantillas.

Lo más importante, en mi humilde opinión, es estar expuesto a diferentes paradigmas de programación, como procedimental, orientado a objetos, funcional y lógico, desde el principio, antes de que su cerebro se congele en una forma de ver el mundo. Por cierto, también te recomiendo que aprendas un lenguaje de programación funcional, como Scheme. Realmente expandiría sus horizontes.

Dima
fuente
18

Si decide aprender ambos (y como han mencionado otras personas, no hay una necesidad explícita de aprender ambos), aprenda C primero. Pasar de C a C ++ se siente como una progresión natural; ir en sentido contrario se siente como atarse deliberadamente una mano a la espalda. :-)

Jefe Geek
fuente
13

Creo que deberías aprender C primero, porque yo aprendí C primero. C me dio una buena comprensión de la sintaxis y errores con cosas como punteros, todos los cuales fluyen hacia C ++.

Creo que C ++ facilita el cierre de todas esas trampas (¿necesita una matriz que no se desborde cuando usa el operador [] y un índice poco fiable? Claro, haga una clase de matriz que verifique los límites) pero necesita saber qué lo son y te muerden antes de que entiendas por qué se hacen las cosas de cierta manera.

Cuando todo está dicho y hecho, la forma en que generalmente se enseña C ++ es "C ++ es C con objetos, aquí está el material de C y así es como funciona todo esto de OO", por lo que es probable que aprenda C básico antes que cualquier C ++ real si siga la mayoría de los textos de todos modos.

Adam Hawes
fuente
Estoy en desacuerdo. Cualquier libro de programación en C ++ que se
precie
12

No estoy de acuerdo con la mayoría aquí. Creo que debería aprender C antes de aprender C ++. Definitivamente no es necesario, pero creo que facilita mucho el aprendizaje de C ++. C está en el corazón de C ++. Todo lo que aprenda sobre C es aplicable a C ++, pero C es mucho más pequeño y más fácil de aprender.

Recoge K&R y léelo. Es breve y le dará un sentido suficiente del idioma. Una vez que tenga los conceptos básicos de punteros y llamadas a funciones, puede pasar a C ++ un poco más fácilmente.

Steve Rowe
fuente
15
Incorrecto. Prácticamente todo lo que C te enseña es una mala práctica en C ++. C no está en el corazón de C ++, simplemente comparte mucha sintaxis. Por favor, el mundo ya tiene más que suficientes programadores "C con clases". Aprenda C o C ++. Pero no finja que C es un C ++ lite.
jalf
13
Mantengo mis palabras. C ++ está construido sobre C y, por lo tanto, C está en su corazón. Los modismos utilizados en C ++ son muy diferentes a los utilizados en C, pero la sintaxis es la misma. Uno puede aprender la forma correcta de programar C ++ comenzando con C. Mire C ++ Primer. Básicamente hace eso.
Steve Rowe
6
+1. C es un idioma más pequeño, por lo que es más fácil de aprender. El intento de ser compatible con versiones anteriores de C es una fuente de los principales problemas con C ++, otro es el sistema de plantillas que es demasiado complicado para que lo utilicen el 90% de los programadores de C ++.
hillu
1
La comprensión de las variables, los tipos [incluidos los punteros y las calificaciones], el alcance, las funciones, el preprocesador y el enlace es esencial tanto para C como para C ++. Yo diría que aprender estos conceptos con C será más fácil para que no tenga que lidiar también con conocer clases, otro significado de staticplantillas (y los errores de plantilla ridículamente intimidantes que emiten los compiladores), etc.
dreamlax
1
Usted tiene un punto. En realidad, puede ser bueno aprender C para luego pasar a C ++ con un mejor conocimiento de sus raíces.
Daniel Daranas
10

En el proceso de aprendizaje de C ++, también aprenderá la mayor parte de C. Pero tenga en cuenta que gran parte del código C ++ no es válido C. C ++ fue diseñado para ser compatible con el código C, así que diría que primero aprenda C ++. Brian escribió una gran respuesta al respecto.

John T
fuente
8

Como las respuestas a muchas otras preguntas de la vida, depende. Depende de cuáles sean sus intereses y objetivos de programación. Si desea programar aplicaciones de escritorio, tal vez con una GUI, entonces C ++ (y OOP) es probablemente una mejor manera de hacerlo. Si está interesado en la programación de hardware en algo que no sea un chipset x86, entonces C suele ser una mejor opción, generalmente por su velocidad. Si desea crear un nuevo reproductor multimedia o escribir una aplicación comercial, elegiría C ++. Si desea realizar simulaciones científicas de colisiones de galaxias o dinámica de fluidos, contemple el poder de C.

Scottie T
fuente
4
En muchos escenarios de computación de alto rendimiento, esos pocos cientos de ciclos de reloj sí importan.
Scottie T
1
@ScottieT: Dado que aparte del restrictespecificador C no tiene otra construcción sintáctica / semántica relacionada con el rendimiento que C ++, ¿por qué exactamente crees que el código C ++, con su sintaxis más rica y, por ejemplo, metaprogramación, debería producir un código más lento? ¿Conoces siquiera las plantillas de expresión?
Sebastian Mach
1
@phresnel: Relevancia. C ++ es un lenguaje extremadamente complejo con características que a menudo no valen la pena. Como regla general, C brinda las mismas oportunidades de rendimiento que C ++ a un costo de complejidad significativamente menor.
Matt Joiner
1
@MattJoiner: La capacidad de mantenimiento / extensibilidad también son factores de rendimiento, aunque me doy cuenta de que el código científico suele ser de una sola vez. Sin embargo, repitiendo el argumento de plantillas de expresión (como ejemplo), digo que C ++ tiene más oportunidades de optimización (también porque es más fácil escribir código de plantilla de expresión que código intrínseco), con una excepción ( restrict, que sin embargo todos los principales compiladores de C ++ se proporcionan como una extensión). ¿Y realmente cree que, dado el mismo código, habrá alguna diferencia en el rendimiento entre C ++ y C, dado el mismo compilador? [...]
Sebastian Mach
1
@MattJoiner: [...], y al leer declaraciones como "por mucho que no me guste C ++", permítame construir la suposición de que está ligeramente sesgado en esta discusión. ¿Qué crees exactamente que hace que el código C ++ funcione peor? Si C tiene las mismas oportunidades de rendimiento, ¿cuál es el equivalente de plantillas de expresión, plantillas en general, cálculos en tiempo de compilación en tipos de datos no intrínsecos, functores? Y agregando el costo / factor de mantenibilidad: RAII, sobrecarga de operador / función, contenedores estándar genéricos, hilos estándar, algoritmos estándar genéricos, referencias.
Sebastian Mach
8

Aprender C lo obliga a pensar más en algunos problemas, como la administración de memoria explícita e implícita o los tamaños de almacenamiento de los tipos de datos básicos en el momento de escribir su código.

Una vez que haya llegado a un punto en el que se sienta cómodo con las características y errores de C , probablemente tendrá menos problemas para aprender y escribir en C ++.

Es muy posible que el código C ++ que ha visto no se vea muy diferente del C estándar, pero eso puede deberse a que no estaba orientado a objetos y no usaba excepciones, orientación a objetos, plantillas u otras características avanzadas.

hillu
fuente
8

Creo que aprender primero C es una buena idea.

Hay una razón por la que los cursos de ciencias de la competencia todavía usan C.

En mi opinión, es para evitar todo el "hacinamiento" del tema que conlleva la obligación de requerir OOP.

Creo que la programación procedimental es la forma más natural de aprender primero a programar. Creo que eso es cierto porque al final del día es lo que tienes: líneas de código ejecutándose una tras otra.

Muchos textos de hoy están impulsando un enfoque de "los objetos primero" y comienzan a hablar sobre automóviles y cambios de marcha antes de introducir matrices.

bobobobo
fuente
4
Parece que muchos cursos de comp sci en estos días usan Java, lo que agrava el problema del que estás hablando.
Dima
2
Tienes un muy buen punto. Además de ser demasiado complicado para un primer idioma, C ++ en su mayor parte fomenta la ocultación de la interacción de bajo nivel con el sistema operativo y la memoria que son fundamentales para una buena formación en informática. Las matrices deben enseñarse mucho antes que los objetos.
Matt Joiner
1
Por otro lado, si no eres malo en matemáticas, la programación funcional puede ser más natural, porque se ve, se siente y funciona más familiar.
Sebastian Mach
2
"Hay una razón por la que los cursos de ciencias de la computación todavía usan C." Sí, porque la mayoría de los cursos de ciencias de la computación se imparten mal.
Lightness Races in Orbit
8

No.

En general, es más útil aprender C ++ porque está más cerca de los lenguajes basados ​​en OO más modernos, como Eiffel o C #.

Si su objetivo es aprender C ++, aprenda C ++ estándar y moderno en primer lugar. Deja los mallocs a un lado.


Pero Steve Rowe tiene razón ...

Daniel Daranas
fuente
C ++ hoy en día no está más cerca de los lenguajes OO como C # o Eifel.
einpoklum
7

Habiendo observado a las personas, que han aprendido Java primero, que luchan con los conceptos de punteros y gestión de la memoria en C ++, diría que aprender C primero es una buena idea, para comprender estos dos conceptos, aislados de las complejidades de otros C ++ caracteristicas.

TrayMan
fuente
6

Mis dos centavos:

Sugiero aprender C primero, porque:

  • es un lenguaje fundamental - muchos lenguajes descendientes de C
  • más plataformas admiten el compilador C que C ++, ya sean sistemas integrados, chips GPU, etc.
  • según TIOBE, el índice C sigue siendo aproximadamente 2 veces más popular que C ++.
Agnius Vasiliauskas
fuente
3

Creo que c es un lenguaje de programación realmente agradable, es compacto y algo fácil de aprender. pero si solo quiere aprender c ++ comience con c ++. pero te sugiero que aprendas ambos. y si quieres hacer eso; creo que es mejor empezar con c. como se dijo antes: es pequeño y algo fácil de aprender. podría ser un buen paso hacia un lenguaje de programación más complejo como c ++. (ya que c le proporciona algunos conceptos básicos)

buena suerte.

Marnix contra R.
fuente