El lenguaje de programación C - Kernighan, Ritchie PDF

Title El lenguaje de programación C - Kernighan, Ritchie
Author Carlos Jimenez
Pages 300
File Size 8.7 MB
File Type PDF
Total Downloads 340
Total Views 508

Summary

SEGUNDA EDICION _______EL LENGUAJE DE PROGRAMACION BRIAN W. KERNIGHAN DENNIS M. RITCHIE Pearson Educación EDICION EN INGLES UNIX es una matea registrada AT & T EL LENGUAJE 1)E PROGRAMACION C___________________ Traducido de la segunda edición en inglés de: THE C PROGRAMMING LANGUAGE Prohibida la ...


Description

SEGUNDA EDICION

_______EL LENGUAJE DE PROGRAMACION

BRIAN W. KERNIGHAN DENNIS M. RITCHIE Pearson Educación

EDICION EN INGLES UNIX es una matea registrada AT & T

EL LENGUAJE 1)E PROGRAMACION C___________________ Traducido de la segunda edición en inglés de: THE C PROGRAMMING LANGUAGE Prohibida la reproducción total o parcial de esta obra, por cualquier medio o método sin autorización escrita del editor DERECHOS RESERVADOS © 1991 respecto a la segunda edición en español por PRENTICE-HALL HISPANOAMERICANA, SA. Atlacomulco Núm. 500-5° Piso Col. Industrial Atoto 53519, Naucalpan de Juárez, Edo. de México Miembro de la Cámara Nacional de la Industria Editorial, Reg. Núm. 1524 ISBN 968-880-205-0

Original English language edition published by Copyright © MCMLXXXVII1 by Prentice-Hall, inc. All Rights Reserved ISBN 0-J3-110362-8

IMPRESO EN MEXICO / PRINTED IN MEXICO

CONTENIDO Prefacio

ix

Prefacio a la primera edición

xi

Introducción Capítulo 1. Introducción general

1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10

Comencemos Variables y expresiones aritméticas La proposición for Constantes simbólicas Entrada y salida de caracteres Arreglos Funciones Argumentos—llamada por valor Arreglos de caracteres Variables externas y alcance

Capítulo 2. Tipos, operadores y expresiones

2.1 Nombres de variables 2.2 Tipos y tamaños de datos 2.3 Constantes 2.4 Declaraciones 2.5 Operadores aritméticos 2.6 Operadores de relación y lógicos 2.7 Conversiones de tipo 2.8 Operadores de incremento y decremento £.9 Operadores para manejo de bits 2.10 Operadores de asignación y expresiones 2.11 Expresiones condicionales 2.12 Precedencia y orden de evaluación Capítulo 3. Control de flujo

3.1 3.2 3.3 3.4 3.5 3.6

Proposiciones y bloques If-else Else-if Switch Ciclos—while y for Ciclos—do-while

1 5

5 8

14 15 16 23 26 29 30 33 39

39

40 41 44 45 46 47 51 53 55 56 57 61

61 61 63 64 66

70

3.7 3.8

Break y continué Goto y etiquetas

Capítulo 4. Funciones y la estructura del programa

4.1 Conceptos básicos de funciones 4.2 Funciones que regresan valores no-enteros 4.3 Variables externas 4.4 Reglas de alcance 4.5 Archivos header 4.6 Variables estáticas 4.7 Variables registro 4.8 Estructura de bloque 4.9 Inicialización 4.10 Recursividad 4.11 El preprocesador de C Capítulo 5. Apuntadores y arreglos

5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12

Apuntadores y direcciones Apuntadores y argumentos de funciones Apuntadores y arreglos Aritmética de direcciones Apuntadores a caracteres y funciones Arreglos de apuntadores; apuntadores a apuntadores Arreglos multidimensionales Inicialización de arreglos de apuntadores Apuntadores vs. arreglos multidimensionales Argumentos en la línea de comandos Apuntadores a funciones Declaraciones complicadas

Capítulo 6 . Estructuras

Conceptos básicos sobre estructuras 6.2 Estructuras y funciones 6.3 Arreglos de estructuras 6.4 Apuntadores o estructuras 6.5 Estructuras autorreferenciadas 6.6 Búsqueda en tablas 6.7 Typedef 6.8 Uniones 6.9 Campos de bits 6.1

Capítulo 7. Entrada y salida

7.1 Entrada y salida estándar 7.2 Salida con formato—printf 7.3 Listas de argumentos de longitud variable 7.4 Entrada con formato—scanf 7.5 Acceso a archivos 7.6 Manejo de errores—stderr y exit

71 72 75

75 79 82 88

90 91 92 93 94 95 97 103

103 105 108 111

115

141

141 143 146 151 153 158 161 162 164 167

167 169 171 173 176 179

7.7 Entrada y salida de líneas 7.8 Otras funciones Capítulo 8. La interfaz del sistema UNIX 8.1 8.2

8.3 8.4 8.5 8.6

8.7

Descriptores de archivos E/S de bajo nivel—read y write open, creat, cióse, unlink Acceso aleatorio—lseek Ejemplo—una implementación de fopen y getc Ejemplo—listado de directorios Ejemplo—asignador de memoria

Apéndice .A. Manual de referencia

Al A2 A3 A4 A5 A6 Al A8 A9 A10 Al 1 A12 A13

Introducción Convenciones léxicas Notación sintáctica Significado de los identificadores Objetos y valores-1 Conversiones Expresiones Declaraciones Proposiciones Declaraciones externas Alcance y ligadura Preprocesamiento Gramática

Apéndice B. Biblioteca estándar

B1 Entrada y salida: B2 Pruebas de clasificación de caracteres: B3 Funciones para cadenas: B4 Funciones matemáticas: B5 Funciones de utilería: B6 Diagnósticos: B7 Listas de argumentos variables: B8 Saltos no locales: B9 Señales: B10 Funciones de fecha y hora: Bll Límites definidos en la implantación: y

181 183 187

187 188 190 193 194 198 204

211 211 211

215 215 217 217 220

232 245 249 251 253 258 255

255 272 273 274 275

278 278 278 279 279 281

Apéndice C. Resumen de modificaciones

283

Indice

287

Prefacio

El mundo de la computación ha sufrido una revolución desde la publicación, en 1978, de El lenguaje de programación C. Las grandes computadoras son aho­ ra mucho más grandes, y las computadoras personales tienen capacidades que ri­ valizan con los mainframes de hace una década. También el lenguaje C ha cambiado en ese tiempo, aunque sólo en forma modesta, y se ha extendido más allá de lo que fueron sus orígenes como el lenguaje del sistema operativo UNIX. La creciente popularidad de C, los cambios en el lenguaje a lo largo de los años, y la creación de compiladores por grupos no involucrados en su diseño, se combinaron para demostrar la necesidad de una definición del lenguaje más pre­ cisa y contemporánea que la que proporcionó la primera edición de este libro. En 1983, el American National Standards Institute (ANSI) estableció un comité cuyos propósitos eran producir “una definición no ambigua del lenguaje C e, in­ dependiente de la máquina”, cuidando la conservación de su espíritu. El resulta­ do es el estándar ANSI para el lenguaje C. El estándar formaliza construcciones sugeridas pero no descritas en la primera edición, particularmente la asignación de estructura y las enumeraciones. Pro­ porciona una nueva forma de declaración de funciones, que permite revisar com­ parativamente su definición y uso. Especifica una biblioteca estándar, con un conjunto extensivo de funciones para realizar la entrada y salida, la administra­ ción de memoria, la manipulación de cadenas y tareas semejantes. Precisa el comportamiento de características que no se mencionaron en la definición origi­ nal, y al mismo tiempo establece explícitamente cuáles aspectos del lenguaje tienen aún dependencia de máquina. Esta segunda edición de El lenguaje de programación C lo describe tal como lo definió el estándar ANSI. (En el momento de escribir está edición, el estándar se encontraba en la etapa final de revisión; se esperaba su aprobación a finales de 1988. Las diferencias entre lo que se ha descrito aquí y la forma final deberán ser mínimas.) Aunque hemos hecho anotaciones en los lugares donde el lenguaje ha evolucionado, preferimos escribir exclusivamente en la nueva forma. En gene­ ral esto no hace una diferencia significativa; el cambio más visible es la nueva forma de declaración y definición de funciones. Los modernos compiladores ma­ nejan ya la mayoría de las posibilidades del estándar'

X PREFACIO

Hemos tratado de mantener la brevedad de la primera edición. El lenguaje C no es grande, y no le está bien un gran libro. Hemos mejorado la exposición de características críticas, como los apuntadores, que son parte central en la progra­ mación con C. Hemos redefinido los ejemplos originales y agregamos ejemplos nuevos en varios capítulos. Por ejemplo, se aumentó el tratamiento de declaracio­ nes complicadas con programas que convierten declaraciones en palabras y vice­ versa. Como antes, todos los ejemplos se han probado directamente a partir del texto, el cual está diseñado de manera que lo pueda leer la máquina. El apéndice A, manual de referencia, no es el estándar, sino que nuestra intención fue trasladar la esencia del estándar a un espacio más pequeño. Está hecho con el ánimo de que proporcione una fácil comprensión para los progra­ madores, pero no como una definición del lenguaje para quienes escriben compi­ ladores —ese papel propiamente le corresponde al estándar en sí. El apéndice B es un resumen de las posibilidades de la biblioteca estándar. También tiene el pro­ pósito de ser una referencia para programadores, no para implantadores. En el apéndice C se ofrece un resumen de los cambios de la versión original. Como mencionamos en el prefacio a la primera edición, C “se lleva bien, en la medida en que aumenta nuestra experiencia con él”. Con una década más de experiencia, aún lo sentimos asi. Deseamos que este libro le ayude a aprender el lenguaje C y también cómo usarlo. Tenemos un profundo reconocimiento hacia los amigos que nos ayudaron a producir esta segunda edición. Jon Bentley, Doug Gwyn, Doug Mcllroy, Peter Nelson y Rob Pike nos dieron valiosos comentarios sobre casi cada página del bo­ rrador de este manuscrito. Estamos agradecidos por la cuidadosa lectura de Al Aho, Dennis Allison, Joe Campbell, G. R. Emlin, Karen Fortgang, Alien Holub, Andrew Hume, Dave Kristol, John Linderrmm, Dave Prosser, Gene Spafford, y Chris Van Wyk. También recibimos útiles sugerencias de Bill Cheswick, Mark Kernighan, Andy Koening, Robin Lake, Tom London, Jim Reeds, Clovis Tondo y Peter Weinberger. Dave Prosser respondió muchas preguntas detalladas acerca del estándar ANSI. Utilizamos extensivamente el intérprete de C + + de Bjarne Stroustrup, para la prueba local de nuestros programas, y Dave Kristol nos ofreció un compilador ANSI C para las pruebas finales. Rich Drechsler nos ayudó grandemente con la composición. Nuestro sincero agradecimiento a todos.

Brian W. Kernighan Dennis M. Ritchie

Prefacio a la primera edición

C es un lenguaje de programación de propósito general que ofrece como ven­ tajas economía de expresión, control de flujo y estructuras de datos modernos y un rico conjunto de operadores. Además, C no es un lenguaje de “muy alto ni­ vel” ni “grande”, y no está especializado en alguna área especial de aplicación. Pero su ausencia de restricciones y su generalidad lo hacen más conveniente y efectivo para muchas tareas que otros lenguajes supuestamente más poderosos. Originalmente, C fue diseñado para el sistema operativo UNIX y Dennis Ritchie lo implantó sobre el mismo en la DEC PDP-11. El sistema operativo, el compila­ dor de C y esencialmente todos los programas de aplicación de UNIX (incluyendo todo el sofware utilizado para preparar este libro) están escritos en C. También existen compiladores para la producción en otras máquinas, incluyendo la IBM System/370, la Honeywell 6000 y la Interdata 8/32. El lenguaje C no está ligado a ningún hardware o sistema en particular y es fácil escribir programas que corre­ rán sin cambios en cualquier máquina que maneje C. La finalidad de este libro es ayudar al lector a aprender cómo programar en C. Contiene una introducción general para hacer que los nuevos usuarios se ini­ cien lo más pronto posible, capítulos separados sobre cada característica impor­ tante y un manual de referencia. La mayoría de las exposiciones están basadas en la lectura, escritura y revisión de ejemplos, más que en el simple establecimien­ to de reglas. En su mayoría, los ejemplos son programas reales y completos, no fragmentos aislados. Todos los ejemplos han sido probados directamente a partir del texto, el cual está en forma legible para la máquina. Además de demostrar cómo hacer un uso efectivo del lenguaje, donde ha sido posible, tratamos de ilus­ trar algoritmos útiles y principios de buen estilo y diseño. El libro no es un manual de introducción a la programación; se supone en él familiaridad con los conceptos básicos de programación, como variables, propo­ siciones de asignación, ciclos y funciones. No obstante, un programador novato deber ser capaz de leer y obtener los conceptos del lenguaje, aunque le ayudaría la cooperación de un colega más experimentado. De acuerdo con nuestra experiencia, C ha demostrado ser un lenguaje agrada­ ba» expresivo y versátil para una amplia variedad de programas. Es fácil de apren­ der y se obtienen mejores resultados a medida que aumenta nuestra experiencia c on él. Deseamos que este libro le ayude al lector a usarlo correctamente.

xii PREFACIO A LA PRIMERA EDICION

Las críticas y sugerencias de muchos amigos y colegas han aumentado muchí­ simo los conceptos de este libro y ha sido un placer escribirlo. En particular nues­ tro agradecimiento a Mike Bianchi, Jim Blue, Stu Feldman, Doug Mcllroy, Bill Roome, Bob Rosin y Larry Rosler que leyeron cuidadosamente las numerosas versiones. También agradecemos Al Aho, Steve Bourne, Dan Dvorak, Chuck Haley, Debbie Haley, Marión Harrris, Rick Holt, Steve Johnson, John Mashey, Bob Mitze, Ralph Muha, Peter Nelson, Elliot Pinson, Bill Plauger, Jerry Spivack, Ken Thompson y Peter Weinberger por sus valiosos comentarios a través de varias etapas; a Mike Lesk y Joe Ossanna, por su invaluable ayuda en la im­ presión.

Brian W. Kernighan Dennis M. Ritchie

Introducción

C es un lenguaje de programación de propósito general que ha sido estrecha­ mente 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, desarro­ llado por Martin Richards. La influencia de BCPL sobre C se continuó indirecta­ mente 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, arreglos, estructuras y unio­ nes. Las expresiones se forman a partir de operadores y operandos; cualquier expresión, incluyendo una asignación o una llamada a función, puede ser una proposición. Los apuntadores proporcionan una aritmética de direcciones inde­ pendiente de la máquina. C proporciona las'construcciones fundamentales de control de flujo que se re­ quieren en programas bien estructurados: agrupación de proposiciones, toma de decisiones (if-else), selección de un caso entre un conjunto de ellos (switch), iteración con la condición de paro en la parte superior (while, for) o en la parte inferior (do), y terminación prematura de ciclos (break). Las funciones pueden regresar valores de tipos básicos, estructuras, uniones o apuntadores. Cualquier función puede ser llamada recursivamente. Las va­ riables locales son normalmente “automáticas”, o creadas de nuevo con cada in­ vocación. La definición de una función no puede estar anidada, pero las variables Pueden estar declaradas en una modalidad estructurada por bloques. Las funcio­ nes de un programa en C pueden existir en archivos fuente separados, que se com­ pilan de manera separada. Las variables pueden ser internas a una función, eternas pero conocidas sólo dentro de un archivo fuente, o visibles al programa completo.

2 INTRODUCCION

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 peyora­ tiva, simplemente significa que C trata con el mismo tipo de objetos que la mayo­ ría de las computadoras, llámense caracteres, números y direcciones. Estos pueden ser combinados y cambiados de sitio con los operadores aritméticos y ló­ gicos implantados por máquinas reales. C no proporciona operaciones para tratar directamente con objetos compues­ tos, tales como cadenas de caracteres, conjuntos, listas o arreglos. No existen ope­ raciones 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 re­ colector de basura. Finalmente, C en sí mismo no proporciona capacidades de en­ trada/salida; no hay proposiciones READ o WRITE, ni métodos propios de acceso a archivos. Todos esos mecanismos de alto nivel deben ser proporcionados por funciones llamadas explícitamente. De manera semejante, C solamente ofrece un control de flujo franco, y lineal: condiciones, ciclos, agrupamientos y subprogramas, pero no multiprogramación, operaciones paralelas, sincronización ni cor-rutinas. 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 compa­ rar dos cadenas de caracteres?”), el mantener al lenguaje de un tamaño modesto tiene beneficios reales. Puesto que C es relativamente pequeño, se puede describir en un pequeño espacio y aprenderse con rapidez. Un programador puede razo­ nablemente esperar conocer, entender y utilizar en verdad la totalidad del lenguaje. 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 Stan­ dards 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 carac­ terí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 me­ nos, que los compiladores pudieran producir mensajes de advertencia acerca del nuevo comportamiento. Para la mayoría de los programadores, el cambio más importante es una nue­ va sintaxis para declarar y definir funciones. Una declaración de función ahora puede incluir una descripción de los argumentos de la función; la sintaxis de la definición cambia para coincidir. Esta información extra permite que los compi­ ladores detecten más fácilmente los errores causados por argumentos que no coin­ ciden; de acuerdo con nuestra experiencia, es una adición muy útil al lenguaje.

EL LENGUAJE DE PROGRAMACION C 3

Existen otros cambios de menor escala en el lenguaje. La asignación de estruc­ turas y enumeraciones, que ha estado ampliamente disponible, es ahora parte oficial del lenguaje. Los cálculos de punto flotante pueden ahora realizarse con precisión sencilla. Las propiedades de la aritmética, especialmente para tipos sin signo, están esclarecidas. El preprocesador es más elaborado. La mayor parte de esos cambios sólo tendrán efectos secundarios para la mayoría de los progra­ madores. Una segunda contribución significativa dei estándar es la definición de una bi­ blioteca 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 se­ mejantes. Una colección de encabezadores (headers) estándar proporcionan un acceso uniforme a las declaraciones de funciones y tipos de datos. Los programas que utiliza...


Similar Free PDFs