2010-12-05 14 views
19

Estoy buscando aprender conceptos básicos C y sintaxis antes de comenzar la Programación de Sistemas el próximo mes. Al leer, me encontré con los estándares C89/99. Según Wikipedia,¿Qué versión de C es más apropiada para que los alumnos aprendan C89/90 o C99?

C99 introduce varias características nuevas, incluyendo funciones en línea, varios nuevos tipos de datos (incluyendo largo largo int y un tipo complejo para representar números complejos), de longitud variable arrays, soporte para las macros variadas (macros de arity variable) y soporte para comentarios de una línea comenzando con //, como en BCPL o C++. Muchos de estos ya se han implementado como extensiones en varios compiladores de C.

C99 es en su mayor parte retrógrada compatible con C90, pero es más estricta de alguna manera; en particular, una declaración que carece de un especificador de tipo ya no tiene int asumido implícitamente. Una macro estándar STDC_VERSION se define con el valor 199901L para indicar que la compatibilidad con C99 está disponible. GCC, Sun Studio y otros compiladores ahora son compatibles con muchas o todas las nuevas características de C99.

Pedí prestada una copia de K & R, segunda edición, y utiliza el estándar C89. Para un estudiante, ¿el uso de C89 invalida algunos temas cubiertos en K & R y, de ser así, qué debería buscar?

+4

I'd go for C11. – chux

Respuesta

18

No hay ninguna razón para aprender C89 o C90 por encima de C99; ha sido reemplazado literalmente. Es fácil encontrar compiladores C99 y no hay ninguna razón para aprender un estándar anterior.

Esto no significa que su profesor no forzará C89 sobre usted. A partir de las diversas preguntas publicadas aquí marcadas como tareas, me da la sensación de que muchos, muchos cursos C (y, por desgracia, C++) no han cambiado desde C89.

Desde la perspectiva de un estudiante principiante, lo más probable es que no note realmente la diferencia; hay un montón de C que se cubren tanto C99 como C89/90.

+8

"Es fácil encontrar compiladores C99": GCC aún requiere un indicador '-std = c99' y Microsoft aparentemente no lo admite correctamente http://stackoverflow.com/questions/2656080/vs-2008-and-c99 –

+1

@larsmans: Entonces, GCC lo admite por completo, y hay docenas de compiladores de C disponibles para Windows. En cuanto a Microsoft, si tiene un compilador de C++, tendría que estar loco para volver a C, por lo que su falta de compatibilidad con C99 no es gran cosa. – Puppy

+0

@DeadMG: No estoy de acuerdo con el compilador de C++ ... pero +1 para ir a C99 de todos modos. –

11

Usa el estándar C99, es más nuevo y tiene más características. 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 compatible que se basa en int s que tiene un cierto tamaño. AFAIK, no invalida K & R, aunque algunos programas de ejemplo se pueden escribir en un estilo ligeramente diferente ahora.

Tenga en cuenta que some compilers aún no es compatible con C99 correctamente. Creo que GCC aún requiere el uso de un indicador -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 los míos al entregar un programa que usó bool en mi primer año. Nunca había oído hablar de ese tipo en C :)

+1

Instalé MinGW en mi sistema personal, – Jason

1

Como estudiante, eso no te influencia tanto.Pero si es posible, debe encontrar un nuevo libro en C que cubra C99

4

Aunque generalmente estoy de acuerdo con los demás, vale la pena señalar que K & R es un libro tan bueno que valdría la pena aprender C de él y luego actualizando su conocimiento a medida que lee sobre el estándar C99.

+2

¿Soy la única persona que no cree que K & R es el mejor libro para aprender C? De hecho, es un texto clásico de CS, pero no estoy seguro de que sea genial para principiantes. Probablemente sea mejor aprender los nuevos estándares y estilos. – in70x

3

Si está en el nivel de estudiante probablemente ni siquiera note las diferencias.

+0

Esta es la segunda edición de K & R, que sigue a ANSI C89. –

+0

@larsmans, pero seguramente mi primer punto merece un +1 para cancelar el -1. –

+0

Mi voto está bloqueado por SO hasta que edite su respuesta. Si eliminas la segunda parte, eliminaré mi voto negativo. –

2

Sí, es un poco extraño que pueda obtener un alto consenso de que K & R es un gran libro C, y también un gran consenso de que C99 es la versión correcta/actual/mejor de C. Las dos posiciones son incompatibles - incluso si K & R es el mejor libro disponible para aprender "C que significa C99", eso simplemente implica que el resto son basura, o también están irremediablemente desactualizados.

Aconsejaría aprender y usar C99, pero sin perder de vista C89 mientras lo hace. 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 en lugares que C99 no utiliza, sabrá qué hacer. Si nunca tienes que escribir ningún código, has desperdiciado tal vez un día.

Escribir C89 correctamente es en realidad sorprendentemente difícil, porque conseguir una copia de la norma 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 los conceptos básicos, pero eche un vistazo a algunos C99 idiomáticos lo antes posible.

En cuanto a cuestiones específicas a 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 establecidos allí. Muchas de ellas son nuevas características agregadas a C99, por lo que no es que K & R es incorrecto, simplemente no siempre utiliza las mejores herramientas para un trabajo determinado. Algunos de ellos son cosas bastante complicadas donde probablemente deberías consultar el estándar si necesitas los detalles de todos modos. El resto son elementos eliminados de C89, que generalmente un compilador C99 le informará sobre cómo y cuándo intenta usarlos.

1

Si bien creo que es beneficioso saber qué características son más recientes y menos probabilidades de ser apoyado por los compiladores oscuros (o intencionalmente-rotos, como MSVC), hay algunas características de C99 que se deben utilizar absolutamente:

  • snprintf: Esta es la función definitiva para el montaje de cadena segura y limpia en C. Si su compilador falta él, puede reemplazar todo el printf subsistema (probablemente una buena idea ya que la mayoría de las implementaciones en las que falta snprintf también están llenos de (a menudo intencional) errores en el comportamiento printf), o envolver tmpfile/fprintf/fread/fclose.

  • stdint.h: Si necesita tipos de tamaño fijo (16/32/64-bit), utilizar los nombres estándar int16_t, uint16_t, int32_t, etc. No invente su propia, y absolutamente no utilice sistema- específicos como INT64 o u32. Simplemente hace que tu código sea feo y difícil de integrar y reutilizar. Si su compilador falta stdint.h, solo agregue el suyo para definir los tipos en términos de los tipos correctos para su plataforma.

  • Específicamente uint64_t, en lugar de int foo[2]; o struct { int lo, int hi; } foo; u otros horribles legacy hacks para trabajar con números 64 pero. Cualquier compilador en buen estado incluso sin soporte C99 tiene sus propios tipos de 64 bits que puede usar para definir int64_t y uint64_t.

0

El término "C89" describe dos idiomas muy diferentes:

  1. El lenguaje que los programadores en 1989 pensaron que el Comité estaba describiendo en lugares donde el nivel era ambigua, y que apoyó características que estaban común en implementaciones preexistentes.

  2. El lenguaje que el Comité ha decidido desde entonces que quería haber descrito, que arrojó compatibilidad con la funcionalidad existente fuera de la ventana .

C99 "aclara" partes ambiguas de la norma diciendo que significaba tener la Norma interpretarse de una manera que habría roto un fracción sustancial de código existente y hacía imposible realizar muchas tareas como de manera eficiente ya que se habían realizado en C antes de 1989.

El idioma correcto para programar, para muchas aplicaciones, sería el superconjunto de los estándares C, C89, C99 y C11 previos. Sin embargo, es importante que cualquier persona que programe en ese idioma tenga claro que está utilizando ese lenguaje en lugar de un subconjunto que se reduce, lo que favorece la velocidad sobre la confiabilidad.

Cuestiones relacionadas