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:30] – 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 ==== | ||
| - | =====Introducción===== | + | [[El lenguaje de programación C - Introducción|Introducción]] |
| - | + | ||
| - | C es un lenguaje de programación de propósito general que ha sido estrechamente asociado con el sistema UNIX en donde fue desarrollado puesto que tanto el sistema como los programas que corren en él están escritos en lenguaje C. Sin embargo, este lenguaje no está ligado a ningún sistema operativo ni a ninguna máquina, y aunque se le llama “lenguaje de programación de sistemas” debido a su utilidad para escribir compiladores y sistemas operativos, se utiliza con igual eficacia para escribir importantes programas en diversas disciplinas. | + | |
| - | + | ||
| - | Muchas de las ideas importantes de C provienen del lenguaje BCPL, desarrollado por Martin Richards. La influencia de BCPL sobre C se continuó indirectamente a través del lenguaje B, el cual fue escrito por Ken Thompson en 1970 para el primer sistema UNIX de la DEC PDP-7. | + | |
| - | + | ||
| - | BCPL y B son lenguajes “carentes de tipos”. En contraste, C proporciona una variedad de tipos de datos. Los tipos fundamentales son caracteres, enteros y números de punto flotante de varios tamaños. Además, existe una jerarquía de tipos de datos derivados, creados con apuntadores, | + | |
| - | + | ||
| - | C proporciona las construcciones fundamentales de control de flujo que se requieren en programas bien estructurados: | + | |
| - | + | ||
| - | Las funciones pueden regresar valores de tipos básicos, estructuras, | + | |
| - | + | ||
| - | Un paso de preprocesamiento realiza substitución de macros en el texto del programa, inclusión de otros archivos fuente y compilación condicional. | + | |
| - | + | ||
| - | C es un lenguaje de relativo “bajo nivel”. Esta caracterización no es peyorativa, simplemente significa que C trata con el mismo tipo de objetos que la mayoría de las computadoras, | + | |
| - | + | ||
| - | C no proporciona operaciones para tratar directamente con objetos compuestos, tales como cadenas de caracteres, conjuntos, listas o arreglos. No existen operaciones que manipulen un arreglo o una cadena completa, aunque las estructuras pueden copiarse como una unidad. El lenguaje no define ninguna facilidad para asignación de almacenamiento que no sea la de definición estática y la disciplina de pilas provista por las variables locales de funciones; no emplea heap ni recolector de basura. Finalmente, C en sí mismo no proporciona capacidades de entrada/ | + | |
| - | + | ||
| - | De manera semejante, C solamente ofrece un control de flujo franco, y lineal: condiciones, | + | |
| - | + | ||
| - | Aunque la ausencia de alguna de esas capacidades puede parecer como una grave deficiencia (“¿significa que se tiene que llamar a una función para comparar dos cadenas de caracteres? | + | |
| - | + | ||
| - | Por muchos años, la definición de C fue el manual de referencia de la primera edición de El lenguaje de programación C. En 1983, el American National Standards Institute (ANSI) estableció un comité para proporcionar una moderna y comprensible definición de C. La definición resultante, el estándar ANSI o “ANSI C” , se esperaba fuera aprobada a fines de 1988. La mayoría de las características del estándar ya se encuentran soportadas por compiladores modernos. | + | |
| - | + | ||
| - | El estándar está basado en el manual de referencia original. El lenguaje ha cambiado relativamente poco; uno de los propósitos del estándar fue asegurar que la mayoría de los programas existentes pudiesen permanecer válidos o, al menos, que los compiladores pudieran producir mensajes de advertencia acerca del nuevo comportamiento. | + | |
| - | + | ||
| - | Para la mayoría de los programadores, | + | |
| - | + | ||
| - | Existen otros cambios de menor escala en el lenguaje. La asignación de estructuras y enumeraciones, | + | |
| - | + | ||
| - | Una segunda contribución significativa dei estándar es la definición de una biblioteca que acompañe a C. Esta especifica funciones para tener acceso al sistema operativo (por ejemplo, leer de archivos y escribir en ellos), entrada y salida con formato, asignación de memoria, manipulación de cadenas y otras actividades semejantes. Una colección de encabezadores (headers) estándar proporcionan un acceso uniforme a las declaraciones de funciones y tipos de datos. Los programas que utilizan esta biblioteca para interactuar con un sistema anfitrión están asegurados de un com portam iento com patible. La m ayor parte de la biblioteca está estrecham ente modelada con base en la “biblioteca E/S estándar" | + | |
| - | + | ||
| - | Debido a que los tipos de datos y estructuras de control provistas por C son manejadas directamente por la mayoría de las computadoras, | + | |
| - | + | ||
| - | Aunque C coincide con las capacidades de muchas com putadoras, es independiente de cualquier arquitectura. Con un poco de cuidado es fácil escribir programas portátiles, | + | |
| - | + | ||
| - | C no es un lenguaje fuertemente tipificado, sino que, al evolucionar, | + | |
| - | + | ||
| - | Sin embargo, C mantiene la filosofía básica de que los programadores saben lo Que están haciendo; sólo requiere que establezcan sus intenciones en forma explícita. | + | |
| - | + | ||
| - | Como cualquier otro lenguaje, C tiene sus defectos. Algunos de los operadores tienen la precedencia equivocada; algunos elementos de la sintaxis pueden ser mejores. A pesar de todo, C ha probado ser un lenguaje extremadamente efectivo y expresivo p ara una am plia variedad de program as de aplicación. | + | |
| - | + | ||
| - | El libro está organizado com o sigue. El capítulo 1 es una introducción orientada a la parte central de C. El propósito es hacer que el lector se inicie tan pronto como le sea posible, puesto que creemos firmemente que la forma de aprender un nuevo lenguaje es escribir program as en él. La introducción supone un conocimiento práctico de los elementos básicos de la programación; | + | |
| - | + | ||
| - | En los capítulos del 2 al 6 se discuten varios aspectos de C en mayor detalle y más formalmente de lo que se hace en el capítulo 1, aunque el énfasis está aún en los ejemplos de programas completos, más que en fragmentos aislados. El capítulo 2 trata de los tipos básicos de datos, operaciones y expresiones. El capítulo 3 trata sobre control de flujo: if-else, switch, while, for, etc. En el capítulo 4 se cubren funciones y la estructura de un programa —variables externas, reglas de alcance, archivos fuente múltiples y otros aspectos— y también abarca al preprocesador. El capítulo 5 discute sobre apuntadores y aritmética de direcciones. | + | |
| - | + | ||
| - | El capítulo 6 cubre estructuras y uniones. | + | |
| - | + | ||
| - | El capítulo 7 describe la biblioteca estándar, la cual proporciona una interfaz común con el sistema operativo. Esta biblioteca está definida por el estándar ANSI y se intenta que se tenga en todas las máquinas que manejan C; así, los programas que la usen para entrada, salida y otros accesos al sistema operativo se puedan transportar de un sistema a otro sin cambios. | + | |
| - | + | ||
| - | El capítulo 8 describe una interfaz entre los programas en C y el sistema operativo UNIX, concentrándose en entrada/ | + | |
| - | + | ||
| - | El apéndice A contiene un manual de consulta del lenguaje. El informe oficial de la sintaxis y la semántica de C es en sí el estándar ANSI. Ese documento, sin embargo, está principalmente pensado para quienes escriben compiladores. El manual de consulta de este libro transmite la definición del lenguaje en una forma más concisa y sin el mismo estilo legalista. El apéndice B es un resumen de la biblioteca estándar, de nuevo más para usuarios que para implantadores. El apéndice C es un breve resumen de los cambios del lenguaje original. A unque, en caso de duda, el estándar y el compilador en uso quedan como las autoridades finales sobre el lenguaje. | + | |
| - | + | ||
| - | [[El lenguaje | + | |
| - | + | ||
| - | [[El lenguaje de Programación C - Capitulo 2]] | + | |
| - | + | ||
| - | + | ||
| - | ===== Capítulo 3: Control de Flujo ===== | + | |
| - | + | ||
| - | Las proposiciones de control de flujo de un lenguaje especifican el orden en que se realiza el procesamiento. Ya hemos visto la mayoría de las construcciones de control de flujo en ejemplos anteriores; aquí completaremos el conjunto, y seremos más precisos acerca de las discutidas con anterioridad. | + | |
| - | + | ||
| - | ==== 3.1 Proposiciones y bloques ==== | + | |
| - | + | ||
| - | Una expresión como '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | x = 0; | + | |
| - | i++; | + | |
| - | printf(...); | + | |
| - | </ | + | |
| - | + | ||
| - | En C, el punto y coma '';'' | + | |
| - | + | ||
| - | Las llaves '' | + | |
| - | + | ||
| - | ==== 3.2 If-Else ==== | + | |
| - | + | ||
| - | La proposición '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | if (expresión) | + | |
| - | proposición1 | + | |
| - | else | + | |
| - | | + | |
| - | </ | + | |
| - | + | ||
| - | donde la parte del '' | + | |
| - | + | ||
| - | Puesto que un '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | if (expresión) | + | |
| - | </ | + | |
| - | + | ||
| - | en lugar de | + | |
| - | + | ||
| - | <code c> | + | |
| - | if (expresión != 0) | + | |
| - | </ | + | |
| - | + | ||
| - | Algunas veces esto es claro y natural; otras puede ser misterioso. | + | |
| - | + | ||
| - | Debido a que la parte '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | if (n > 0) | + | |
| - | if (a > b) | + | |
| - | z = a; | + | |
| - | else | + | |
| - | z = b; | + | |
| - | </ | + | |
| - | + | ||
| - | el '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | if (n > 0) { | + | |
| - | if (a > b) | + | |
| - | z = a; | + | |
| - | } | + | |
| - | else | + | |
| - | z = b; | + | |
| - | </ | + | |
| - | + | ||
| - | La ambigüedad es especialmente perniciosa en situaciones como esta: | + | |
| - | + | ||
| - | <code c> | + | |
| - | if (n > 0) | + | |
| - | for (i = 0; i < n; i++) | + | |
| - | if (s[i] > 0) { | + | |
| - | printf(" | + | |
| - | return i; | + | |
| - | } | + | |
| - | else /* EQUIVOCADO */ | + | |
| - | printf(" | + | |
| - | </ | + | |
| - | + | ||
| - | El sangrado muestra en forma inequívoca lo que se desea, pero el compilador no entiende el mensaje y asocia el '' | + | |
| - | + | ||
| - | A propósito, nótese que hay un punto y coma '';'' | + | |
| - | + | ||
| - | <code c> | + | |
| - | if (a > b) | + | |
| - | z = a; | + | |
| - | else | + | |
| - | z = b; | + | |
| - | </ | + | |
| - | + | ||
| - | Esto se debe a que gramaticalmente al '' | + | |
| - | ==== 3.3 Else-if ==== | + | |
| - | + | ||
| - | + | ||
| - | La construcción | + | |
| - | + | ||
| - | <code c> | + | |
| - | if (expresión) | + | |
| - | proposición | + | |
| - | else if (expresión) | + | |
| - | proposición | + | |
| - | else if (expresión) | + | |
| - | proposición | + | |
| - | else if (expresión) | + | |
| - | proposición | + | |
| - | else | + | |
| - | proposición | + | |
| - | </ | + | |
| - | + | ||
| - | ocurre de modo tan frecuente que bien vale una pequeña discusión aparte. Esta secuencia de proposiciones '' | + | |
| - | + | ||
| - | La parte del último '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | else | + | |
| - | proposición | + | |
| - | </ | + | |
| - | + | ||
| - | puede omitirse, o puede utilizarse para detección de errores al atrapar una condición “imposible” . | + | |
| - | + | ||
| - | Para ilustrar una decisión de tres vías, se muestra a continuación una función de búsqueda binaria que decide si un valor particular de '' | + | |
| - | + | ||
| - | La búsqueda binaria primero compara el valor de entrada '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | /* binsearch: encuentra x en v[0] <= v[1] <= ... <= v[n-1] */ | + | |
| - | { | + | |
| - | int low, high, mid; | + | |
| - | + | ||
| - | low = 0; | + | |
| - | high = n - 1; | + | |
| - | while (low <= high) { | + | |
| - | mid = (low+high)/ | + | |
| - | if (x < v[mid]) | + | |
| - | high = mid + 1; | + | |
| - | else if (x > v[mid]) | + | |
| - | low = mid + 1; | + | |
| - | else /* el elemento fue encontrado */ | + | |
| - | return mid; | + | |
| - | } | + | |
| - | return -1; /* no fue encontrado */ | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | La decisión fundamental es si '' | + | |
| - | + | ||
| - | * **Ejercicio 3-1**. Nuestra búsqueda binaria realiza dos pruebas dentro del ciclo, cuando una podría ser suficiente (al precio de más pruebas en el exterior). Escriba una versión con sólo una prueba dentro del ciclo y mida la diferencia en tiempo de ejecución. □ | + | |
| - | ==== 3.4 Switch ==== | + | |
| - | + | ||
| - | La proposición '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | switch (expresión) { | + | |
| - | case exp-const: proposiciones | + | |
| - | case exp-const: proposiciones | + | |
| - | default: proposiciones | + | |
| - | ) | + | |
| - | </ | + | |
| - | + | ||
| - | Cada '' | + | |
| - | + | ||
| - | En el [[#capitulo 1|capítulo 1]] se escribió un programa para contar las ocurrencias de cada dígito, espacio en blanco y todos los demás caracteres, usando una secuencia de '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | #include < | + | |
| - | main() | + | |
| - | { | + | |
| - | int c, i, nwhite, nother, ndigit[10]; | + | |
| - | + | ||
| - | nwhite = nother = 0; | + | |
| - | for (i = 0; i < 10; i++) | + | |
| - | ndigit[i] = 0; | + | |
| - | while ((c = getchar()) != EOF) { | + | |
| - | switch (c) { | + | |
| - | case ' | + | |
| - | case ' | + | |
| - | ndigit[c-' | + | |
| - | break; | + | |
| - | case ' ': | + | |
| - | case ' | + | |
| - | case ' | + | |
| - | nwhite++; | + | |
| - | break; | + | |
| - | default: | + | |
| - | nother++; | + | |
| - | break; | + | |
| - | } | + | |
| - | } | + | |
| - | printf(" | + | |
| - | for (i = 0; i < 10; i++) | + | |
| - | printf(" | + | |
| - | printf(", | + | |
| - | nwhite, nother); | + | |
| - | return 0; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | La proposición '' | + | |
| - | + | ||
| - | //Pasar a través// de los '' | + | |
| - | + | ||
| - | Como formalidad, coloque un '' | + | |
| - | + | ||
| - | * **Ejercicio 3-2**. Escriba una función '' | + | |
| - | ==== 3.5 Ciclos - While y For ==== | + | |
| - | + | ||
| - | Ya hemos encontrado los ciclos '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | while (expresión) | + | |
| - | proposición | + | |
| - | </ | + | |
| - | + | ||
| - | la expresión se evalúa. Si es diferente de cero, se ejecuta la // | + | |
| - | + | ||
| - | La proposición '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | for (expr1; expr2; expr3) | + | |
| - | proposición | + | |
| - | </ | + | |
| - | + | ||
| - | es equivalente a | + | |
| - | + | ||
| - | <code c> | + | |
| - | expr1; | + | |
| - | while (expr2) { | + | |
| - | proposición | + | |
| - | expr3; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | excepto por el comportamiento de '' | + | |
| - | + | ||
| - | Gramaticalmente, | + | |
| - | + | ||
| - | <code c> | + | |
| - | for (;;) { | + | |
| - | ... | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | es una iteración “infinita”, | + | |
| - | + | ||
| - | El usar '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | while ((c = getchar()) == ' ' || c == ' | + | |
| - | ; /* ignora caracteres espaciadores */ | + | |
| - | </ | + | |
| - | + | ||
| - | no hay inicialización o reinicialización, | + | |
| - | + | ||
| - | El '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | for (i = 0; i < n; i++) | + | |
| - | ... | + | |
| - | </ | + | |
| - | + | ||
| - | que es la forma característica de procesar los primeros //n// elementos de un arreglo en C, lo análogo al ciclo '' | + | |
| - | + | ||
| - | Como un ejemplo más amplio, aquí está otra versión de '' | + | |
| - | + | ||
| - | La estructura del programa refleja la forma de la entrada: | + | |
| - | + | ||
| - | * ignora espacios en blanco, si los hay | + | |
| - | * toma el signo, si lo hay | + | |
| - | * toma la parte entera y conviértela | + | |
| - | + | ||
| - | Cada paso realiza su parte, y deja las cosas en forma clara para el siguiente. La totalidad del proceso termina con el primer carácter que no pueda ser parte de un número. | + | |
| - | + | ||
| - | <code c> | + | |
| - | #include < | + | |
| - | + | ||
| - | /* atoi: convierte s a entero; versión 2 */ | + | |
| - | int atoi(char s[]) | + | |
| - | { | + | |
| - | int i, n, sign; | + | |
| - | + | ||
| - | for (i = 0; isspace(s[i]); | + | |
| - | ; | + | |
| - | sign = (s[i] == ' | + | |
| - | if (s[i] == ' | + | |
| - | i++; | + | |
| - | for (n = 0; isdigit(s[i]); | + | |
| - | n = 10 * n + (s[i] - ' | + | |
| - | return sign * n; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | La biblioteca estándar proporciona una función más elaborada, '' | + | |
| - | + | ||
| - | Las ventajas de mantener centralizado el control del ciclo son aún más obvias cuando existen ciclos anidados. La siguiente función es una clasificación Shell para ordenar un arreglo de enteros. La idea básica de este algoritmo de ordenamiento - inventado en 1959 por D.L. Shell - es que en las primeras etapas sean comparados elementos lejanos (en lugar de los adyacentes, como en los ordenamientos de intercambio más simples). Esto tiende a eliminar rápidamente gran cantidad de desorden, así que los estados posteriores tienen menos trabajo por hacer. El intervalo entre los elementos comparados disminuye en forma gradual hasta uno, punto en el que el ordenamiento viene a ser efectivamente un método adyacente de intercambio. | + | |
| - | + | ||
| - | <code c> | + | |
| - | /* shellsort: ordena v[0]...v[n-1] en orden ascendente */ | + | |
| - | void shellsort(int v[], int n) | + | |
| - | { | + | |
| - | int gap, i, j, temp; | + | |
| - | + | ||
| - | for (gap = n/2; gap > 0; gap /= 2) | + | |
| - | for (i = gap; i < n; i++) | + | |
| - | for (j=i-gap; j>=0 && v[j]> | + | |
| - | temp = v[j]; | + | |
| - | v[j] = v[j+gap]; | + | |
| - | v[j+gap] = temp; | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Existen tres ciclos anidados. El más externo controla el espacio entre los elementos comparados, reduciéndolo desde '' | + | |
| - | + | ||
| - | Un último operador de C es la coma '','' | + | |
| - | + | ||
| - | <code c> | + | |
| - | #include < | + | |
| - | + | ||
| - | /* reverse: invierte la cadena s en el mismo lugar */ | + | |
| - | void reverse(char s[]) | + | |
| - | { | + | |
| - | int c, i, j; | + | |
| - | + | ||
| - | for (i = 0, j = strlen(s)-1; | + | |
| - | c = s[i]; | + | |
| - | s[i] = s[j]; | + | |
| - | s[j] = c; | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Las comas que separan a los argumentos de una función, las variables en declaraciones, | + | |
| - | + | ||
| - | Los operadores coma deberán utilizarse poco. Los usos más adecuados son en construcciones fuertemente relacionadas una con la otra, como en el ciclo '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | for (i = 0, j = strlen(s)-1; | + | |
| - | c = s[i], s[i] = s[j], s[j] = c; | + | |
| - | </ | + | |
| - | + | ||
| - | * **Ejercicio 3-3**. Escriba la función '' | + | |
| - | + | ||
| - | ==== 3.6 Ciclos - do-while ==== | + | |
| - | + | ||
| - | Como ya se expuso en el [[#capitulo 1|capítulo 1]], los ciclos '' | + | |
| - | + | ||
| - | La sintaxis del do es | + | |
| - | + | ||
| - | <code c> | + | |
| - | do | + | |
| - | proposición | + | |
| - | while (expresión); | + | |
| - | </ | + | |
| - | + | ||
| - | La // | + | |
| - | + | ||
| - | La experiencia demuestra que el '' | + | |
| - | principio, debido a que los métodos fáciles para generar dígitos los generan en el orden incorrecto. Hemos elegido generar la cadena al revés y después invertirla. | + | |
| - | + | ||
| - | <code c> | + | |
| - | /* itoa: convierte n a caracteres en s */ | + | |
| - | void itoa(int n, char s[]) | + | |
| - | { | + | |
| - | int i, sign; | + | |
| - | + | ||
| - | if ((sign = n) < 0) /* registra el signo */ | + | |
| - | n = -n; /* hace a n positivo */ | + | |
| - | i = 0; | + | |
| - | do { /* genera digitos en orden inverso */ | + | |
| - | s[i++] = n % 10 + ' | + | |
| - | } while ((n /= 10) > 0); /* lo borra */ | + | |
| - | if (sign < 0) | + | |
| - | s[i++] = ' | + | |
| - | s[i] = ' | + | |
| - | reverse(s); | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | El '' | + | |
| - | + | ||
| - | * **Ejercicio 3-4**. En una representación de números en complemento a dos, nuestra versión de '' | + | |
| - | * **Ejercicio 3-5**. Escriba la función '' | + | |
| - | * **Ejercicio 3-6**. Escriba una versión de '' | + | |
| - | + | ||
| - | ==== 3.7 Break y Continue ==== | + | |
| - | + | ||
| - | Algunas veces es conveniente tener la posibilidad de abandonar un ciclo de otra manera que no sea probando al inicio o al final. La proposición '' | + | |
| - | + | ||
| - | Un '' | + | |
| - | + | ||
| - | La siguiente función, '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | /* trim: elimina blancos, tabuladores y nueva linea al final */ | + | |
| - | int trim(char s[]) | + | |
| - | { | + | |
| - | int n; | + | |
| - | + | ||
| - | for (n = strlen(s)-1; | + | |
| - | if (s[n] != ' ' && s[n] != ' | + | |
| - | break; | + | |
| - | s[n+1] = ' | + | |
| - | return n; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | + | ||
| - | El ciclo se interrumpe cuando se encuentra alguno o cuando //n// se hace negativa (esto es, cuando se ha rastreado toda la cadena. Se deberá verificar que este comportamiento es correcto, aun cuando la cadena esté vacía o sólo contiene espacios en blanco. | + | |
| - | + | ||
| - | La proposición '' | + | |
| - | + | ||
| - | Como un ejemplo, el siguiente fragmento procesa sólo los elementos no negativos que están en el arreglo a; los valores negativos son ignorados. | + | |
| - | + | ||
| - | <code c> | + | |
| - | for (i = 0; i < n; i++) | + | |
| - | if (a[i] < 0) /* ignora elementos negativos */ | + | |
| - | continue; | + | |
| - | ... /* trabaja elementos positivos */ | + | |
| - | </ | + | |
| - | + | ||
| - | La proposición '' | + | |
| - | ==== 3.8 Goto y Etiquetas ==== | + | |
| - | + | ||
| - | + | ||
| - | C proporciona la infinitamente abusable proposición '' | + | |
| - | + | ||
| - | Sin embargo, hay algunas situaciones donde los '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | for ( ... ) | + | |
| - | for ( ... ) { | + | |
| - | ... | + | |
| - | if (desastre) | + | |
| - | goto error; | + | |
| - | } | + | |
| - | ... | + | |
| - | error: | + | |
| - | /* arregla el desorden /* | + | |
| - | </ | + | |
| - | + | ||
| - | Esta organización es útil si el código de manejo de error no es trivial y si los errores pueden ocurrir en varios lugares. | + | |
| - | + | ||
| - | Una etiqueta tiene la misma forma que un nombre de variable y es seguida por dos puntos '':'' | + | |
| - | + | ||
| - | Como otro ejemplo, considérese el problema de determinar si dos arreglos, '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | for (i = 0; i < n; i++) | + | |
| - | for (j = 0; j < m; j++) | + | |
| - | if (a[i] == b[j]) | + | |
| - | goto encontrado; | + | |
| - | /* no se encontró ningún elemento común */ | + | |
| - | ... | + | |
| - | encontrado: | + | |
| - | /* se encontró uno: a[i] == b[j] */ | + | |
| - | ... | + | |
| - | </ | + | |
| - | + | ||
| - | El código que involucra un '' | + | |
| - | + | ||
| - | <code c> | + | |
| - | encontrado = 0; | + | |
| - | for (i = 0; i < n && !encontrado; | + | |
| - | for (j = 0; j < m && !encontrado; | + | |
| - | if (a[i] == b[j]) | + | |
| - | encontrado = 1; | + | |
| - | if (encontrado) | + | |
| - | /* Se encontró uno: a[i-1] == b[j-1] */ | + | |
| - | ... | + | |
| - | else | + | |
| - | /* no se encontró ningún elemento común */ | + | |
| - | ... | + | |
| - | </ | + | |
| - | + | ||
| - | Con pocas excepciones, | + | |
| - | ===== Capitulo 4: Funciones y la estructura del programa ===== | + | |
| - | + | ||
| - | 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 de C también se ha mejorado. Las nuevas facilidades del Procesador incluyen un conjunto más completo de directivas para la compilación condicional, | + | |
| - | + | ||
| - | ==== 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: Apuntadores y arreglos ===== | + | |
| - | + | ||
| - | ==== 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 | + | [[El lenguaje |
| - | ==== 8.2 E/S de bajo nivel — read y write ==== | + | [[El lenguaje |
| - | ==== 8.3 Open, creat, close, unlink ==== | + | [[El lenguaje de Programación C - Capitulo |
| - | ==== 8.4 Acceso aleatorio — lseek ==== | + | [[El lenguaje de Programación C - Capitulo |
| - | ==== 8.5 Ejemplo - Una realización | + | [[El lenguaje |
| - | ==== 8.6 Ejemplo — listado | + | [[El lenguaje |
| - | ==== 8.7 Ejemplo - Asignador | + | [[El lenguaje |
| - | ===== 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 ''< | ||
