forma práctica de aprender C? [cerrado]

10

Quiero profundizar en C y normalmente cuando quiero aprender un nuevo lenguaje pienso en un objetivo de proyecto simple / alcanzable que tiene un propósito práctico (hacer uso de una API, automatizar una tarea, etc.)

Me está costando más trabajo encontrar uno para C, principalmente porque todo lo que leo apunta al hecho de que el uso principal de C actualmente es en sistemas embebidos y proyectos de software más complejos como los sistemas operativos.

¿Esto me señala el hecho de que no necesito aprenderlo o que solo necesito ser un poco más complicado en mi estrategia de aprendizaje?

¿Referencias a recursos prácticos de aprendizaje? (tutorial / cómo hacerlo produce un resultado final que tiene algún propósito / beneficio)

jondavidjohn
fuente
3
Obtendrá respuestas más sensatas si puede decirnos ¿POR QUÉ desea aprender C?
zvrba
2
Estoy de acuerdo con zvrba. C es ideal para cosas rápidas de bajo nivel y para el código del controlador. Si estás escribiendo código para juegos, también es genial (aunque probablemente estarías trabajando con codificadores de C ++ que se quejarán de ti por escribir código "no estándar"). Sin embargo, creo que Assembly y C son similares al latín (en los idiomas hablados), no fueron los primeros, pero la mayoría que vino después de ellos usaron las ideas y construcciones de ellos para crear sus propios idiomas. Por lo tanto, estudiar C MIGHT puede darle una mejor comprensión de los idiomas de nivel superior
Jamie Taylor
¿Has echado un vistazo a Learn C The Hard Way de Zed Shaw ? Casi tan práctico como uno puede ser, y bastante gratis también.
Wyatt Barnett
la persona de Python the Hard Way ahora tiene libros para otros idiomas, incluida una versión alfa para C, comenzaría allí. C es de alto nivel, una gran diferencia con ASM, odio la comparación con ASM ya que es falso. Relativamente seguro, te permite hacer lo que otros idiomas no hacen. No importa lo que quiera hacer cualquier aplicación que pueda escribir en C, no hay razón para dirigir la aplicación al lenguaje.
old_timer

Respuestas:

27

Solo recomendaría recoger una copia de Kernighan y Ritchie's The C Programming Language (2nd Edition) . Tiene una serie de ejercicios al final de cada capítulo que puede hacer, además de proporcionar una muy buena introducción al lenguaje C. No lo convertirá en un maestro del lenguaje, pero debe tener una buena comprensión al final del libro y los ejercicios para quizás encontrar un proyecto de código abierto escrito en C en el que pueda leer la fuente y quizás contribuir a.

Si desea ver proyectos reales del mundo real con código C en ellos. Se está volviendo más difícil: muchos proyectos usan un lenguaje de "nivel superior", pero C todavía está vivo y coleando. Si quieres aprender C, no tengas miedo de reinventar la rueda para lograr el aprendizaje. No es una buena idea reinventar soluciones en el reloj, pero está perfectamente bien hacerlo como un ejercicio académico.

Thomas Owens
fuente
1
Agregue las preguntas frecuentes de comp.lang.c a eso. c-faq.com
Mike Sherrill 'Cat Recall'
3
+1 para que no te importe reinventar soluciones para aprender.
un CVn
44
K&R es horrible para aprender un buen estilo de programación en general, y horrible para enseñar prácticas de programación C seguras / sanas en particular. Todos los fragmentos de código en su interior están ofuscados en el mejor de los casos, la mayoría de las veces enseñan hábitos totalmente peligrosos. Es un libro desactualizado, no lo recomendaría para nada más que nostalgia. Es especialmente inadecuado para programadores principiantes.
2
@Thomas Sí, la 2da edición. Puede citar prácticamente cualquier fragmento de código y probablemente pueda señalar 2-3 casos de práctica peligrosa / deficiente en él. Abriré el libro ahora mismo y elegiré algún ejemplo al azar. Ok, aquí vamos, p119: asignación dentro de las condiciones, uso de tipos de datos primitivos nativos, uso de int implícito (sin signo), conversión del resultado de malloc (¡muy malo!), Conversión del parámetro a libre para anular * (¿por qué ??? ), retornos múltiples (también conocidos como espagueti), usando NULL sin el #include apropiado, si no tiene {}.
2
+ 1 para KnR C. Es la mejor (y más concisa) introducción a la programación en un lenguaje específico que he leído. Como otros han señalado, puede ser un poco dudoso en algunos lugares: el único consejo que daría es este: si alguna vez hubo un manual de programación que requirió que leyeras la propaganda circundante, este es. Por lo general, puede deducir otros del bloque de código, pero este libro requiere que lo lea de principio a fin, al menos, una vez.
Jamie Taylor
1

Tendrás que entender realmente la asignación de memoria. Parece que ha usado otros idiomas anteriormente, pero es probable que esos otros idiomas le oculten los detalles sangrientos de la administración de memoria. En C, la gestión de la memoria siempre es explícita. Hay algunas ventajas en esto, pero significa que debes tener cuidado para hacerlo bien o todo el infierno se desatará.

Utilice las funciones de depuración de memoria disponibles para la plataforma que utilice. Para Linux hay Electric Fence, en Mac OS X hay Guard Malloc. También existe Valgrind, que admite varios sistemas operativos.

Si no puede liberar la memoria que debería liberarse, tendrá una pérdida de memoria. Sigue haciendo eso y te quedarás sin memoria. Incluso con la tienda de respaldo (lo que la mayoría de la gente llama memoria virtual), puede hacer que el sistema pagine en exceso o incluso se quede sin espacio de intercambio.

Si libera memoria que ya se ha liberado, dañará el montón y se bloqueará, pero probablemente no de inmediato. También dañará el montón si sobrepasa un búfer. Las herramientas de depuración de memoria ayudarán con todo esto.

Las pruebas unitarias también ayudan.

Mike Crawford
fuente
0

Estoy de acuerdo con la mayoría de las personas aquí que hoy los idiomas están determinados por la tarea en cuestión. Hubo un tiempo en que tenías opciones limitadas a este respecto. Hoy en día, C se usa principalmente en el dominio de programación Embedded / System donde existe la necesidad de optimización de código. Necesitas escribir códigos precisos para obtener el máximo porque si alguna vez comienzas a usar esa abstracción, entonces el material subyacente tiene que ser muy robusto. Yo diría que intentas sortear algunos proyectos GNU de código abierto como Linux o algo que necesite desarrolladores C. Prueba tu suerte en esos proyectos en lugar de escribir algo nuevo en C. Esta es probablemente la mejor manera de escribir códigos y aprender un idioma.

Nishant
fuente
En realidad, dudo que saltar de cabeza a un proyecto establecido, aunque sea menor, sea una buena manera de comenzar a aprender un idioma desde cero. Es muy probable que ponerse en forma por encima de su cabeza, y también tendrá la carga adicional de simplemente tratar de navegar por el código, incluso si todo lo que se propuso hacer es entender cómo funciona el código. Un kernel del sistema operativo en particular es un software increíblemente complejo.
un CVn
Sí, pero supongo que el interrogador realmente pasó por el libro de K&R o algo así. Me recomendaron este enfoque cuando pregunté en el canal Python. ¿Sería diferente en C?
Nishant
Estrictamente hablando, no sé si sería muy diferente, pero en C, es necesario prestar mucha más atención a los detalles esenciales que en un lenguaje de alto nivel como Python. Gestión de memoria, por mencionar solo una cosa. Saltar a un proyecto establecido y potencialmente grande cuando recién estás comenzando con un idioma podría no ser la mejor manera de hacerlo.
un CVn
0

Vas a querer hacer algo que funcione desde la línea de comandos. La programación de GUI en C es una molestia importante, incluso con un buen marco de GUI.

Mi sugerencia habitual para una experiencia práctica de aprendizaje de C ha sido una lista de contactos u otra aplicación de administración de datos simple. Eso cubrirá la mayoría de los bits importantes (E / S, administración de memoria, procesamiento de texto, etc.), y no tendrá que usar nada fuera de la biblioteca estándar de C para lograrlo. C no tiene ningún soporte incorporado para gráficos, redes, sonido o mucho más 1 , por lo que para su primera incursión en la programación de C es mejor evitar cualquier cosa que se base en ese tipo de cosas.

C puede usarse para programación de propósito general; solo tiene que reducir sus expectativas un poco (imagine que es 1983 y está sentado frente a un VT52 conectado a un VAX 11/750, y tendrá la mentalidad correcta).

Solo recuerda, C no tiene protectores de cuchillas y no te impedirá hacer algo estúpido. La definición del lenguaje es un poco floja en algunos lugares, y hay algunas operaciones que no son ilegales como tales, pero tampoco están bien definidas.


1 - La última revisión (2011) del estándar del lenguaje ha agregado soporte de subprocesos incorporado

John Bode
fuente
0

Recomiendo el Proyecto Euler . Lo usé para mejorar mi C ++ y es increíble. Es genial porque cada problema es una tarea pequeña que puede tardar menos de una hora en completarse (al menos las primeras).

Necesitará un generador de perfiles y un libro sobre la optimización del código para la velocidad. Asegúrese de cumplir con la regla de 1 minuto: debe obtener la respuesta en 1 minuto.

B Seven
fuente
0

Si ya eres un programador, y SOLO necesitas aprender C, y no te importa aprender una versión anterior del lenguaje (el núcleo sigue siendo prácticamente el mismo), entonces "C for Programmers" de Leendert Ammeraal no puede ser mejor. . Trabaja en ello, de principio a fin.

John R. Strohm
fuente