last - estructura general de un programa en lenguaje c
¿Qué versión de C es más apropiada para que los estudiantes aprendan: C89/90 o C99? (8)
Aunque en general estoy de acuerdo con los demás, vale la pena señalar que K&R es un libro tan bueno que vale la pena aprender C de él y luego actualizar sus conocimientos a medida que lee sobre el estándar C99.
Estoy buscando aprender los conceptos básicos y la sintaxis de C antes de comenzar la Programación de Sistemas el próximo mes. Al leer un poco, me encontré con los estándares C89 / 99. Según Wikipedia,
C99 introdujo varias características nuevas, incluyendo funciones en línea, varios tipos de datos nuevos (incluyendo long int largo y un tipo complejo para representar números complejos), arreglos de longitud variable, soporte para macros variadic (macros de aridad variable) y soporte para una línea comentarios que comienzan con //, como en BCPL o C ++. Muchos de estos ya se habían implementado como extensiones en varios compiladores de C.
C99 es en su mayor parte compatible con C90, pero es más estricto en algunos aspectos; en particular, una declaración que carece de un especificador de tipo ya no se ha asumido implícitamente. Una macro estándar STDC_VERSION se define con el valor 199901L para indicar que el soporte de C99 está disponible. GCC, Sun Studio y otros compiladores ahora admiten muchas o todas las funciones nuevas de C99.
Tomé prestada una copia de K&R, 2ª edición, y utiliza el estándar C89. Para un estudiante, ¿el uso de C89 invalida algunas de las asignaturas cubiertas en K&R y, de ser así, qué debo tener en cuenta?
Como estudiante, eso no te influencia mucho. Pero si es posible, deberías encontrar un nuevo libro C que cubra C99
El término "C89" describe dos idiomas muy diferentes:
El lenguaje que los programadores en 1989 pensaron que el Comité estaba describiendo en lugares donde el Estándar era ambiguo, y que apoyaba características que eran comunes en implementaciones preexistentes.
El lenguaje que el Comité ha decidido desde entonces que quería describir, lo que arrojó la compatibilidad con la funcionalidad existente por la ventana.
C99 "aclara" partes ambiguas de la norma al decir que pretendían que la Norma se interpretara de una manera que hubiera roto una fracción sustancial del código existente e imposibilitado realizar muchas tareas de la manera más eficiente que se había realizado en C antes. 1989.
El lenguaje correcto para programar en, para muchas aplicaciones, sería el superconjunto de los estándares C, C89, C99 y C11. Sin embargo, es importante que cualquiera que programe en ese lenguaje tenga claro que está usando ese lenguaje en lugar de un subconjunto que se reduce, lo que favorece la velocidad sobre la confiabilidad.
No hay razón para aprender C89 o C90 a través de C99, ya que se ha superado literalmente. Es fácil encontrar compiladores C99 y no hay razón alguna para aprender un estándar anterior.
Esto no significa que tu profesor no te imponga C89. De las diversas preguntas publicadas aquí marcadas como tarea, tengo la sensación de que muchos, muchos cursos de C (y, desafortunadamente, C ++) no han avanzado desde C89.
Desde la perspectiva de un estudiante principiante, lo más probable es que realmente no note la diferencia: hay un montón de C, tanto C99 como C89 / 90 que deben cubrirse.
Sí, es un poco extraño que pueda obtener un fuerte consenso de que K&R es un gran libro C, y también un fuerte consenso de que C99 es la versión correcta / actual / mejor de C. Las dos posiciones son incompatibles, incluso si K&R es la El mejor libro disponible para aprender "C significa C99", lo que simplemente implica que el resto son basura, o que están totalmente desactualizados.
Yo aconsejaría aprender y usar C99, pero vigilando a C89 mientras lo haces. Si usa un compilador que tiene modos compatibles con C89 y C99, entonces puede escribir algunos bits de C89 solo para tener una idea de las diferencias. Entonces, si alguna vez necesita escribir algún código destinado a ser portátil a lugares donde C99 no va, sabrá qué hacer. Si nunca tiene que escribir un código de este tipo, entonces ha perdido un día.
Escribir el C89 correctamente es en realidad sorprendentemente difícil, porque obtener una copia del estándar C89 es difícil. Entonces, C99 si puedes, C89 si por alguna extraña razón tienes que hacerlo, y ten un poco de conciencia de cuál es la diferencia. Tal vez use K&R para cubrir lo más básico, pero vea un poco de C99 idiomático lo antes posible.
En cuanto a los temas específicos que se deben tener en cuenta al leer K&R: hay una lista de cambios importantes en el prólogo de la norma (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf ), aunque los detalles no están dispuestos allí. Muchas de ellas son funciones nuevas que se agregaron a C99, por lo que no es que K&R esté equivocado , es posible que no siempre use las mejores herramientas para un trabajo determinado. Algunas de ellas son cosas bastante complicadas donde probablemente debería consultar el estándar si necesita los detalles de todos modos. El resto son cosas eliminadas de C89, que normalmente un compilador de C99 le informará sobre cómo y cuándo intenta usarlas.
Si bien creo que es beneficioso saber qué funciones son más recientes y es menos probable que sean compatibles con compiladores oscuros (o que se rompen intencionalmente, como MSVC), hay algunas características de C99 que debe usar absolutamente:
snprintf
: esta es la función definitiva para un ensamblaje de cadenas seguro y limpio en C. Si a su compilador le falta, puede reemplazar todo el subsistemaprintf
(probablemente una buena idea ya que la mayoría de las implementaciones consnprintf
faltantes también están llenas de (a menudo intencionales) errores en el comportamiento deprintf
), o envolvertmpfile
/fprintf
/fread
/fclose
.stdint.h
: Si necesita tipos de tamaño fijo (16/32/64-bit), use los nombres estándarint16_t
,uint16_t
,int32_t
, etc. No invente los suyos, y absolutamente no use nombres específicos del sistema comoINT64
ou32
. Simplemente hace que su código sea feo y difícil de integrar y reutilizar. Si a su compilador le faltastdint.h
, simplemente coloque el suyo para definir los tipos en términos de los tipos correctos para su plataforma.Específicamente
uint64_t
, en lugar deint foo[2];
ostruct { int lo, int hi; } foo;
struct { int lo, int hi; } foo;
u otros hacks horribles legados para trabajar con 64-pero números. Cualquier compilador sensato, incluso sin el soporte de C99, tiene sus propios tipos de 64 bits que puede usar para definirint64_t
yuint64_t
.
Si estás en el nivel de estudiante, probablemente ni siquiera notarás las diferencias.
Utilice el estándar C99, es más nuevo y tiene más funciones. Particularmente útil puede ser el tipo bool
en <stdbool.h>
y la familia de tipos int32_t
etc. este último evita una gran cantidad de código no portátil que se basa en que los int
tienen un tamaño determinado. AFAIK, no invalida K&R, aunque ahora algunos programas de ejemplo pueden estar escritos en un estilo ligeramente diferente.
Tenga en cuenta que algunos compiladores aún no admiten C99 correctamente. Creo que GCC aún requiere el uso de un -std=c99
para habilitarlo; muchos sistemas Unix / Linux tienen un comando c99
que envuelve GCC y habilita C99.
Lo mismo ocurre con muchos profesores universitarios. Sorprendí a la mía al entregar un programa que usaba bool
en mi primer año. Nunca había oído hablar de ese tipo en C :)