Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| el_lenguaje_de_programacion_c [2024/09/27 22:41] – peron | el_lenguaje_de_programacion_c [2026/04/21 16:06] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| Este es un ejemplar amorosamente wikificado por ~peron de //El Lenguaje de Programación C//, 2da Edición, de B. Kerningham y D. Ritchie, adaptado para [[hacker|hackers]] del Tercer Mundo. | Este es un ejemplar amorosamente wikificado por ~peron de //El Lenguaje de Programación C//, 2da Edición, de B. Kerningham y D. Ritchie, adaptado para [[hacker|hackers]] del Tercer Mundo. | ||
| + | |||
| + | ==== Prefacios ==== | ||
| [[El lenguaje de programación C - Prefacios|Prefacios]] | [[El lenguaje de programación C - Prefacios|Prefacios]] | ||
| - | |||
| - | |||
| ==== Capítulos ==== | ==== Capítulos ==== | ||
| [[El lenguaje de programación C - Introducción|Introducción]] | [[El lenguaje de programación C - Introducción|Introducción]] | ||
| - | [[El lenguaje de Programación C - Capitulo 1|Capitulo 1]] | + | [[El lenguaje de Programación C - Capitulo 1|Capitulo 1: Introducción General]] |
| - | [[El lenguaje de Programación C - Capitulo 2|Capítulo 2]] | + | [[El lenguaje de Programación C - Capitulo 2|Capítulo 2: Tipos, operadores y expresiones]] |
| - | [[El lenguaje de Programación C - Capitulo 3|capitulo 3]] | + | [[El lenguaje de Programación C - Capitulo 3|capitulo 3: Control de Flujo]] |
| [[El lenguaje de Programación C - Capitulo 4 |Capitulo 4]] | [[El lenguaje de Programación C - Capitulo 4 |Capitulo 4]] | ||
| + | [[El lenguaje de Programación C - Capitulo 5 |Capitulo 5]] | ||
| + | [[El lenguaje de Programación C - Capitulo 6 |Capitulo 6]] | ||
| - | ===== Capitulo 4: Funciones y la estructura del programa ===== | + | [[El lenguaje |
| - | + | ||
| - | Las funciones dividen tareas grandes de computación en varias más pequeñas, y permiten la posibilidad de construir sobre lo que otros ya han hecho, en lugar de comenzar desde cero. Las funciones apropiadas ocultan los detalles de operación de las partes del programa que no necesitan saber acerca de ellos, así que dan claridad a la totalidad y facilitan la penosa tarea de hacer cambios. | + | |
| - | + | ||
| - | El lenguaje C se diseñó para hacer que las funciones fueran eficientes y fáciles de usar; los programas escritos en C se componen de muchas funciones pequeñas en lugar de sólo algunas grandes. Un programa puede residir en uno o más archivos fuente, los cuales pueden compilarse por separado y cargarse junto con funciones de biblioteca previamente compiladas. No trataremos aquí tales procesos, puesto que los detalles varían de un sistema a otro. | + | |
| - | + | ||
| - | La declaración y definición de funciones es el área donde el estándar ANSI ha hecho los cambios más visibles a C. Tal como mencionam os en el [[#capitulo 1|capítulo 1]], ahora es posible declarar los tipos de los argumentos cuando se declara una función. La sintaxis de la definición de funciones también cambia, de modo que las | + | |
| - | declaraciones y las definiciones coincidan. Esto hace posible que el compilador pueda detectar muchos más errores de lo que podía anteriormente. Además, cuando los argumentos se declaran con propiedad, se realizan automáticamente las conversiones convenientes. | + | |
| - | + | ||
| - | El estándar clarifica las reglas sobre el alcance de los nombres; en particular, requiere que sólo haya una definición de cada objeto externo. La inicialización es más general: los arreglos y las estructuras automáticas ahora se pueden inicializar. | + | |
| - | + | ||
| - | El preprocesador | + | |
| - | + | ||
| - | ==== 4.1 Conceptos básicos de funciones ==== | + | |
| - | + | ||
| - | Para comenzar, diseñemos y escribamos un programa que imprim a cada línea de su entrada que contenga un “patró n” o cadena de caracteres en particular. | + | |
| - | + | ||
| - | (Este es un caso especial del programa grep de UNIX.) Por ejem plo, al buscar el patrón de letras " | + | |
| - | + | ||
| - | < | + | |
| - | Ah Love! could you and I with Fate conspire | + | |
| - | To grasp this sorry Scheme of Things entire, | + | |
| - | Would not we shatter it to bits -- and then | + | |
| - | Re-mould it nearer to the Heart' | + | |
| - | </ | + | |
| - | + | ||
| - | producirá la salida | + | |
| - | + | ||
| - | < | + | |
| - | Ah Love! could you and I with Fate conspire | + | |
| - | Would not we shatter it to bits -- and then | + | |
| - | Re-mould it nearer to the Heart' | + | |
| - | </ | + | |
| - | + | ||
| - | El trabajo se ajusta ordenadamente en tres partes: | + | |
| - | + | ||
| - | <code c> | + | |
| - | while {hay otra línea) | + | |
| - | if {la línea contiene el patrón) | + | |
| - | imprímela | + | |
| - | </ | + | |
| - | + | ||
| - | Aunque ciertamente es posible poner el código de todo esto en '' | + | |
| - | + | ||
| - | “Mientras hay otra línea” es '' | + | |
| - | + | ||
| - | Podemos resolver ese problema escribiendo una función '' | + | |
| - | + | ||
| - | Una vez definido todo este diseño, llenar los detalles del programa es simple. Aquí está en su totalidad, de modo que se puede ver cómo las piezas quedan juntas. Por ahora, el patrón que se buscará es una cadena literal, lo cual no es el mecanismo más general. Regresaremos en breve a una discusión sobre cómo inicializar arreglos de caracteres, y en el [[#capitulo 5|capítulo 5]] mostraremos cómo hacer que el patrón de caracteres sea un parámetro fijado cuando se ejecuta el programa. | + | |
| - | + | ||
| - | También hay una versión ligeramente diferente de '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | # include < | + | |
| - | #define MAXILINE 1000 /* longitud máxima por línea de entrada */ | + | |
| - | + | ||
| - | int getline(char line[], int max) | + | |
| - | int strindex(char source[], char searchfor[]); | + | |
| - | + | ||
| - | char pattern[] = " | + | |
| - | + | ||
| - | /* encontrar todas las líneas que coincidan con el patrón */ | + | |
| - | main() | + | |
| - | { | + | |
| - | char line[MAXLINE]; | + | |
| - | int found = 0; | + | |
| - | + | ||
| - | while (getline(line, | + | |
| - | if (strindex(line, | + | |
| - | printf(" | + | |
| - | found++; | + | |
| - | } | + | |
| - | return found; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | <code c> | + | |
| - | /* getline: pone linea en s, retorna longitud */ | + | |
| - | int getline(char s[], int lim) | + | |
| - | { | + | |
| - | int c, i; | + | |
| - | + | ||
| - | i = 0; | + | |
| - | while (--lim > 0 && (c=getchar()) != EOF && c != ' | + | |
| - | s[i++] = c; | + | |
| - | if (c == ' | + | |
| - | s[i++] = c; | + | |
| - | s[i] = ' | + | |
| - | return i; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | <code c> | + | |
| - | /* strindex: retorna el índice de t en s, -1 si no hay */ | + | |
| - | int strindex(char s[], char t[]) | + | |
| - | { | + | |
| - | int i, j, k; | + | |
| - | + | ||
| - | for (i = 0; s[i] != ' | + | |
| - | for (j=i, k=0; t[k]!=' | + | |
| - | ; | + | |
| - | if (k > 0 && t[k] == ' | + | |
| - | return i; | + | |
| - | } | + | |
| - | return -1; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Cada definición de función tiene la forma | + | |
| - | + | ||
| - | <code c> | + | |
| - | tipo-regresado nombre-de-función(declaraciones de argumentos) | + | |
| - | { | + | |
| - | declaraciones y proposiciones | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | Varias partes pueden omitirse; una función mínima " | + | |
| - | + | ||
| - | <code c> | + | |
| - | nada() {} | + | |
| - | </ | + | |
| - | + | ||
| - | que no hace ni regresa nada. Una función '' | + | |
| - | + | ||
| - | Un programa es sólo un conjunto de definiciones de variables y funciones. La comunicación entre funciones es por argumentos y valores regresados por las funciones, | + | |
| - | varios archivos, mientras las funciones no se dividan. | + | |
| - | + | ||
| - | La proposición '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | return expresión | + | |
| - | </ | + | |
| - | + | ||
| - | La // | + | |
| - | + | ||
| - | La función que llama tiene la libertad de ignorar el valor regresado. Incluso, no hay necesidad de un a expresión después de '' | + | |
| - | aunque probablemente un signo de problemas, el que una función regrese un valor desde un lugar y ninguno desde otro. En cualquier caso, si una función no regresa explícitamente un valor, su “valor” es ciertamente basura. | + | |
| - | + | ||
| - | El programa de búsqueda del patrón regresa un estado desde '' | + | |
| - | + | ||
| - | El mecanismo de cómo compilar y cargar un programa en C que reside en varios archivos fuente varía de un sistema a otro. En el sistema UNIX, por ejemplo, la orden //cc// mencionada en el [[# | + | |
| - | + | ||
| - | <code bash> | + | |
| - | cc main.c getline.c strindex.c | + | |
| - | </ | + | |
| - | + | ||
| - | compila los tres archivos, sitúa el código objeto resultante en los archivos '' | + | |
| - | + | ||
| - | <code bash> | + | |
| - | cc main.c getline.o strindex.o | + | |
| - | </ | + | |
| - | + | ||
| - | //cc// emplea la convención "'' | + | |
| - | + | ||
| - | * **Ejercicio 4-1**. Escriba la función '' | + | |
| - | + | ||
| - | ==== 4.2 Funciones que regresan valores no enteros ==== | + | |
| - | + | ||
| - | Basta ahora los ejemplos de funciones han regresado o ningún valor (void) o un '' | + | |
| - | no es una rutina de conversión de alta calidad; tomaría más espacio del que podemos dedicarle. La biblioteca estándar incluye un '' | + | |
| - | + | ||
| - | Primero, '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | #include < | + | |
| - | + | ||
| - | /* atof: convierte la cadena s a double */ | + | |
| - | double atof(char s[]) | + | |
| - | { | + | |
| - | double val, power; | + | |
| - | int i, sign; | + | |
| - | + | ||
| - | for (i = 0; isspace(s[i]); | + | |
| - | ; | + | |
| - | sign = (s[i] == ' | + | |
| - | if (s[i] == ' | + | |
| - | i++; | + | |
| - | for (val = 0.0; isdigit(s[i]); | + | |
| - | val = 10.0 * val + (s[i] - ' | + | |
| - | if (s[i] == ' | + | |
| - | i++; | + | |
| - | for (power = 1.0; isdigit(s[i]); | + | |
| - | val = 10.0 * val + (s[i] - ' | + | |
| - | power *= 10; | + | |
| - | } | + | |
| - | return sign * val / power; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Segundo, e igualmente importante, la rutina que llama debe indicar que '' | + | |
| - | línea, precedido en forma optativa por un signo, y lo acumula, imprimiendo la suma actual después de cada entrada: | + | |
| - | + | ||
| - | <code c> | + | |
| - | #include < | + | |
| - | #define MAXLINE 100 /* calculadora rudimentaria * / | + | |
| - | main() | + | |
| - | { | + | |
| - | double sum, atof(char []); | + | |
| - | char line[MAXLINE]; | + | |
| - | int getline(char line[], int max); | + | |
| - | + | ||
| - | sum = 0; | + | |
| - | while (getline(line, | + | |
| - | printf(" | + | |
| - | return 0; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | La declaración | + | |
| - | + | ||
| - | <code c> | + | |
| - | double sum, atof(char []); | + | |
| - | </ | + | |
| - | + | ||
| - | señala que '' | + | |
| - | + | ||
| - | La función '' | + | |
| - | + | ||
| - | A la luz de lo que hemos mencionado acerca de cómo deben coincidir las declaraciones con las definiciones, | + | |
| - | + | ||
| - | <code c> | + | |
| - | sum += atof(line) | + | |
| - | </ | + | |
| - | + | ||
| - | Si en una expresión se encuentra un nombre que no ha sido declarado previamente y está seguido por paréntesis izquierdo, se declara por contexto, de modo que se supone que es el nombre de una función que regresa un '' | + | |
| - | + | ||
| - | <code c>double atof();</ | + | |
| - | + | ||
| - | también es tomada de modo que no se supone nada acerca de los argumentos de '' | + | |
| - | + | ||
| - | Dado '' | + | |
| - | na a '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | /* atoi: convierte la cadena s a entero usando atof */ | + | |
| - | int atoi(char s[]) | + | |
| - | { | + | |
| - | double atof(char s[]); | + | |
| - | return (int) atof(s); | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Nótese la estructura de las declaraciones y la proposición '' | + | |
| - | + | ||
| - | <code c>return expresión;</ | + | |
| - | + | ||
| - | se convierte al tipo de la función antes de que se tome el '' | + | |
| - | + | ||
| - | * **Ejercicio 4-2**. Extienda '' | + | |
| - | + | ||
| - | ==== 4.3 Variables Externas ==== | + | |
| - | + | ||
| - | ==== 4.4 Reglas y Alcance ==== | + | |
| - | + | ||
| - | + | ||
| - | ==== 4.5 Archivo de encabezamiento header ==== | + | |
| - | + | ||
| - | ==== 4.6 Variables estáticas ==== | + | |
| - | + | ||
| - | ==== 4.7 Variables tipo registro ==== | + | |
| - | + | ||
| - | ==== 4.8 Estructura de bloques ==== | + | |
| - | + | ||
| - | ==== 4.9 Inicialización ==== | + | |
| - | + | ||
| - | ==== 4.10 Recursividad ==== | + | |
| - | + | ||
| - | ==== 4.11 El preprocesador de C ==== | + | |
| - | + | ||
| - | === 4.1.1 Inclusión de archivos === | + | |
| - | + | ||
| - | === 4.1.2 Substitución de macros === | + | |
| - | + | ||
| - | === 4.1.3 Inclusión condicional === | + | |
| - | + | ||
| - | ===== Capitulo | + | |
| - | + | ||
| - | ==== 5.1 Apuntadores y Direcciones ==== | + | |
| - | + | ||
| - | ==== 5.2 Apuntadores y argumentos de funciones ==== | + | |
| - | + | ||
| - | ==== 5.3 Apuntadores y arreglos ==== | + | |
| - | + | ||
| - | ==== 5.4 Aritmética de direcciones ==== | + | |
| - | + | ||
| - | ==== 5.5 Apuntadores a caracteres, y funciones ==== | + | |
| - | + | ||
| - | ==== 5.6 Arreglos de apuntadores; | + | |
| - | + | ||
| - | ==== 5.7 Arreglos muitidimensionales ==== | + | |
| - | + | ||
| - | ==== 5.8 Inicialización de arreglos de apuntadores ==== | + | |
| - | + | ||
| - | ==== 5.9 Apuntadores vs. arreglos muitidimensionales ==== | + | |
| - | + | ||
| - | ==== 5.10 Argumentos en la línea de órdenes ==== | + | |
| - | + | ||
| - | ==== 5.11 Apuntadores a funciones ==== | + | |
| - | + | ||
| - | ==== 5.12 Declaraciones complicadas ==== | + | |
| - | + | ||
| - | ===== Capítulo 6: Estructuras ===== | + | |
| - | + | ||
| - | Una estructura es una colección de una o más variables, de tipos posiblemente diferentes, agrupadas bajo un solo nombre para manejo conveniente. (Las estructuras se conocen como “ records” en algunos otros lenguajes, principalm ente Pascal.) Las estructuras ayudan a organizar datos complicados, | + | |
| - | + | ||
| - | Un ejemplo tradicional de estructura es el registro de una nómina: un empleado está descrito por un conjunto de atributos, como nombre, domicilio, número del seguro social, salario, etc. Algunos de estos atributos pueden, a su vez, ser estructuras: | + | |
| - | + | ||
| - | El principal cambio realizado por el estándar ANSI es la definición de la asignación de estructuras: | + | |
| - | + | ||
| - | ==== 6.1 Conceptos básicos sobre estructuras ==== | + | |
| - | + | ||
| - | ==== 6.2 Estructuras y funciones ==== | + | |
| - | + | ||
| - | ==== 6.3 Arreglos de estructuras ==== | + | |
| - | + | ||
| - | ==== 6.4 Apuntadores a estructuras ==== | + | |
| - | + | ||
| - | ==== 6.5 Estructuras autorreferenciadas ==== | + | |
| - | + | ||
| - | ==== 6.6 Búsqueda en tablas ==== | + | |
| - | + | ||
| - | ==== 6.7 Typedef ==== | + | |
| - | + | ||
| - | ==== 6.8 Uniones ==== | + | |
| - | + | ||
| - | ==== 6.9 Campos de bits ==== | + | |
| - | + | ||
| - | ===== Capítulo 7: ===== | + | |
| - | + | ||
| - | Las operaciones de entrada y salida no son en si parle del lenguaje C, por lo que hasta ahora no las hemos destacado. Sin embargo, los programas interactúan con su medio ambiente en formas mucho más complicadas de las que hemos mostrado antes. En este capítulo describiremos la biblioteca estándar, un conjunto de funciones que proporcionan entrada y salida, manipulación de cadenas, manejo de memoria, rutinas matemáticas y una variedad de otros servicios para programas en C, aunque haremos hincapié en la entrada y salida. | + | |
| - | + | ||
| - | El estándar ANSI define de manera precisa estas funciones de biblioteca, de modo que pueden existir en forma compatible en cualquier sistema en donde exista C. Los programas que restringen su interacción con el sistema a las facilidades provistas por la biblioteca estándar pueden ser llevados de un sistema a otro sin cambios. | + | |
| - | + | ||
| - | Las propiedades de las funciones de biblioteca están especificadas en más de una docena de // | + | |
| - | + | ||
| - | ==== 7.1 Entrada y salida estándar ==== | + | |
| - | + | ||
| - | ==== 7.2 Salida con formato - printf ==== | + | |
| - | + | ||
| - | == Tabla 7-1. Conversiones básicas de Printf == | + | |
| - | + | ||
| - | ==== 7.3 Listas de argumentos de longitud variable ==== | + | |
| - | + | ||
| - | ==== 7.4 Entrada con formato — scanf ==== | + | |
| - | + | ||
| - | == Tabla 7-2 - Conversiones básicas de scanf == | + | |
| - | + | ||
| - | ^Caracter ^Dato de entrada: | + | |
| - | |'''' | + | |
| - | |'''' | + | |
| - | |'''' | + | |
| - | |'''' | + | |
| - | |'''' | + | |
| - | |'''' | + | |
| - | |'''' | + | |
| - | |'''' | + | |
| - | |'''' | + | |
| - | + | ||
| - | + | ||
| - | ==== 7.5 Acceso a archivos ==== | + | |
| - | + | ||
| - | ==== 7.6 Manejo de errores—stderr y exit ==== | + | |
| - | + | ||
| - | ==== 7.7 Entrada y salida de líneas ==== | + | |
| - | + | ||
| - | ==== 7.8 Otras funciones ==== | + | |
| - | + | ||
| - | La biblioteca estándar proporciona una amplia variedad de funciones. Esta sección es una breve sinopsis de las más útiles. En el [[#apendice b|apéndice B]] pueden encontrarse más detalles y muchas otras funciones. | + | |
| - | + | ||
| - | === 7.8.1 Operaciones sobre cadenas === | + | |
| - | + | ||
| - | === 7.8.2 Prueba y conversión de clases de caracteres === | + | |
| - | + | ||
| - | === 7.8.3 Ungete === | + | |
| - | + | ||
| - | === 7.8.4 Ejecución de órdenes === | + | |
| - | + | ||
| - | === 7.8.5 Administración del almacenamiento === | + | |
| - | + | ||
| - | === 7.8.6 Funciones matemáticas === | + | |
| - | + | ||
| - | + | ||
| - | === 7.8.7 Generación de números aleatorios === | + | |
| - | + | ||
| - | + | ||
| - | ===== Capítulo 8: La interfaz con el sistem a UNIX ===== | + | |
| - | + | ||
| - | El sistema operativo UNIX proporciona sus servicios a través de un conjunto de //llamadas al sistema//, que consisten en funciones que están dentro del sistema operativo y que pueden ser invocadas por programas del usuario. Este capitulo describe cómo emplear algunas de las más importantes llamadas al sistema desde programas en C. Si el lector usa UNIX, esto debe serle directamente útil, debido a que algunas veces es necesario emplear llamadas al sistema para tener máxima eficiencia, o para tener acceso a alguna facilidad que no esté en la biblioteca. | + | |
| - | + | ||
| - | Incluso, si se emplea C en un sistema operativo diferente el lector debería ser capaz de adentrarse en la programación estudiando estos ejemplos; aunque los detalles varían, se encontrará un código semejante en cualquier sistema. Puesto que la biblioteca de C ANSI está en muchos casos modelada con base en las facilidades de UNIX , este código puede ayudar también a su entendimiento. | + | |
| - | + | ||
| - | El capítulo está dividido en tres partes fundamentales: | + | |
| - | + | ||
| - | El capítulo 7 tuvo que ver con una interfaz de entrada/ | + | |
| - | + | ||
| - | ==== 8.1 Descriptores de Archivos ==== | + | |
| - | + | ||
| - | ==== 8.2 E/S de bajo nivel — read y write ==== | + | |
| - | + | ||
| - | ==== 8.3 Open, creat, close, unlink ==== | + | |
| - | + | ||
| - | ==== 8.4 Acceso aleatorio — lseek ==== | + | |
| - | + | ||
| - | ==== 8.5 Ejemplo - Una realización de fopen y getc ==== | + | |
| - | + | ||
| - | ==== 8.6 Ejemplo — listado de directorios ==== | + | |
| - | + | ||
| - | ==== 8.7 Ejemplo - Asignador de memoria ==== | + | |
| - | ===== Apéndice A: Manual | + | [[El lenguaje |
| - | === A1: Introducción | + | ==== Apéndices ==== |
| - | Este manual describe al lenguaje C tal como se especifica en Draft Proposed American National Standard for Information Systems — Programming Language C, documento número X3J11/88-001, con fecha 11 de enero de 1988. Este borrador no es el estándar final, y todavía es posible que ocurran algunos cambios en el lenguaje. Así pues, este manual no describe la definición final del lenguaje. Más aún es una interpretación del borrador propuesto del estándar, no el estándar en sí, aunque se ha tenido cuidado | + | [[El lenguaje |
| - | En su mayor parte, este manual sigue la línea amplia del borrador estándar, que a su vez sigue la de la primera edición de este libro, aunque la organización difiere en el detalle. Excepto por renombrar algunas producciones y porque no se formalizan las definiciones de los componentes léxicos o del preprocesador, | + | [[El lenguaje |
| - | >En este manual, el material comentado se encuentra sangrado y escrito en un tipo más pequeño, como este. A menudo estos comentarios resaltan las formas en las que el estándar ansí de C difiere del lenguaje | + | [[El lenguaje de Programación C - Apéndice C|Apéndice C: Resumen |
| - | ===== Apéndice B: Biblioteca Estándar ===== | ||
| - | ===== Apéndice C: Resúmen de Modificaciones ===== | ||
| - | Desde la publicación de la primera edición de este libro, la definición del lenguaje C ha sufrido modificaciones. Casi todas fueron extensiones al lenguaje original, y fueron diseñadas cuidadosamente para permanecer compatibles con la práctica existente; algunas repararon ambigüedades de la descripción original, y otras representan modificaciones de la práctica existente. Muchas de las nuevas características se anunciaron en los documentos que acompañan a los compiladores disponibles de AT&T, y posteriormente se han adoptado por otros proveedores de compiladores del lenguaje C. Recientemente, | ||
| - | Este apéndice resume las diferencias entre el lenguaje definido por la primera edición de este libro, y lo esperado como la definición del estándar final. Trata solamente al lenguaje en sí, no a su entorno ni a su biblioteca; aunque esas son partes importantes del estándar, hay poco con qué compararlas, | ||
| - | * El preprocesamiento está definido más cuidadosamente en el Estándar que en la primera edición, y está extendido: está explícitamete basado en tokens (símbolos); | ||
| - | * El significado mínimo el más pequeño de todos los identificadores internos se incrementó a 31 caracteres; permitido para identificadores con liga externo permanece en 6 letras, sin importar sin son mayúsculas o minúsculas (muchas implantaciones proporcionan más). | ||
| - | * Las secuencias trigráficas introducidas por ?? permiten la representación de caracteres que no se encuentran en algunos conjuntos. Están definidos los escapes para ''#'' | ||
| - | de cadenas que contengan la secuencia ''??'' | ||
| - | * Se introdujeron nuevas palabras reservadas (void, const, volatile, signed. enum). La palabra reservada entry, que nunca se puso en uso, fue retirada. | ||
| - | * Se definen nuevas secuencias de escape para uso dentro de constantes de carácter y cadenas literales. El efecto de seguir ''< | ||
