Está en la página 1de 153
LENGUAJE DE PROGRAMACION BRIAN W. KERNIGHAN DENNIS M. RITCHIE EDICION EN INGLES [UNIX 5 una marea resistrada AT&T EL LENGUAJE DE PROGRAMACION € Tradlucido de la segunda edition en inglés de: ‘THE C PROGRAMMING LANGUAGE al o parcial de este obra, por cualquier medio 0 método, ior DERECHOS RESERVADOS © 1991 respecto a Is segunda edicion er espaitol por PRENTICE-HALL HISPANOAMERICANA, S.A. ‘Alzccmaieo Nit, S00-5* Piso Col Industrial Atouo 53519, Naucalpan de Jude, Blo. de México ‘Miembro de la Cémara Nacional de la Industria Editorial, Reg, Nam, 1524 ISBN 968-880-205-0 ISBN 0-13-110362-8 IMPRESO EN MEXICO / PRINTED IN MEXICO Prefacio Prefacio a Ia primera edicién Introduccion Constantes simbélicas Entrada y selida de caraeteres Arreglos Funciones Argumentos—llamada por valor Tipos y tamatios de datos Constantes Declaractones Operadores avitmeticos Operadores de velacion y loyicos Conversions de tipo ‘Operadores de incremento y deeremenco Operadores para mancjo de bits 3.5 Cielos—while y for 35 Ciclos—do-while CONTENIDO ay ilo 4, Functones Conceptos Funciottes que restesan valores no-enteros El preprocesador de € jlo S. Apuntadores y arreglos ‘Apuntadores ¥ direcciones ‘Apuntadores y argumentas de funciones Apuntadores y arregles Atitmetica de diteceiones Apuntadores a caracieres y funciones ‘Anreplos de apuntadores; apuntadores 4 apuntadores reglos multidimensionales Inicinlizacion de arceglos de apuntadores iG egl0s multidimensionales ‘Conceptos basicos sobre estructuras Estructuras y funeiones ‘Arreglas de estruciuras ‘Apuntadores o estructures Estructuras autorreferenciadas ‘ilsqueda en tablas ‘Typedet Uniones Campos de bits Capitulo 7. Fateada y salida 2 Envcada y salida estindar Salida con formato—printt Listas de argumentos de longitud variable Entrada con formato—scant ‘Acceso a archivos Mancje de errores—stdett y exit 7.7 Entrada y salida de tineas 118 tras tnciones Capitele 8. La imtertaz det sistema UNIX Apéndice A. Manual de referencia ‘AL Introduccion ‘A2 Convenciones 16xieas ‘Ad Notacidn sintéeticn ‘Ad Sipnificado de los identiticadores AS Objeios y valores-t ‘AG Conversiones AT Expresiones AS. Declaraciones AY Proposiciones AIO. Declaraciones externas ALB Gramética Apéndice B. Biblioteca estindar BI Entrada y salida: B2_ Pruebas de clasficacion de caracteres: Apéndice C. Resumen de moditicaciones Prefacio El mundo de la computacion ha sufrido una revolucién desde la publicacion, en 1978, de El enguaje de programacién C. Las grandes computadoras son aho- ra mucho mas grandes, y las computadoras personales tienen capacidades que ri- valizan con los mainframes de hace una década én el lenguaje C ha imbiado en ese tiempo, alla de io que fueron sus La ereciente popularidad de C, los cambios en el lenguaje a Io larga de los aflos, y la creacién de compiladores por grupos no im en su disefto, se combinaron para demostrar Is necesidad de ui cisa y contempordnes que la que proporci Elestandar formaliza consirucciones sugeridas pero no descritas en le primera edicién, particularmente la asignacion de 1 y las enumeraciones. Pro- porciona wna nueva forma de declaracion de y uso. Especifica una bibl lizar la encrada y salida, mpo establece exp! ia de maquina. n de Et enguaje de programacién icas eriticas, como los apuntadores, que son parte central en la progra- -Hemos redefinido los ejemplos originales y agregamos ejemplos nuevos en varios capttulos. Por ejemplo, se aumenté el tratamizmio de declaracio- ines complicadas con programas que convierten declaraciones en palabras y vice- versa. Como rdos los ejemplos se han probado direstamente @ partir del seflado de manera que lo pueda leer la maquina. ladares —ese pay es un resumen de las posi pdsito de ser una relerenicia para programaderes, no para implantador: apéndice C se ofrece un resumen de los cambios de la versién original, - Deseamas que como usatlo, roy, Peter cada pagina del bo- la culdadosa lectura de Al , Karen Fortgang, Allen Ho- Tohn Linderman, Dave Prosser, Gene Spaf- ford, y Chris Van Wyk. También recibimos utiles sugerencias de Bill Cheswick, Mark Kernighan, Andy Koening, Robin Lake, Tom London, Jim Reeds, Clovis lo y Peter Weinberger. Dave Prosser cespondié muchas preguntas detalladas del estindar ANSI. Utilizamos extensivamente el intérprete de C++ de Bjarne Strousteup, para la prueba local de nuestros programas, y Dave Kristol Brian W. Kernighan Dennis M. Ritchie Prefacio a la primera edicién 1 lenguaje de programacién de propésito general que ofrece como ven- de expresidn, control de flujo y estructuras de datos modernos uaje de “muy alto ni- especial de aplicacién rema operativo, el compila- ss de aplicacién de UNIX Gncluyendo existen compiladores para la produccién en otras méquinas, incluyendo la [BM System/370, la Honeywell 6000 y la Inerdata 8/32. El lenguaje C no esta ligado ‘aningiin hardware o sistema en p ran sin cambios en cualquier maquina que mangje C 1a finalidad de este libro es ayudar al lector a apcentler eémo programar en ©. Contiene na introduccion general para hacer que fos nuevos usta cien lo mas pronto posible, capitulos separados sobre cada caracteristica impor- tante y un manual de referencia, La mayoria de las exposiciones estan basadas ena lectura, escritura y revision de ejemplos, mas que en el simple esta Jos ejemplos son programas reales y completes, no fragmentos sislados. Todos los ejemplos han sido probados direstamente a partir del texco, el cual esta en form: para la maquina. Ademas de demostrar ‘eémo hacer un uso efectivo del lenguaje, donde ha sido posible, tratamos de ilus- y cise. El libro no es tun manual de introduceién a la programacién; se supone en él iaridad con los coaveptos bisicos de programacién, como variables, propo- Siciones de asignacién, ciclos y funciones. No obstante, un programador novato Ueber ser capaz de leer y obtener los concepts del lenguaje, aunque fe ayudaria | cooperacién de un colega més experimen De acuerdo con nuestra experiencia, Cha demostrado ser un lenguaje agrada le, expresivo y verstil para una amplia variedad de programas. Es fail de apren- der y se obtienen mejor dos a medida que aumenta nuestra experiencia Con €1, Deseamos que este libro le ayude al lector a usarlo correctamente. lar y es fdcil escribir programas que corre- All PREFACIOA LA PRIMERA RDICION ‘Las critieas y sugerencias de muchos amigos y colegas han aumentado muchi- de este libro y ha sido un placer escribirlo. En particular nues- ‘4 Mike Bianchi, Jim Blue, Stu Feldman, Doug Mellroy, Bill in y Larry Rosler que leyeron cuidadosamente las numerosas ‘versiones. También agradecemos A] Aho, Steve Bourne, Dan Dvorak, Chuck Haley, Debbie Haley, Marion Harsris, Rick Holt, Steve Johnson, John Mashey, Bob Mitze, Ralph Muha, Peter Nelson, Elliot Pinson, Bill Plauger, Jerry Spi- vack, 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- presion, Brian W. Kernighan Dennis M. Ritchie Introducci6én (Ces um lenguaje de programacion 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 estan escritas en lenguaje C. Sin embargo, este lenguaje no esta ligado a ningin sistema operativo ni a ninguna miiquina, y aunque se le Hama “'lenguaje de programacidn de sistemas” debido iad para escribir compiladores y sistemas operativos, se utiliza con igual Muchas de ls ideas importantes de C provienen del lenguaje BCPL., desarro- llado por Martin Richards. La influencia de BCPL sobre C se contin ct ‘mente través del lenguaje B, el cual fue escrito por Ken Thompson en 1970 para er sistema UNIX de la DEC PDP-7, BCPL y B son lenguajes “carentes de tipos". En contraste, C proporciona una variedad de tipes de datos. Los tipos fundamentales son caracteres, enteros ‘yniimeros de punto flotante de varios tamafios. Ademis, existe una jerarquia de tipos de datos derivados, creados con apuntadores, arreglos, est nes, Las expresiones se forman a partir de operadores y operandos; expresién, incluyendo una asignacién o una llamada a funcin, pucde 5 in. Los apumtadores proporcionan una aritmética de direcciones Pendiente de la méquina. C proporciona las coastrucciones fundamentales de control de flujo ‘uieren en programas bien estructurados: agcupacion de propo a de un caso entre un conjunto de con Ja condicién de paro en la parte superior (wile, inferior (do), y terminacién prematura de eiclos (break). Las funciones pueden regresar valores dei © apuntadores. Cualquier funcién puede ser Fables locales 30 ‘ocacion. La definicidn de una funcidn no puede estar anidada, pero las var Dueden estar declaradas en una modalidad estrueturada por blogues, Las func ss den programa en C pueden existir en archivos fuente separudos, que se com bila de manera separada. Las variables pueden ser intermas a una funcién, externas pero conocidas solo dentro de un archivo fui completo, 2 awimopvecion Un paso de preproce: programa, inclusion de ro es peyora- 0 tipe de objetos que la mayo Ces.un lenguaje de ret a, simplemente significa que C pueden ser combinadé splantados por méquinas reales jorciona operaciones para tratar directamente con objetos compues- reglos. No existen ope- jables locales de lea > en s! mismo no proporciona capacidades de en- mies READ o WRITE, ni métodos propios de deben ser proporcionados fat no hay propos vas. Todos esos mecanismas de alto, ofrece un control de flujo france, y lineal: pero no multiprogramacion, capacidades puede parecer como una wei para compa. lenguaje de un tamaiio modesto mnle pequefio, se puede describir HL LENGUAIE DEPROGRAMACIONG 3 Existen otros cambios de menor escala en el nguaje. La asignacién dk ‘operativo (por ejemplo, leer de archivos ye ignacién de memoria, manipulacién de cade elecucion (rant ‘uefa. Las funciones de la plitita, de manera que se puc puede eseribirse en C, y excepto poi extores de tipo, y no hay conve Sin embarga, C mejores. A pesar de todo, C ha probado ser un lenguaje extremadamente efectivo y expresivo para una amplia variedad de programas de aplicacién, El libro esta organizado como sigue. El capitulo 1 es una intcoduccién orien- tada ala parte central de C. El propdsito es hacer que el lector se inicie tan pronto ‘como le sea posible, puesto que creemos firmemente que lz forma de aprender tun nuevo lenguaje es escribir programas en él. La introduccién supone un conoci- snto practico de los elementos basicos dc la programacion; no hay una explica- cidn de compntadoras, de eompilaci6n, ni del significado de una expresion como n=n+1, Aunque hemos tratado de mostrar s de programacion en donde fue posible, la intencién del libro no ¢s la de ser un texto de vonsulta sobre joritmos; cuando nos vimos forzados a hacer una elec- in, nos hemos concentrado en el lenguaje. En los capitulos del 2 al 6 se discuten varios aspectos de C en mayor detalle rmalmente de lo que se hace en el capitulo 1, aunque el énfasis esté atin en los ejemplos de programas completos, mas que en fragmentos aislados. El ca- 2 trata de los tipos bisieos de datos, operaciones y expresiones. El capitulo ‘rata sobre control de flujo: iFelse, switch, while, for, etc. En el capitulo 4 se cubren funciones y la estructura de un programa —variables externas, reglas es ¥ otras aspectos— y también abarca al pre- een estndar, la cual proporeiona una i Esta biblioteca esta definida por e! estindar todas Jas maquinas que manejan C; as ‘eramas que la usen para entrada, salida y otros accesos al sistema aperativo se puedan transportar de un sistema a otro sin cambios. wgramas en Cy el sistema ope -indose en entradla/salida, el sistema de archivos y la asig- jue algo de este capitulo es especifico de sistemas UNIX, sen otras sistemas de todas maneras encontraran aqui Juyendo alguna comprensién acerca de cémo esté implan- 5 como sugereneias para obtener un js Ia semantica de C es en si el rincipalmente pensado sobre el lenguaie. capitulo; Introduccion general rapido como sea posible al punto cn donde pueda escri erlo tenemos que cot sduccion, por su breyedad, puede también ser e: cjemplos no utilizan la potencia completa de C, no sot veramacién, Los principiantes deben complementarlo ias semejantes & los agui expuestas. Ambos grupes pi lo como un marco de referencia sobre el cual as idas que comienzan en el capitulo 2. 1.1. Comencemos forma de aprender un nuevo lenguaje de program: rama por csc Inprime tas petatoras ‘ola, mundo 8 INTRODUCCIONLENERAL ‘ Este es et gran obsticulo; rarlo debe tener la habilidad de erear del programa de alguna mai a donde Tue n C, el programa para escribir “hola, mand. tinclude La forma de ejecutar este programa dopende del sistema que se esté utilizan- do. Como un ejemplo especifico, en el 10 UNIX se debe crear el como hela.c, ¥ después Si ng se hu cometido algin error, como la omisidn de un caract hard sin emitir mensaje al i se ejecuta a.out es hola, mundo En ottos sistemas, las reglas serén diferentes, consiltelo con un experto. Ahora algunas explicaciones acerca del programa en si. Un programa en C, cualquiera que'sea su tamafio, consta de funciones y variables . Una funcién con- proposiciones que especifican las operaciones de célculo que se van a reali- \dos durante los cdiculos. Las fun« antes a Jas subrutinas y funciones de Fortran o a les es de Pascal. Nuestro ejemplo es una funcién Hamada bertad de dar cualquier nombre dese, especial —el programa comienza a ejecutarse al principio de ‘ode programa debe tener un main en aleun sitio Por lo comiin main llamard a otras funciones que ayuden a realizar su traba- algunas que usted ya escribi6, y otras de bibliotecas.eseritas previamemte. La era linea del programa, include ealdio.h> ioteca estan ipio de muchos archives fuente lo 7 yen el apéndice B. indica al compiladar dar de entrada/salida; esta linea aparece al py de C. La biblioteca estandar esta descrita en el capi SOCIOL Los paréntesis q\ # inclade sain( } EI primer prog esti después del nombre de la ‘main esté de indieado por la main Hama ala funciéie do biblioteca pri para escribir esta sec \a representa ef car de caraeteres; fer nueva tne yrama en C Las proposiciones de una fan ign main s6lo contiene una proposicién, impresién al \u (un experimento que vate la ues de la impresion. Se debe ut vA linea en el argumento de printf; s) estat encerradas entire Haves { }. La fun- pena), encontrar que no hay avance \n para incluir un eardeter nue enta algo como BmTRoDuCCION GENERAL carat: printf nunea proporciona una nueva linea automdticamente, de manera que se pueden utilizar varias llamadas para construir una linea de salida en ctapas. Nuestro primer programa tambien pudo haber sido escrito ee la #inclade Nétese que \n representa mn solo cardcter. Una secuencia de escape vomo \n un meeanisimo general y extensible para representarcarnctere invisi ue € proporciona estén \t para tabula. \\ para la diagonal inverts, Hay una on, \b para retroceso, \" para com ta completa en la seccidn 2.3 Bjercieio 1-1. Ejecute el programa “hola, mundo" en su sistema. Experimente con Ja omision de partes del programa, para ver qué mensajes de error se obtietien. C Ejercicio 1-2, Experimente el desclibrir qué pasa cuando la cadena del argumento de printf contiene \c, en doade c es algiia cardeter no puesto en lista anterior- mente, 1.2 Variables y expresiones aritméticas liza la formula °C = ($/9) (°F-32) para imprimir turas Fahrenheit y sus equivalentes centigrados 0 SECCION 12 240 115 Sahrenbeit-Colsius , 20, 200 »/ fe inferior de la tabla de temperaturas «/ le superior «/ smaio del inoremento +i Jahr = lower; while (labs < = upper) ( far = fake + step; Las dos lineas {1 imprime la tabla Fahrenheit-Celsius para fahr = 0, 20, ..., 900 «/ brevemente lo que hace el progray ados par el co! ograma mis facil en blanco, un tabulador o nueva linea, En C, se deben declarar todas las variables antes de su Principio de la funcién y antes de cualqu: efecu a las propiedades de una variable; consta de un nombre de es, como int far, eolsiue, int lower, upper, step; 10 INTRODUCCION GENERAL ner smo de float depende de la maquina quese 2768 y +3267, son ativos una magnitud generalmente entre ma varios tipos de datos basicos, incluyendo: double punto flotante de dobie precisiin Los tamahos de estos objetos tambidn dependen de la maquina. Tambign existen carreglos, estructuras y uniones de estos tipos bisicos, apuntadores ellos y funciones que regresan valores con e:0s tipos, todo lo cual se vera en e! momento oportuno. ‘Los calculos en el programa de conversion de temperaturas prineipian con las proposiciones de asignaci@n. lower = 05 sper = 300; step = 20; {abr = lower; que asignan a las variables sus valores iniciales. Las proposiciones individuales se terminan con punto y coma. Cada linea de Ia tabla se calcula de la misma manera por lo que se utiliza una se repite una ver por cada linea de salida; este es el propésito del while (fshr <= upper) { gue uppex), el cuerpo del ciclo Luego la condicién se prueba nue- el cuerpo se ejecta de nuevo. Cuando la prueba resul- jahr excede a upper fermina, y la ejecucién continua en la proposicion que sigue al ciclo, No existe ninguna otra proposicién en este progra- ‘ma, de modo que termina. El cuerpo de un while puede tener una 0 més proposiciones encerradas entre aves, como en el convertidor de temperaturas, o una sola proposicién sin Haves, SHeCION VARIABLES YEXPRESIONES ARITMETICAS. 11 La mayor parte d se calcula y ive que (05 valores de los das enteros fab y celsius sean escritos, con una tabu estiindar de Funciones que esta accesible normalmente a los programas en C. Sin embargo, el comporiamiento de printf est que sus propiedades deben ser las mismas e gue se apegue a él, 12 wTRODUCEIOW GENERAL caprres ten un par de problemas con el prourama de conversidn de temperaturas jea debido a que los printh868d %6d\n", lahr, celsius); i el primer miimero de cada segunda en un campo de si 7 mm 6 40 4 o 6 0 2 10037 El problema mas grave es qué debido a que se ha utilizado ar tcros, las temperaturas Celsius no son muy precisas; por ejemplo, 0°F es en rea~ lidad aproximadamente —17.8°C, no —17, Para obtener soluciones mis preci- sas, se debe utilizar aritmética de punto flotante en lugar de entera, Esto requiere de algunos cambios en el programa, Aqut estd una segunda versién: # include /+ imprime Is tabla Fokrenkewt Celssas para labr = 0, 20, } versién de punto tlotante +/ t lower = 0; ‘upper = 300; step = 20; seoc1oN 12 \VARIAGLES Y EXPRESIONES ARIIMETICAS 13 excepto que far y celsius estin deel formula de conversion est eserta en una forma mis natural, i debido a que la divisidn entera lo trunearfa a cero, Sin embargo, un punto decimal en una constante indica que ésta cde puinto flotante, por lo que 8.0/8.0 no se trunce debido a que es una celacién de dos valores de punto flotante. Si un operailor aritmético tiene operands entero, se ejecuta una operacion cntera, Si un eperador numérico tiene un operando de punto flotante y otro ente- ro, este Gliimo serd eonvertido a punto flotante antes de hacer 1a operacién. Si to jera esctito fahr — 32, el 32 seria convertido automaticamenie a .¢, Escribir constantes de punto floranie con puntos decimales ext res enteros, destaca su naturaleza de punto flotante para Las reglas detalladas de cudndo los enteros se convierten @ punto flotante se ‘encuentran en el capitulo 2. Por ahora, nétese que la asignacion fahr = lower; Ja prueba while (lake <= upper) también trabajan en la forma natural — tuarse la operacién. La especificacion de conversiém %3.01 del print! incl rimero de punto flotante (en este caso fahx) por lo menos c« sin punto decimal y sin digitos fraccionarios; 966. se convierte a float antes de efter: o 178 2000-87 40 44 ‘a amplitud y ta precisién pueden omitirse de una especi el alimero es por lo menos de seis caracteres de ancho; %. después del punto decimal, pero el ancho no esta restringido; y %f unicamente indjea escribir el niimero como punto flotante. tea scribe como entero decimal 66 cseribe como entero decimal, por lo menos con 6 caracteres de amplitud ot ceseribe como punto flatente a6 escribe como punto flotamte, por lo menos con 6 caracteres de amplitud 6.1 ceseribe como punto flotante, con 2 ex de %6.2t —_eseribe come punto flotante, por lo menos con 6 caracteres de ancho y 2 después del punto decimal printf también reconoce %o para octal, %x para hexadecimal, %e 96s para cadena de caracteres y %4% para % en s Ejercicio 1-3, Modifique el programa de conversin de temperaturas de modo. que eseriba un encabezado sobre ta tabla, © |. Eseriba un programa que imprima la tabla correspondiente Celsius. a 1.3. La proposicién for Enisten suficlemes formas distintas de escribir un programa para una ‘area en particular. 108 tina variacién del programa deconversién de temperaturas. include imo Ia tabla Fahrenheit Coleiue «/ for (fake = 0; fahr < rinti('63d 966.11 ahr = tahr + 20) ah, (5.0/9.0) -(fahr -32)); Este produce los mismos resultados, pero ciertamente se ve diferente, Un cambio importante es Ia eliminacién de la mayoria de las variables; solo permanece fahr y lahemos hecho int. Los limites inferior y superior y el tamano del avance s6lo ‘parecen como coristantes dentro de la proposicidn for, que e wna nueva construceién, y la expresién que calcula Ia temperatura Celsius ahora aparece ‘como cl tercer argumento de print! en vez de una proposicién de asignacién sepa- rada, printf debe ser un valor de punto flot resin de punto flotante puede est La proposicisin for es um ciclo, con el while anterior, su operaci tes Seeciones, separadas por punto y coma. La primer fahr = 0 SECCION CONSTANTESSIMBOLICAS 15 e ejecura una ver, antes de entrar propiamente al ciclo. La segunda seccién es [a condicion 0 pru fahe <= 300 sin condicién se evalia; sies verdadera, el cuerpo el ciclo (en este caso um sim- ple printf) se ejecuta. Después el inctemento de avance fobs = fahr + 20 se ejecuta y la condicidn se vuelve a evaluar. El cielo termina si la condicién se trace falsa. Tal como con el while, el cuerpo del ciclo puede ser uaa proposicion ‘un grupo de proposiciones encerradas entre llaves. La inicializacién, la sondicién y el ineremento pueden ser cualquier expresién, _La seleusidn entre while y for es arbitraria, y se basa en aquello que parezca for es por lo general apropiado para ciclos en los que la inicializa~ smento son proposiciones sencillas y légicamente relacionadas, pues {que es mas compacto que cl while y mantiene reunidas en un lugar a las propo- wes que controlan al ciclo. xeiclo 1-5. Modifique el programa de conversién de temperaturas de manera que escriba la tabla en orden inyerso, esto es, desde 300 grados hasta 0. C peree, Bytan nals pede poate Programa, ya que proporcionan muy poca informacidn leer el programa, y son di ra de tratar a esos mimeros magi #deline define un nambre simbélico 0 constante simbdl ‘caracteres especial: #aetine texto de reemplases cualquier secuencia de caracteres; 10 ‘include inforior de la tabla «/ superior +) amano del incremenio / define LOWER 0 define UPPER 300 Adeline STEP 20 16 ysTROBLCCION GENERAL Js smprime la ‘abla Fahzenhett-Colslus « / int fahe; for lahr = LOWER; fahr <= UPPER; fahr = fahe + STEP) print("963d $66.1i\a", fab, (8.0/9.0) b Las cantidades LOWER, UPPER y STEP son constantes s por lo que no aparscen entre las declaraciones. Los 1.5. Entrada y salida de caracteres Ahora vamos a considerar una familia de programas relacionados para el pro- de cero © mas caracteres seguidos de un cardcier responsable de hacer que cada sec joteca estindar proporcina varias funciones para leer 0 es carfcter a la ver, de las Guales getchar y putchar son las més simples. Cada vez 6 = gatchar() Ja variable ¢ contiene ef siguiente cardcter de entrada. Los caracteres provienen normalmente del teclado; la entrada de archivos se trata en el capitulo 7. La funcién putchar escribe un cardcter eada vez que se invoca: putchar(e) ido de Ia variable entera © como un cardcter, generalmente cn jamadas a putohar y a printf pueden estar alternadas; la salida aparecerd en el orden en que se realicen las lamadas. SECCIUNLS ENTKADAY SALIDA DECARACTERES 17 1.8.1 Copia de archivos Con getchary putchar se puede escribir una cantidad sorprendente de eédigo in saber nada mas acerca de entrada y salida. El ejemplo ms sencillo es un a que copia la entrada en la salids, un cardcter a la ver: dee un carder while (oardeter no es indloador de fin de archivo) ‘manda a la saida el caricer recién ldo ee un cardeter Al convertir esto en C se obtiene include Js copia la entrada a la Fl operador de relacién |= significa ‘no igual a’ Lo que aparece como un cardcter en el teclado o en la pantalla es, por supues- como cualquier otra cosa, almacenado interniamente como un patron de "0 char tiene la funcién especifica de almacenar cse tipo de dato, pero tam- biga pucde ser usacio cualquier tipo de entero, Usamos int por una sutil pero im- portante razn. El problema es dist Fin de la entrada de tos datos validos. La solueibn 8 que getchar devucive un valor distintive cuando no hay més a la entrada, un lor que no puede serconfundido con ningin BOR, por “end of, nde ai sea lo suficientemente grande para almacena char. No se puede utilizar char puesto que ¢ debe ser s como para mantener a EOF ademas de cualquier otro cardcter. Por lo tanto, se emplea int. EOF es un entero definido en , pero el valor numérivo especifico 8 que no sea el mismo que ningtin valor tipo char. Utilizendo ibdlica, hemos asegurado que nadu en el programa depende del UW IeTRODECCION GENERAL carne 5] programa para copiar podria escribirse de mado mis conciso por progra- ‘madores experimentados de C, En lenguaje C, cualquier asignacidn, tal como (@ = gotchax putchax(-); = EOF) la asignacién dentro de ta co: alta que lade = , to prueba de relacién != se realizaria antes de la asigna- cidn =. De esta manera, la proposicién © = getcharl ) |= EOF es equivalente & © = (gotchar( ) != EOF) Esto tiene el efecto indeseable de hacer que e sea shar encontré fin de archivo. (En el e mas detalle), SECEIUN TS ENTRADA Y SALIDA DECARACTERES 19 .2 Conteo de caracteres Fi sigaiente programa cuenta caracteres ¥ cs semejante al programa que copia. include ls Joe caractores de la entrada; I. vessiéin «/ smain( ) i Toag ne; ne = 0; while (getchar( ) != EOF) ++ printi(9Td\n", no); , La proposicidn + tne: presenta un nuevo operador, ++, 4 nc = ne + 1.pero + neces: de prefijo. ‘BI programa para contar caracteres acumula su cuenta en una variable long on luger de una int. Los enteros long son por lo menos de 32 bits. Aunque en algunas maquinas int y leng son con un valor maximo de 32767, include + cuenta los caractores de la ontrada; 23. versién «/ ‘main( ) double ne; for (ne = 0; getchax() != EOF; ++u¢) 6.010", ne}; 20 INTRODUCKION GENERAL caPrrULD | printf utiliza %i tanto para float como para double; %.Of suprime la impresion dsl punto decimal y de la parte fraceionaria, que es cero. El cuerpo de este ciclo for esté vacio, debido a que todo el trabajo se realiza cen las secciones de prueba e incremento. Pero las reglas gramaticales de C requie- una proposicidn for tenga un El punto y coma aislado se llama proposicion nula, yesté aqui para satisfacer este requisito. Lo colocatmos en una linea aparte para que sea visible. Antes de abandonar el programa para contar caracteres, obsérvese que si la entrada no comer earacteces, La prueba del while @ del for no tiene éxito desde la primera llamada @ getches, y el programa produce cero, el resultado correcto, Esto ex importante. Uno e los aspectos agradables acerca del while y del for es ‘que haven la prueba a inicio del ciclo, antes de proceder con el cuerpo. Si no hay nada que hacer, nada se hace, aun ica no pasar a través del cuerpo del ciclo. Los programas deben actuar en f ligente cuando se Jes dx una entrada de longitud cero. Las proposiciones while y for ayudan a asegurar que los programas realizan cosas razonables con condiciones de frontera. 1.5.3 Conteo de lineas sra que una secuoncia de texto de entrada pa- secuencia de lineas, cada una terminada por un «: ter nueva linea. El cuerpo del while consiste aliora en un if, el cual a su vez controla el incre- mento + +nl. La proposicién if prueba la condicién que se encuentra entre pa- icin es verdadera, ejecuta la proposicién (o grupo de propo- ue le sigue. Hemos sangrado nuevamente para mostrar 10 que controla cada elemento. El doble signo de igualdad = = es la niotacién de C para expresar (como el = simple de Pascal oe! .EQ, de Fortran), Este simbolo se SeCCION PNTRADAYSALIDADECAKACTERES 21 distinguir la prueba de igualdad del = simple que utiliza C para la asignactén Un mensaje de alerta: 10s principiantes de C ocasionaimente escriben = cuando cen realidad deben usar = =, Como se vera en el capitulo 2, el resultado es por Jo general una expresidn legal, de modo que no se obtendré ninguna advertencia. Un cacdicter escrito entre apéstrofos representa un valor entero igual al valor numérico dei cardeter en el conjunto de caracteres de la maquina. Esto se llama una constante de cardeter, aunque s6lo es otra forma de escribir un pequeRo ente 10. Asi, por ejemplo ‘A’ es una constante de cardcter; en cl conjunto ASCH de 3 del cardcter K. Por su yes independiente de un puesto ’A’ es preferible que 65: su significado es obvi conjunto de caracteres en particulat [Las secucncias de escape que se ul ales en constantes de carat constante cadena que contiene s6lo un de cadenas versus caracteres, Ejercicio 1-8, Escriba un programa que cuente espacios en blanco, tabuladores Ejerdl Escriba un programa que copie su entrada @ la salida, reemplazando cada cadena de uno © mas blances por un solo blaneo. O Ejercieio 1-10, Escriba un programa que copie su entrada ata sali do cada tabulacidn por \t, cada retroveso por \b y cada \. Esto hace que las tabulaciones y los espacios sean visibl 1.5.4 Conteo de palabras El cuarto en nuestra serie de programas tiles icteres, usando la definicién de que una palabr: teres que no contiene espacio en blanco Versién reducida del programa wo de UNI Esta es una Hinclude #dclme IN 1 /+ om una palabra «/ #deline OUTO —/. fuera dena palabra «/ (+ cuenta lineas, palabras, y caractoros de Ja entrada «/ main( ) t int c, al, aw, ne, slate; INTRODUCION GENERAL state = OUT; ea= state = IN; + nm } } printi ("bd Md %d\n", ml, nw, ne); } (Cada ver que cl programa encuentra el primer eardeter de una palabra, conta Diliza una palabra mas. La variable state registra si actualmente el programa esta © no sobre una palabra; al iniciar es ‘no estd sobre una palabra”, por lo que se asigna el valor OUT. Fs preferible usar las constantes simbélicas IN y OUT que Jos valores literales | y 0, porque hacen el programa mds legible. En un programa tan pequetio como éste, Ja diferencia es amas mas grandes cl incremento en claridad bien vale el esfuerzo extra que se haya realizado para escribir de esta manera desde el principio. También se descubrird que es mas faci ‘hacer cambios extensivos en programas donde los nimeros migicos aparecer slo como constantes simbélicas. La ines nl = nw = no = 0; inicializa a las tres variables en cero. Este no es un caso especial sino una conse- cuencia det Hecho ce que una asignacion es una expresién con un valor, y que las asignaciones se asocian de derecha a izquierda. Es como si se hubiese escrito al = (w= (ne = O)} El operado: ignifiea "0" (0 bien YOR"), por lo que la linea Benn ona whe== 0 dive “si ¢ 5 un blanco 0 ¢ es nueva linea a ¢ es ut de escape \t es una representacién vi tabulador'’, (Recuerde que derecha, y se zar Jn verdad o fs cs un blanco, no hay necesidad de probar sies una nue~ va linea 0 un tabulador, de modo que esas prucbas no se hacen, Esto no es de SECCION Le ‘Apreatos 23 Jar importancia en este caso, pero ¢s significative en situaciones més com- das, como se vera mas adelante. zjemplo muestra también un else, el cual especifica una acci6n alieruativa la condicién de una proposicidn if es falsa, La forma general es af (expresisn) proposicién, else proposiciing Lina y s6lo una de las dos propasiciones asociadas con un it-else se cealiza, Si es verdaderu, se ejeculs p ves. En el programa para contar palabras, la que controla dos proposiciones entre llaves {Cémo probaria el programa para cont ada es la més conveniente para descubrir errores palabras? ;Que clase istas exisien? © jercicio 1-12. Escriba un programa que imprima su entrada una palabra por a, 1.6 Arregios Bscribamos un prog Variables individuales. Esta es una versiGn de] programa: Hinclade /+ cuenta digitos, expacios blancos, y ottos +/ ain{ ) 24 INTRODUCCION GENERAL eaprruta 1 SECCION Le ARREGLOS 28 while (e = getchar( }} != EOF) (ec >= Vasec= 9) olse f (0 == + + nuh: == Wie =. 90 lee = + +nother; EL patron. i (eondivion) ed, otxos = %d\0", La salida de este programa al ejeeutarlo sobre si mismo es Aigitos = 9300.00000 1, espacios blancos = 123, otros = 345, La dectaracién detlara ndigit como un arreglo de 10 enteros. En C, los subindices de arreglos comienzan en cero, por lo que los elementos son ndigit[O], ndigit ‘Un subindice puede ser cualquier expresién entera, lo que incluye a variables fenteras como i, ¥ constantes enteras. Este programs en particular se basa en las propiedades de la representacion de los digitos como caracteres. Por ejemplo, la prueba, W(e>= UV &bo<= miembro de un conjunto de constantes. Para contrastar, se presentard una n de este programa, usando switch, en la seccién 3.4, subindice valido para el La decision de si un cardeter es digito, espagio en blanco w otra cosa se realiza con la secuencia ere 0 b&e < + tndigitfo~t 26 INTRODUCCION GENERAL captruto 1 1.7 Funciones En Lenguaje C, una fareién es el equivalente a une subrutina 0 fins Fortran, o a un procedimiento o funciéa en Pascal. Una funcién propor una forma conveniente de encapsular algunos céleulos, que se pueden emplear despues sin preacuparse de su implantactén. Con fun mente, es posible ignorar edmo se realiza un trabajos es hace, Fl lenguaje C hace que el uso de funciones sea fi onveniente y eficien- sola vez, Uinicamente ruting de exponen ivas de enteros pe Esto es, el quetios, pero es su jon pow(z,y) que calcula x). ‘A continuacidn se presenta la funcién power y un programa main para utili. zarla, de modo que se vea la estructura completa de-una vez include int power(int m, int); J+ prueba la fuacién power «/ maint ) { int i; rintf("96d Yd Yoda return 0; fs power: eleva la base a la n-dsima polencia; s >= 0 +/ Int powor(int base, int n) pel for (= Lh <= m+ 41) P= pe base; seccioN 17 Funcionts 27 Una definicidn de funeion tiene ta forma tipo-de-retorno nombre-de-funcion (decleracién de pardmetros, si tos has) ien nueden aparecer on cualquier orden y en puede separarse en archivos aparece en varios archi I ver se tengan que especificar ilar y cargarto que si estuviera en uno solo, pero eso es cosa ema operative, no un atributo del lenguaje. Por ahora supondremos que ambas funciones estan en el mismo archivo y cualquier cosa que se haya aprendi- do acerca de como ejccutar programas en C, aiin funeionariin La funeién power se invoca das veces por main, en la linea ved Sed Yd\n", t, powor(2,), powart=3, formato y se imprime. En una expresién, power( lo son 2 e 4. (No locas las funciones producen un valor ea de la funciin power, int power(in base, Int n) declara fos tipos y nombres de los parémetros, asi como el tipo de resultado que funcidn devuelve. Los nombres que emplea power para sus pai funcién y som invisibles a cualquier otra funcidn: otras rutinas pueden ‘mismos nombres sin que exista problema alguno. Esto tambien es cier- © para las variables iy p: la de power no tiene nada que ver con la 3 de main. Generalmente usaremos pardmeiro para un variable nombrada en la lista en- do al hacer Los términos argumento formal 0 real se emrplean en ocasiones para hacer la El valor que calcula power se regresa a mai puede seguir cualquier expresion: rotuen expresion Jna funcién no ‘return al final de main mnbign puede regresar un we en el que el programa rente haya notado que hay una proposi Pucsto que main es una funcién como cualquier ra quien la invoea, que es en efecto el medio ar 2H INTRODUCCION GENERAL carr ca una terminacién nor- ‘omitido hasta ahora las propo- siviones return de las funciones main, pero sc incluiréin mAs adelante, como un recordatorio de que los programas deben regresar su estado final a su medio am- biente. La dectaracién ica que power es una funcién declaracién, a la cual se le llama funcion pro- sn y uso de power. Es un error el que la defl- uso que de ella se haga no corresponda con precisamente antes de main fe espera dos ar- gumentos int y regresa un ipo, debe coincidir con ‘de una funcién o cualqui escrito. int powerti No obstante, unos nombres bien seleccionados sori una buena documentacion, por lo que se empleardn frecuentemente beam +49 p= pe base: return p: sus tipos se declaran amtes de declaran se toman como int jimetros se nombran entre ierda; los parame funcién es igual a se visto como sigue: seccION DA AROUMENTOS—LLAMADA POR VALOR 29 {que por omision se padia suponer que power regresaba un entero, toda la decla- racién podria haberse omitido. La nueva sintaxis de los prototipos de funciones permite que sea muctio més para el compilador detectar errores en el mimero © tipo de ar ‘gn, pero se tecomienda ampliamente que se wor que la maneje, 1.8 Argumentos—Ilamadas por valor Hay un aspecto de las funciones de C que puede parecer poco familiar a los programadorcs acostumbrados a otros lenguajes, particularmente Fortran. En C, argumentos de una funcién se pasan “'por valor”. Esto significa que {que se invoca recibe los valores de sus argumentas en variables tempo- rales ¥ no en las originales. Esto conduve a algunas propiedacles diferenies a las que se ven en Ienguajes con “'Ilamadas por referencia” como Fortran a con pata os var en Pascal, et donde la rutin que se invoes tiene aecese al argumento inal, no a una copia local. La diferencia principal es que en C la funcidu que se invoea no puede alterar directamente una variable de la funcién que hace la llamada; sélo puede modifi- car su copia privada y temporal, Sin embargo, la llamada por valor es una ventaja, no una desventaja, Por lo comin, esto conduce a elaborar programas més compactos con poces variables extranas, debido a que los pardmetros se tratan en la funicin invocada como va lables locales convenientemente inicializadas. Por ejemplo, he aqui una version de power que ullliza esta propiedad, is power: eleva le base a la n-ésima potencia; n> =0; version 2 +/ int power{int base, int a) A int ps for (p = 1; > 0; —-n) Fl pardmetro 2 se utiliza como una variable temporal, y se decrementa (up cielo for que se ejecuta hacia atr4s) hastz que Vega a cero; ya no es necesaria Ja variable 3. Cuslquier cosa que se le haga a n dentro de power no tiene efecto sobre el argu- mento con el que s¢ Llamé originalmente power, 30, qwrkoDUCcION GENERAL, carrrutoy Cuando sea necesario, es posible hacer que una funcién modifique una va- riable dentro de una ruting invocada. La funcién que llama debe proporcionar ln direccidn de la variable que sera cambiada (téenicamente un apuntador ala va- rable) y la funcién que se invoca debe declarar que cl parametro sea un apunta- dlr y tenga acceso a la variable indirectamente a través de él. Los apuntadores se tratarén en el capitule $. La historia es diferente con los arreglos. Cuando el nombre de un arreglo se valor que se pasa a la funcion ¢s la localizacion © del arreglo —no hay copia de los elementos dicl arreglo, ‘este valor, la funcién puede tener acceso y alterar cual quier elemento del arreglo. Este es el tema de la siguiente seccién. 1.9 Arreglos de caracteres (nay ore linea) le ‘que la anterior mds larga) eudrdale uarda su fongiiud Imprime ta tinea mds targa Este pseudocédigo deja e tes, Una trae una nueva linea, otra la prueba y el Puesto que la division de las partes es mur de ese modo. Asf pues, esribamos primero uu Sn gelline para extract la siguiente lines de la entrada. Trataremos de hacer a la funcién ttl en otros eon- textos, Al menos, geiline tiene que cegresar una sefal acerca de un fin de archivo; un diseno de més u ‘ea, 0 cero si se encuentra el fin de archivo. Cero es un regreso de fin de arc ceptable debido a que nunca es una longitud de linea valida, Cada linea de texto ‘ene al meaos un cardeter; incluso una linea que s6lo contenga nn cerdcter mucva Jinea tiene longitud ‘0 que el programa se divide naturalmente en par~ le es mayor que la anteriormente més larga, sugiere una segunda funcion copy, para vo- Nt ARREOLOSDECARACTERES 31 #inclade define MAXLINE 1000 [+ tamaao maximo de la linea de entrada «/ cchar longest[MAXLINE]; /+ la linea mas larga se guards aqui «/ , MAXLINE)) > 0) Ihubo una linea +/ longest); ) J+ gelline: leo una linea en s, regrega si longitad / ‘nt geiline(char s[], int kim) { late, im-L G6 (e=getcksx{ )) !=EOF 66 cl="\n'; + +i) } ‘+ copy: copia void copy(char son ‘to’; eupone quo to os suficiantomante grande +/ ], char from) 32 INTRODUCCION GENERAL carmmuto a Las funconesgeltiney copy extn decaracas al principio del progr s¢ supone esta conten tnein ¥ gollin se conunican e treed de til par dédaguméntosy on valarde retorno. En getline los argumentos se deciaran por la linea int gellino(cha: (que especifica que el primer argumemto, s, ¢s un arteglo, ¥ el segundo, lim, es un entero, El propésito de proporcionar el tamano de un arreglo es fijar espacio de almacenamiento contiguo, La longitud del arreglo s no es necesaria en getline, puesto que su tamafio se fija en main, En getline se utiliza zeturn para rearesat un valor ¢ quién lo Hama, tal como hizo la funcién power. Esta linea también dedlara que getline rearésa unt int; puesto que int es el valor de retorno por omi- sién, puede supr Algunas funciones regresan unt valor util; otras, como copy, se emplean ti camente por su efecto y no regresan un valor. El tipo de retorno de eepy es void, smemte que ningtin valor se regresa En getline se coloca el cardcter ‘\O'(cardcter mufo, cayo valor es cera) al final delarreglo que estd creando, para marcar el finde ia cadena de caracteres, Esta con- n seutiliza por el Ienguaje C: euarido una constante de caracter com ‘nt lire) rograma en C, se almacena como un arreslo que contiene los caracteres de la cadena y termina con un "\O' para marcar el fin. ETe]’][«]“]w de que su argumento de entrada se termina con ‘\0', y copia este ca récier dentro del argumento de salida. (Todo esto implica que “\O", no es parte de un texto Ly Es titil mencionar de paso que aun un programa tan pequefio como éste pre- senta algunos problemas de diseno. Por ejemplo, zqué debe hacer main si en cer inea que es mayor que sy limite? getline trabaja en forma segur en ee caso detiene Ia recopilacién cuando el arteglo esta leno, aunque no en- 2. Probande la Tongitud y el ihimo cardcter devuel- Tels ests cots cl a fae Garang, concn ela tamano de la cadena, por lo que decidimos no agregar eomprobacién de errores en ella. SeCCIONL 10 YVARIADLESEXTERNAS VALENCE 33 Ejercicio 1-16. Corrija la rutina principal del programa de la Hinea més larga de ‘modo que imprima correctamente la longitud de lineas de entrada arbitrariamen- ie largas, y tanto texto como sea posible. C Eje 7. Eseriba un programa que imprima todas las ineas de entrada que sean mayores de 80) caracteres. 0. Kjercicio 1-18, Escriba un programa que elimine los blancos y las tabuladores que estén al final de cada linea de entrada, y que borre completamente las lineas on blanco. Ejercicio 1-19. Bs res s. Usela para esc '@ funcién roverse(s) que-invigrta la cadena de caracte- jr Un programa que invierta su entrada, linea a linea. © 1.10 Variables externas y aleance Las variables que estiin en main, tal como line, longest, etc, son pri ales a ella, Debido a que Son declaradas dentro de main, ninguna otra fun er acceso directo @ ellas. Lo mismo tam funciones; por ejemplo, Ia variable 4 en 3 com la; que esté en copy. Cada variable local de una funcién co sélo cuando se Nama 1 para hacer referencia a esas variables loc: categoria de almacenamiento estiti van sus valores entre lamadas.) Debido a que las variab Como una alternativa a Ins variables aut \n externas & todes las funcione: le tener acceso por su nombre. an o.a las variables de Pascal deelaradas en el bloque mas exterior.) Debi- fener acceso global 1 las variables externas, éstas pueden ser s de arguinentos para comunicar daios entre fu Puesto que las variables externas se mantienen permanentemente en » en lugar de aparecer y desaparecer cuando se Maman y terminan las jones, mantienen sus valores aun después de que regresa la funcién que los Una variable externa debe definirse, exactamente una ver, fuera de cualquier ‘uncion; esto fija un espacio de almacenamiento para ella, La variable también que desee tener acceso a ella; esto establece el debe ser una proj externespil Puede estar implicita en el contexto, Para concretar la 34 vTropuccioN GENERAL, carrmuto Tinea més larga con line, longest y max como cambiar las lamadas, declaraciones y euerpos: programa Esto requi #include #dofine MAXLINE 1000 /. maximo lamaio de una linea de entrada ./ J maxima longitud vista hasta ol momento «/ de entrada actual «/ linea mas larga so quarda aqul +/ 1" imprime la linea de entrada mae Isrga: vorsi6n eepecializada */ main( } f int len; ‘extern int max; extem char longest|); max = 0; while (len = getline( )) > 0) 1s golline: veraign expecislizada +/ int gollixo(vold) jables externas, VARIABLESEXTERNASYALCANCE 35 lineli] = \0% retura ih 1 / copy: version especlalizada +/ void copyiveid) int i; extern char line|}, longest; 1=0; vmhile (Congest Las variables externas de main, getline y copy estén definidas en las primeras lineas del ejemplo aaterior, lo que establece su ti cio de almacenamiento. Desde el punto de nas son exactamente como las det variables locales, pero puesto que som externas. Antes de que una fun- (én pueda usar una variable externa, se debe hacer saber ef nombre de la variable ‘la funcidn, Una forma de hacer esto es escribir una declaracién extern dentro de 1a funcién; la declaracion es la misma que antes, excepto por Ia palabra reser- vada extern, Bajo ciertas circunstancias, la declaracion extern se puede o1 ‘Gn de una variable externa oeurre dentro del atc te antes 12 funcién en particular, entonces no es necesario el uso d redundante. De hecho, una préctica comiin, es poner las definic das las variables externas al principio del archivo fuente y después o das las declaraciones extern. rama esta en varios archivos fuente y una variable se define en archi- en archivo? y archivo3, entonces se necesitan declaraciones extern Ja variable, La practica jones en un archivo sepa- jer, que es incluido por #inclede al principio hse usa por convencién para nombres de hea- 8. Las funciones de a Biblioteca estindar, por ejemplo, edn decaradas on 'aders como . Este tema se trata ampliamente en el capitulo 4, y la feca en el capitulo 7 y en el apéndice B. decade archivo 36 INTNODUCCION GENERAL carrroLo ‘Puesto que Tas versiones éspetializadas de getline y copy no tienen argumen- sugeritia que sus prototipos al principio del archivo deben ser gotli ero por compatibilidad con programas de C anteriores, el estén. Ja palabra voi ‘Se debe notar que empleamo: idadesementels pleas defini y del ies externas en esta seecion, La palabra “de se crea Ia variable 0 se le asigna un lugar de ” se refiere al higar donde se establece la naturale- za.de la variable pero no se Te asigna espacio, A propésito, existe una tendencia a convertir todo en Variables exten, debido aque aparentemente simplifica las comunicaciones —Ias lista de argumeatos son cortas y las variables existen siempre, cuando se les requiere. Pero las variables externas existen siempre, aun cuando no haven falta, Descansar fuertemente 80- bre variables externas es peligroso, puesto que lleva a programas cuyas cone: xiones entre datos no son completamente obvias —lus variables pueden cambiar seen forma inesperada ¢ inadvertide, y el programa es diflcil de modificar. La segunda versién del programa de fa fines mayor es inferior ala primera, en parte . Con estos Eundamentes, es posible: tamano considerable, y probablemente se cientemente grande para realizaclos, Esto: jos sugieren programas de com- plejidad algo mayor que los anteriores det capitulo. Ejercicio 1-20. Bseriba un programa detab que reemplace tabuladores de ta en- ‘vada con el ndmero apropiado de blancos para espaciar hasta de tabulacién. Considere un conjunte fijo de paros de tabulacién, digamos cada nm columnas. ;Debe ser una variable 0 un pardmeira simbético? O Ejercieio 1-21. Escriba un programa entab que reemplace cadenas de blancos por el minimo niimero de tabuladores y blancos para obtener el mismo espaciado. Considere los paros de tabulacién de igual manera que para detab. Cuando un tabulador o un simple espacio en blanco fuese suficiente para aleanzar un paro de tabulacién, ja cual se le debe dar preferencia? O Escriba un programa para ‘“doblar’” lineas grandes de entrada en no blanco que ocurra an~ ese de que su programa se comporte, apropiadamente con lineas muy largas, y de que no hay blancos o tabuladores, antes de la columna especificada, -€C108110 VARIABLES EXTERNASY ALCANCE 37 Ejercicio 1-24. Escriba un programa paca revisar los errores de sintaxis rudimen ios de un programa en C, como parent ves y carchetes no alineados, No vide las comillas ni los apéstrofos, las secuencias de escape y 10s comentarios. ste programa ¢s dificil si se hace co general.) capituLo2; Tipos, operadores y expresiones Las variables y las constantes son los objetos de datos basicos que se manipu- lizar y establecen et tipo que tienen y algunas veces cudles son sus valores ini- ss. Los operadores especifican lo que se hard con las variables, Las expresio- nes combinan variables y constantes para producir nuevos valores, El tipo de un objeto determina el eonjunto de valores que puede tener y qué oper den realizar sobre él, Estos son los temas de este capitulo. El estindar ANSI ha hecho muchos pequefios cambios y agregados a los ti- 1pos bisicos y a Jas expresiones. Ahora hay formas signed y unsigned de todos ipos enteros, y notaciones para constantes sin signo y constantes de caracter hexadecimales. Las operacionesde punto flotante pueden hacerse cn precision sen mbién hay un tipo long double para precision extendida. Las constames de cadena pueden concatenarse al tiempo de compilacion. Las enumeraciones son va parte del lenguaje, formalizando una caracteristica pendiente por mucho ‘empo. Los objetos pueden ser declarados const, lo que impide que cambien, Las reglas para conversion automatica entre tipos aritméticos se aumentaron pa ra maugjar el ahora mas rico conjunto de tipos. 2.1 Nombres de variables Aunque no to mencionamos en el capitulo 1, existen algunas x 's nombre de las variables y de las constantes simbdlicas. Los nor 40 71005, OPERADORES Y EXPRESIONES capruto2 0s 31 caracteres dé un nombre interno son signi se pueden utilizar como nombres indsculas, muveniene clegit nombres que estén relacionados con el propdsito de la ilizar nombres cortos para . ¥ nombres mas largos para vai 2.2 Tipos y tamajios de datos Hay unos cuantos tipos de datos basics en C: cher un solo byte, capaz de contener im etrdater del conjunto de int tun entezo, jente det tara natural de Tos enteros en ta maquina en la-que se elecuta, float punto flotante de precisién normal. punto flotante de dable precisién. 0s calificadores que se aplican a estos tipos basicos. Jeng int counter; {a palabra int puede omitirse de tales declaraciones, lo que tipicamente se hace. La inteneién es que short y long puedan proporcionar diferentes longitudes deenteros donde sea practico; iat sera normalmente el tamaflo natural para una.” ‘niquina en particular. A menudo short es de 16 bits y long de 32; int es de 16 ode 32 bits. Cada compilador puede seleccionar libremente los tamafos apropia- dos para sv propio hardware, sujeto s6lo a la restriccion de que los shorts « ints son por Jo menos de 16 bits, os longs son por lo menos de 32 bits y el short no ts mayor que int, el cual a su ver no es mayor que long. Flealificador signed 0 unsigned puede aplicarse a char o a cualquier entero. :meros unsigned son siempre positives 0 ¢ero y obedecen las loyes de la donde mes el niimero de bits en el tipo. Ast, por ejemplo, Jas variables unsigned char tienen valores entre 0 y 255, en valores entre ~128 y 127 (en una io de que los chess ordinarios sean com. seccion2.s onstrates 4 aque se pueden imprimir EI Lipo long double especifica punto floiante de precisién extendida, Igual s tamanos de objetos de punto flotante se definen en la Ejercicio 2-1. Eseriba un programa para determinar los rangos de variables char, Signed como signed, imptimiendo los valores epropiae ica hexadecimal, Por ejempl yOxlf 6 OXF en hexadecimal. lor particular y mas facil de leer. Las constantes de ‘ones muméricas tal como cualesquier oiros ‘idnmente en comparaciones con otros cat Ciertos curacteres pueden ser representa Por medio de secuencias de e 42 TIPOS, OPERADORES VENPRESIONES ‘earrteLo2 como dos caracteres, pero representan sélo uno. Ademas, un pation de bits ar- bitrario de tamafio de un byte puede ser especificado por ‘ooo! en donde 090 son de uno a tres digitos octales (0...7) 0 por "ehh en donde Ad son uno 0 mas digitos hexadecimales (0... mos escribir define VIAB'\013'—_/+ tab vertical ASCII «/ #doline BELL "\007' —_/+ carSctor campana ASCII «! £, A..F). Ast podria- , en hexadecimal, #dotine VIAB ‘\xb’ + tab vertical ASCIL «/ #doling BELL "x7! —_—_/+ catdoter campana ASCII «/ El conjunto completo de secuencias de escape es \ecardster de ataima (eampanay \\ diagonal invertida \b retraseso \?— imterrogacisn AE avance de hoia \.apéstrofo \m nueva tinea \"comillas \eoe nimero octal (shh niimero hexadevimal Me reaeso de caro At tabulador horizontal \¥tabulador verti Laconstante de cardcier ‘\G' representa ol eardcter eon valor cero, el carter aula, “\O" a menudo se esribe en ver de 0 para enfatizar la naturaleza de caracter de algunas expresiones, pero cl valor numérico es precisamente 0. ‘Una expresién constante es una expresign que sdlo inmiscuye constantes, Ta les expresiones pueden ser evaluadas durante la compilacién en ver de que se haga en tiempo de ejeeucién, y por tanto pueden ser utilizadas en cualquier lugar en que pueda encontrarse uns constante, como en #dsline MAXLINE 1000 char line [MAXLINE + 1); ‘define LEAP 1 /+ on aios bisizstose/ nt days (91+28+LBAP+31+30+91+30+31+31490+31+30+911; Una constante de cadena o eadena fiterat, es una secuencia de eeto 0 mas ca- Facteres encerrados entre comillas, como en "Soy una cadena” ° Ta cadena vactn «/ seccionas CONSTANTES 43, Las mismas cadena: es equivalemie a “hola, mundo! (s) de la biblioteca cadena de caracteres, ex: |. Aqui esté nuestra versidn: longitud de = */ Sstring-h> ‘enum boslean (NO, YES), El primer nombre en un enum tiene valor 0, el siguiente 1 #8 menos que sean especificados valores explicitas. Sino todos los valores son es- 44) p08, OPERADORES FEXPRESIONES cuties: pecificados, los valores 90 especificados continian la tltimo valor que sf lo fue, como en el segundo de esas resin a partir det ‘enum escapes { BELL = “\a', NVALIN = enum months {ENE = 1, FEB, MAR, ABR, MAY, IUY, WL, AGO, Sk, OCT, NOV, DIC), = FEE 66 2, MAR es 3, etc, +/ jones diferentes deben ser distintos. Los va- Fiables de enumeracign offecen la oportunidad de revisarlas y tal vova es @ menudo mejor que #doline. Ademas, un depurador puede ser capaz de impr tnir los valores de variables de eniumeracién en sy forma § 2.4 Declaraciones “Todas las variables deben Ser declaradas antes de su uso, aunque ciertas decla- raciones pueden ser heclas €n forma implicita por el contexto. Una declaracion .¥ comiené una lista de una © mas variables de es tipo, como en las entre ls declaraciones en cuslquier forma: de arriba podria igualmente ser esrita como sat lower: int upper sn stop: het char line); Esta diltima forma ocapa mis espacio, pero es conveniente para agregar un co- memtario a cada declaracién © para modificaciones subsecuentes, ‘Una variable también puede ser iniciatizada en su declaracién, Si el nombre ‘0 por un signo de igual y una expresién, la expresién sitve como un ini- dor, como en SECCIONES OPERADORES AMITAUETICOS 48 har ace = ‘\' 1 €s efectunida slo ai cambiado, Para un arreglo, {tos no seran alierados, cont double w = 2.7182a182245905; const char msol] = “procaucién: eambia ese arreglo: Int stlon(const char{}; ¢ efectiia un intento de cambiar un const, cl resultado esta de! intacion, 2.8 Operadores aritméticos Los operadores aritméticos binarios son +, —, «, /, y el operador médulo %. La divisién entera trunca cualquier parte fraccionaria. La expresién xy produce el residuo cuando x es dividido entre y, por lo que es cero cuanda y Uivi de a x exactamente. Per ejemplo, un afi es bisicsto si es divisible entre 4 pero xno entre 100, excepto aquellos aftos que son divisibles enire 400, que si som bisies . Por Jo tanto (year % 4 == 086 year % 100 1= 0)} rintf('%4d 00 um ato bistosto\a”, year) year 409 == 0) alse Pri dno es un aro bisiesto\n”, year operador % no puede aplicarse a operandos float © double. truncamiento para / y el signo del resultado de % son dependientes de la mo ara operandos negalivos, asi como la accidn que se toma en caso de sob © subflujo, 46. TIPOS, OPERADORES Y EXPHESIONES caprruo2 es menor arios. Los Los operadores binarios + y ~ tienen Ja misma precedencia, | que la precedencia de *, /, ¥ 96, que a su vez-es menor que + ¥— operadores aritméticas se asocian de izquierda a derecha. La tabla 2-1 que se encuentra al final de este capitulo, resume la precedencia idad para todos los operadores. 2.6 Operadores de relacion y légicos Los operadores de relacisn son soos eee ‘Todos ellos tienen la misma prevedencia, Precisamente bajo ellos en prevecencia estan los operadores de igualdad sen precedencia inferior que los operadores ‘ion vomo i < lim=1 setoma como i< miticos, como se esperacia, Mas interesantes son los operadores lénicos && y ||, Las expresiones conecta~ das por &é&0 } son evaluadas jerda a derecha, y la evaluacion se detiene tan promio eomo se conoce el resultado. verdadero 0 falso, La mayoria de los programas en C descansan sobre esas propiedades. Por ejemplo, aqui esté un ci- clo de la funcién de entrada getline que escribimos en el capitulo 1: ‘mis, si esta prueba falla, no debeiios seguir y Teer otto cardcter. Dema ba desal de que s¢ llame a getchar; por lo antes de que se pruebe e} cardcter ¢: La precedencia de && es mis alta que la de {!, y ambas son menores que 10s operadores de y de asignacion, asi que expresiones como = WW 86 ¢1= EOF no requieren de paréntesis adicionales. Pero puesto que la precedencia de != es superior que Ja asignacion, los paréntesis se necesitan en tenet ee ‘obtener el resultado deseadlo de asignacién a © y después comparacién con a nado si ¢ fuese probada contra EOF antes llamada y la asignacién deben ocurti s= Nahe <= 2) sohuen © + ‘at "A lse return ¢; ' Esto funciona para ASCH debido a que las correspondientes letras mayusculas ¥y minisculas estan a una distancia fija como valores numéricos y cada alfabeto atre Ay Z, Sin embareo, ta para el conjunto de caracteres EBCDIC, asi que este ebdigo podria convertir algo ma: ‘header estandar , que se describe en el apéndice B, define una \clones que proporcionan prucbas ¥ conversiones independientes de los jucgos de cara lejra minwscula dee transportable para la funcién lower mostrada ant prueba. ope Ubkes= 0 puede reemplazarse por {adigi(c) Nosotros utiizaremos las funciones de en adelante, | punto acerea de Ia conversidn de earacteres 2 enteros. El len- ‘tuaje no especifica si las variables de tipo char son valores con © sin signo. Cuan- o un char se convierte a int, j y las exprestones Idgicas conectadas estén definidas para tener un valor de 1 siendo verdaderas, ¥ 0 al este modo, Ia asignacion aparecer come negativos en algunas més iad, se debe especi nace Ia dsie es un digito, yO si no lo es, Sin embargo, las funciones como isdi- git pueden regresar cualquier valor diferente de cero como verdadero. En la parte Ge validacion de if, while, fo, es., “verdadero” es solo “diferente de cero, por To que esto ne hace diferencia. cas implictas trabajan como se espera. En general, sim operador como + 0 + que ioma dos operands (operador binaro) rene operandos de diferentes tipos, cl tipa ‘menor’ es promovido al tipo “supe! antes de que la operacion proceda, El resullado es el del tipo mayor. La seceidn 6 del apéndice A establece las reglas de conversi6n en forma precisa. Si no hay operaaddos unsigned, sin embargo, el siguiente conjunto informal de reglas bas- card: Si cualquier operando es long double, conviértase el otro a long double. De otra manera, si cualquier operando es double, conviértase el otro a double. De otra manera, si cualquier operando es float, conviértase el otro a float. De otra manera, conviértase char y short a int. ‘Después, si cualquier operando es long, conviértase el otro a long, Notese que los float que estén en una expresidn no se convierten auiomativa- i original, En general, las funs clones mateméticas como las de utilizarn doble precisién. La razon ppara usar float es ahorcar espacio de almacenamien(o en atregios gran- ‘menor frecuencia, ahorrar tiempo en maquinas en donde la aritmé- nS particularmente costosa. son mas complicadas cuando hay operandos us que TU, que es un nod long, Pero~IL > TUL, debido a que ~IL x prom asi parece ser un gran ntimero po: » es promovide a ‘a unsigned long

También podría gustarte