Your SlideShare is downloading. ×
  • Like
LENGUAJE en C
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply
Published

Aprende a programar en "C"

Aprende a programar en "C"

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • No esta mal las definiciones y el tratamiento del tema
    Are you sure you want to
    Your message goes here
    Be the first to like this
No Downloads

Views

Total Views
384
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
14
Comments
1
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Introducción a laprogramación en lenguaje C
  • 2. IntroducciónC es un lenguaje de programación de propósito general que ofrece economía sintáctica,control de flujo y estructuras sencillas y un buen conjunto de operadores. No es un lenguajede muy alto nivel y más bien un lenguaje pequeño, sencillo y no está especializado en ningúntipo de aplicación. Esto lo hace un lenguaje potente, con un campo de aplicación ilimitado ysobre todo, se aprende rápidamente. En poco tiempo, un programador puede utilizar latotalidad del lenguaje.Este lenguaje ha sido estrechamente ligado al sistema operativo UNIX, puesto que fuerondesarrollados conjuntamente. Sin embargo, este lenguaje no está ligado a ningún sistemaoperativo ni a ninguna máquina concreta. Se le suele llamar lenguaje de programación desistemas debido a su utilidad para escribir compiladores y sistemas operativos, aunque deigual forma se pueden desarrollar cualquier tipo de aplicación.La base del C proviene del BCPL, escrito por Martin Richards, y del B escrito por KenThompson en 1970 para el primer sistema UNIX en un DEC PDP-7. Estos son lenguajes sintipos, al contrario que el C que proporciona varios tipos de datos. Los tipos son caracteres,números enteros y en coma flotante, de varios tamaños. Además se pueden crear tiposderivados mediante la utilización de punteros, vectores, registros y uniones. El primercompilador de C fue escrito por Dennis Ritchie para un DEC PDP-11 y escribió el propiosistema operativo en C.
  • 3. C trabaja con tipos de datos que son directamente tratables por el hardware de la mayoríade computadoras actuales, como son los caracteres, números y direcciones. Estos tipos dedatos pueden ser manipulados por las operaciones aritméticas que proporcionan lascomputadoras. No proporciona mecanismos para tratar tipos de datos que no sean losbásicos, debiendo ser el programador el que los desarrolle. Esto permite que el códigogenerado sea muy eficiente y de ahí el éxito que ha tenido como lenguaje de desarrollo desistemas. No proporciona otros mecanismos de almacenamiento de datos que no sea elestático y no proporciona mecanismos de entrada ni salida. Ello permite que el lenguajesea reducido y los compiladores de fácil implementación en distintos sistemas. Por contra,estas carencias se compensan mediante la inclusión de funciones de librería para realizartodas estas tareas, que normalmente dependen del sistema operativo.Originariamente, el manual de referencia del lenguaje para el gran público fue el libro [1] deKernighan y Ritchie, escrito en 1977. Es un libro que explica y justifica totalmente eldesarrollo de aplicaciones en C, aunque en él se utilizaban construcciones, en la definiciónde funciones, que podían provocar confusión y errores de programación que no erandetectados por el compilador. Como los tiempos cambian y las necesidades también, en1983 ANSI establece el comité X3J11 para que desarrolle una definición moderna ycomprensible del C. El estándar está basado en el manual de referencia original de 1972 yse desarrolla con el mismo espíritu de sus creadores originales. La primera versión deestándar se publicó en 1988 y actualmente todos los compiladores utilizan la nuevadefinición. Una aportación muy importante de ANSI consiste en la definición de un conjuntode librerías que acompañan al compilador y de las funciones contenidas en ellas. Muchasde las operaciones comunes con el sistema operativo se realizan a través de estasfunciones. Una colección de ficheros de encabezamiento, headers, en los que se definenlos tipos de datos y funciones incluidas en cada librería.
  • 4. Los programas que utilizan estas bibliotecas para interactuar con el sistema operativoobtendrán un comportamiento equivalente en otro sistema.ProgramasLa mejor forma de aprender un lenguaje es programando con él. El programa más sencilloque se puede escribir en C es el siguiente:main(){}Como nos podemos imaginar, este programa no hace nada, pero contiene la parte másimportante de cualquier programa C y además, es el más pequeño que se puede escribir yque se compile correctamente. En el se define la función main, que es la que ejecuta elsistema operativo al llamar a un programa C. El nombre de una función C siempre vaseguida de paréntesis, tanto si tiene argumentos como si no. La definición de la función estáformada por un bloque de sentencias, que esta encerrado entre llaves {}.
  • 5. Forma general de un programa en C declaraciones globales main () { Variables locales secuencia de sentencias } f1 () { Variables locales Secuencia de sentencias } . fn () { Variables locales Secuencia de sentencias }
  • 6. Un programa algo más complicado pero que hace algo, es el siguiente:#include <stdio.h>main(){printf("Hola amigos!n");}Con el visualizamos el mensaje Hola amigos! en el terminal. En la primera línea indicaque se tengan en cuenta las funciones y tipos definidos en la librería stdio (standardinput/output). Estas definiciones se encuentran en el fichero header stdio.h. Ahora, en lafunción main se incluye una única sentencia que llama a la función printf. Esta toma comoargumento una cadena de caracteres, que se imprimen van encerradas entre dobles comillas" ". El símbolo n indica un cambio de línea. Hay un grupo de símbolos, que son tratadoscomo caracteres individuales, que especifican algunos caracteres especiales del códigoASCII. Los más importantes son:
  • 7. a alertb backspacef formfeedn newliner carriage returnt horizontal tabv vertical tab backslash‘ single quote“ double quoteOOO visualiza un carácter cuyo código ASCII es OOO en octal.xHHH visualiza un carácter cuyo código ASCII es HHH en hexadecimal.
  • 8. El desarrollo de un programaUn programa C puede estar formado por diferentes módulos o fuentes. Es convenientemantener los fuentes de un tamaño no muy grande, para que la compilación sea rápida.También, al dividirse un programa en partes, puede facilitar la legibilidad del programa y suestructuración. Los diferentes fuentes son compilados de forma separada, únicamente losfuentes que han sido modificados desde la última compilación, y después combinados conlas librerías necesarias para formar el programa en su versión ejecutable.Los comandos necesarios para compilar, linkar y ejecutar un programa dependen delsistema operativo y debemos dirigirnos a los manuales correspondientes para conocer lasintaxis exacta. Como forma más común podemos dar la siguiente:cc progcc modulo1, modulo2link prog, modulo1, modulo2prog
  • 9. Un mapa conceptual de la memoria para un programa en C Un programa compilado en C crea y usa cuatro regiones de memoria lógicas diferentes que sirven para funciones específicas. La primera región es la memoria que contiene Pila realmente el código del programa. La siguiente región es la memoria donde se guardan las variables globales. Montón Las dos regiones restantes son la pila ( en inglés, STACK ) y el montón ( en inglés, HEAP ). La pila se usa para Variables Globales muchas cosas durante la ejecución del programa. Mantiene las direcciones de vuelta para las llamadas a funciones, así como las Código de programa variables locales. También sirve para salvar el estado de la CPU. El montón es la región de memoria libre que puede usar el programa mediante las funciones de asignación dinámicas para cosas las listas enlazadas y los árboles.
  • 10. Proceso de compilación
  • 11. Los términos que siguen se usarán frecuentemente a lo largo de este material :Código Fuente : El texto de un programa que un usuario puede leer; normalmenteconsiderado como el programa. El código fuente es la entrada al compilador de C.Código Objeto : La traducción del código fuente de un programa a código de máquina, quees el que el computador puede leer y ejecutar directamente. El código objeto es la entrada alenlazador.Enlazador : Un programa que enlaza funciones compiladas por separado para producir unsolo programa. Combina las funciones de la biblioteca estándar de C con el código que se haescrito. La salida del enlazador es un programa ejecutable.Biblioteca : El archivo que contiene las funciones estándar que se pueden usar en losprogramas. Las funciones incluyen todas las operaciones de E/S, así como otras rutinasútiles.Tiempo de Compilación : Lo que sucede mientras un programa es compilado. Algo queocurre con frecuencia durante el tiempo de compilación es un error de sintaxis.Tiempo de ejecución : Lo que sucede mientras un programa es ejecutado.
  • 12. Nombres de identificadoresLos nombres usados para referirse a las variables, las funciones, las etiquetas y otrosobjetos definidos por el usuario se conocen como Identificadores. La longitud de unidentificador en C puede variar entre uno y treinta dos caracteres. El primer carácter debeser una letra o un símbolo de subrayado ( guión bajo “_ “ ) y los caracteres siguientespueden ser letras, números o símbolos de subrayados. El lenguaje C también permite usarel símbolo $ en un nombre de identificador, pero no se trata de algo estándar, siendorecomendable no hacerlo. A continuación se muestran algunos nombres de identificadorescorrectos e incorrectos. Correctos Incorrectos cont 1cont prueba23 Hola! balance_total balance..totalEn C las minúsculas y las mayúsculas se tratan como distintas. Así, cuenta, Cuenta yCUENTA son tres identificadores distintos. Un identificador no puede ser igual que unapalabra clave del lenguaje y no debe tener el mismo nombre que alguna función ya escrita oque se encuentre en la biblioteca del lenguaje.
  • 13. Tipos básicos y variablesLos tipos de datos básicos definidos por C son caracteres, números enteros y números encoma flotante. Los caracteres son representados por char, los enteros por short, int,long y los números en coma flotante por float y double. Los tipos básicos disponibles ysu tamaño son:char Carácter (normalmente 8 bits)short Entero corto con signo (normalmente 16 bits)int Entero con signo (depende de la implementación)unsigned Entero sin signo (depende de la implementación)long Entero largo con signo (normalmente 32 bits)float Flotante simple (normalmente 32 bits)double Flotante doble (normalmente 64 bits)La palabra unsigned en realidad es un modificador aplicable a tipos enteros, aunque si nose especifica un tipo se supone int. Un modificador es una palabra clave de C que indicaque una variable, o función, no se comporta de la forma normal. Hay también un modificadorsigned, pero como los tipos son por defecto con signo, casi no se utiliza.
  • 14. Tamaños y rangos de los tipos de datos básicosTipo Tamaño en Bits Rangochar 8 0 a 255int 16 -32.768 a 32.767float 32 3,4E-38 a 3,4E +38double 64 1,7E –308 a 1,7E+308void 0 sin valorLos valores del tipo char se usan normalmente para guardar valores definidos el juego decaracteres ASCII, así como cualquier cantidad de 8 bits. Las variables de int se usan paraguardar cantidades enteras. Las variables de tipo float o double se usan para guardarnúmeros reales.El tipo void tiene tres usos. - declarar explícitamente una función como que no devuelve valor alguno. - declarar explícitamente una función sin parámetros. - para crear punteros genéricos.
  • 15. Modificadores de tiposA excepción del tipo void, los tipos de datos básicos pueden tener distintos modificadoresprecediéndolos. Un modificador se usa para alterar el significado del tipo base para que seajuste más precisamente a las necesidades de cada momento. A continuación se muestra lalista de modificares : signed unsigned long shortLos modificadores signed, unsigned, short y long se pueden aplicar a los tipos base entero yde carácter. Sin embargo, long también se puede aplicar a double. El uso de signed enenteros es redundante ( pero admisible ).La diferencia entre enteros con y sin signo está en cómo se interpreta el bit más significativodel entero. Si se especifica un entero con signo, el compilador genera código que asume queel bit más significativo va ser usado como un indicador de signo. Si el indicador de signo es 0,entonces el número es positivo; si es un 1, el número es negativo. Por ejemplo 127 en binario es 00000000 01111111-127 en binario es 10000000 01111111
  • 16. Todas las combinaciones de los tipos básicos y los modificadores en CTipo Tamaño en Bits Rangochar 8 -128 a 127unsigned char 8 0 a 255signed char 8 -128 a 127int 16 -32.768 a 32.767unsigned int 16 0 a 65535signed int 16 -32.768 a 32.767short int 16 -32.768 a 32.767unsigned short int 16 0 a 65535signed short int 16 -32.768 a 32.767long int 32 -2147483648 a 2147483648signed long int 32 -2147483648 a 2147483648float 32 3,4E-38 a 3,4E+38double 64 1,7E-308 a 1,7E+308long double 64 1,7E-308 a 1,7E+308
  • 17. Declaración de variablesTodas las variables han de ser declaradas antes de poder ser usadas. La forma general dedeclaración es la que se muestra a continuación :tipo lista_de_variables;Aquí, tipo debe ser un tipo válido de C y la lista_de_variables puede consistir en uno o másnombres de identificadores separados por comas. A continuación se muestran algunasdeclaraciones :int i, j, l ;short int si ;unsigned int ui ;double balance, beneficio, pérdida ;Hay que tener claro que en C el nombre de una variable no tiene nada que ver con su tipo.Existen tres sitios básicos donde se pueden declarar variables: dentro de las funciones, en ladefinición de parámetros de funciones y fuera de todas las funciones.Estas variables son, respectivamente, las variables locales, los parámetros formales y lasvariables globales.
  • 18. Variables LocalesLas variables que se declaran dentro de una función se denominan variables locales. Enalgunos libros de C, estas variables se denominan automáticas, debido a que en C sepueden usar la palabra clave ( opcional ) auto para declararlas. Dado que el término variablelocal es el más común, es lo que usaremos para su identificación. Las variables localespueden ser denominadas sólo por sentencias que estén dentro del bloque en el que han sidodeclaradas. O dicho de otra forma, las variables locales no son conocidas fuera de su propiobloque de código. Recordar que un bloque de código comienza con una llave abierta ytermina con una llave cerrada.Una de las cosas más importantes que hay que comprender sobre las variables locales esque solo existen mientras se está ejecutando el bloque de código en el que son declaradas.O sea, la variable local se crea al entrar en el bloque y se destruye al salir de él.El bloque de código más normal en el que se declaran variables locales es la función. Porejemplo : void func1 ( void ) void func2 ( void) { { int x ; int x ; x = 10 ; x = -199 ; } }
  • 19. La variable entera x se declara dos veces, una vez en func1() y otra en func2(). La x defunc1() no corresponde ni tiene relación con la x de func2(). La razón es que cada x sólo esconocida en el propio código en que se ha declarado la variable.La mayoría de los programadores declaran todas las variables que se necesitan en unafunción al principio del bloque de código de la misma. Esto se hace así para que sea más fácilal leer el código saber qué variables se usan. Sin embargo, no es necesario hacerlo así, yaque se pueden declarar variables locales en cualquier bloque de código. Para comprendercómo funciona esto, considere la siguiente función :Void f( void){ int t ; scanf( “%d”, &t ); if ( t== 1 ) { char s[80]; /* esta se crea sólo al entrar en este bloque */ printf(“introduzca el nombre : “ ); gets(s); procesar (s) ; } /* aquí no se conoce a s */}
  • 20. Aquí, la variable local s se crea tras entrar en el bloque de código if y se destruye tras salirde él. Más aún s sólo es conocida dentro del bloque if y no puede ser denominada enninguna parte fuera de él.Dado que las variables locales se crean y se destruyen cada vez que se entra o se sale de lafunción en la que son declaradas, no pueden retener sus valores entre llamadas. ( Sinembargo, es posible indicar al compilador que retenga sus valores mediante el uso delmodificador static ).Parámetros formalesSi una función va a usar argumentos, debe declarar las variables que van a aceptar losvalores de los argumentos. Estas variables son los parámetros formales de la función.Se comportan como cualquier otra variable local de la función. Como se muestra en elsiguiente fragmento de programa, sus declaraciones se dan tras el nombre de la función yentre paréntesis./* Devuelve 1 si c es parte de la cadena s; sino 0 */Esta_en( char *s, char c){ while (*s) if (*s == c ) return 1 ; else s++ ; return 0 ;}
  • 21. La función esta_en() tiene dos argumentos s y c. Se debe indicar al compilador de C qué tipode variables son los parámetros formales, haciéndolo tal como se ha mostrado. Una vez quese ha hecho, pueden ser usadas dentro de la función como variables locales normales. Al igualque las variables locales, también son dinámicas y se destruyen al salir de la función.Hay que asegurar que los parámetros formales que se declaran sean del mismo tipo que losargumentos que se usan en la llamada a la función. Si existe una diferencia de tipo, se puedendar unos resultados inesperados. A diferencia de otros lenguajes, C es muy robusto ynormalmente siempre hace algo, incluso aunque no sea lo que se desea. Hay muy pocoserrores en tiempo de ejecución y no se comprueban los límites. Como programador, hay queasegurar de que no se den errores de inconsistencia de tipos.Al igual que con las variables locales, se pueden hacer asignaciones a los parámetrosformales de una función o usarlos en cualquier expresión válida en C. Aunque esas variablesreciben sus valores de los argumentos pasados a la función, se pueden usar como cualquierotra variable local.Variables GlobalesA diferencia de las variables locales, las variables globales se conocen a lo largo de todo elprograma y se pueden usar en cualquier parte del código. Además, mantienen su valor durantetoda la ejecución del programa. Las variables globales se crean al declararlas en cualquierparte fuera de una función. Pueden ser accedidas por cualquier expresión independientementede la función en la que se encuentre la expresión.En el programa que sigue se puede ver que la variable cuenta ha sido declarada fuera detodas las funciones. Aunque se declaración aparece antes de la función main(), se podríahaber colocado en cualquier lugar anterior a su primer uso, mientras no sea en una función.Sin embargo, lo mejor es declarar todas las variables globales al principio del programa.
  • 22. # include <stdio.h>void func1 ( void), func2(void);int cuenta; /* cuenta es global */main ( void ){ cuenta = 100 ; func1() ; return 0; /* comunicar el éxito al programa */}void func1 ( void ) void func2 ( void ){ { int temp; int cuenta; temp = cuenta ; for ( cuenta = 1; cuenta <10; cuenta++) func2() ; putchar(‘_’) ; printf( “cuentas es %d”, cuenta ); }}
  • 23. Observando detenidamente este programa, debe estar claro que aunque ni main() ni func1()han declarado la variable cuenta, ambas pueden usarla. Sin embargo, la func2() declara unavariable local llamada cuenta. Cuando func2() hace referencia a cuenta, sólo hace referenciaa su variable local, no a la global. Si una variable global y una variable local tienen el mismonombre, todas las referencias a ese nombre de variable dentro de la función donde se hadeclarado la variable local se refieren a esa variable local y no tienen efecto sobre la variableglobal. Esto es algo conveniente. Sin embargo, si se olvida, el programa puede actuar deforma extraña, incluso aunque “ parezca “ correcto.El almacenamiento de las variables globales se hace en una región de memoria fijaestablecida para este propósito por el compilador. Las variables globales son muy útilescuando se usan los mismos datos en varias funciones del programa. Sin embargo, se debeevitar el uso de variables globales innecesarias, por tres razones :1.- Utilizan memoria todo el tiempo de ejecución del programa, no solo cuando se necesitan.2.- El uso de una variable global cuando se podría usar una variable local hace que lafunción sea menos general debido a que depende de algo que debe estar definido fuera deella.3.- El uso de un gran número de variables globales puede producir errores en el programadebido a efectos secundarios desconocidos y no deseables.
  • 24. Por ejemplo, a continuación se muestran dos formas de escribir mul () – una sencilla funciónque calcula el producto de dos enteros .General Espeficicamul ( inte x, int y ) int x, y ;{ mul ( void ) return ( x * y ) {} return ( x * Y ) }Ambas funciones devuelven el producto de las variables x e y. Sin embargo, la versióngeneralizada, o parametrizada, se puede usar para devolver el producto de cualesquiera dosenteros, mientras que la versión específica sólo se puede usar para calcular el producto delas variables globales x e y.
  • 25. Las variables son definidas utilizando un identificador de tipo seguido del nombre de lavariable. Veamos el siguiente programa.#include <stdio.h>main(){float cels, farh; farh = 35.0; cels = 5.0 * ( farh - 32.0 ) / 9.0; printf(">>> %f F son %f Cn", farh, cels );}En el programa anterior se definen dos variables float, se asigna un valor a la primera yse calcula la segunda mediante una expresión aritmética. Las asignaciones en C tambiénson una expresión, por lo que se pueden utilizar como parte de otra expresión, pero segúnque prácticas de este tipo no son muy recomendables ya que reducen la legibilidad delprograma. En la instrucción printf, el símbolo %f indica que se imprime un número encoma flotante.
  • 26. Hay un tipo muy importante que se representa por void que puede significar dos cosasdistintas, según su utilización. Puede significar nada, o sea que si una función devuelve unvalor de tipo void no devuelve ningún resultado, o puede significar cualquier cosa, comopuede ser un puntero a void es un puntero genérico a cualquier tipo de dato. Más adelanteveremos su utilización.FuncionesUn programa C está formado por un conjunto de funciones que al menos contiene la funciónmain. Una función se declara con el nombre de la función precedido del tipo de valor queretorna y una lista de argumentos encerrados entre paréntesis. El cuerpo de la función estáformado por un conjunto de declaraciones y de sentencias comprendidas entre llaves.Veamos un ejemplo de utilización de funciones:
  • 27. #include <stdio.h> int fact_r ( int v ) #define VALOR 5 {#define FACT 120 if ( v == 0 )int fact_i ( int v ) return 1;{ else int r = 1, i = 0; return v * fact_r(v-1); while ( i <= v ) { } r = r * i; i = i + 1; } return r; }
  • 28. main(){ int r, valor = VALOR; if ( (r = fact_i(valor)) != fact_r(valor) ) printf("Codificación errónea!!.n"); else if ( r == FACT ) printf("Codificación correcta.n"); else printf("Algo falla!!.n"); }
  • 29. Se definen dos funciones, fact_i y fact_r, además de la función main. Ambas tomancomo parámetro un valor entero y devuelven otro entero. La primera calcula el factorial de unnúmero de forma iterativa, mientras que la segunda hace lo mismo de forma recursiva.Todas las líneas que comienzan con el símbolo # indican una directiva del precompilador.Antes de realizar la compilación en C se llama a un precompilador cuya misión es procesar eltexto y realizar ciertas sustituciones textuales. Hemos visto que la directiva #include incluyeel texto contenido en un fichero en el fuente que estamos compilando. De forma parecida,#define nombre texto sustituye todas las apariciones de nombre por texto. Así, en el fuente,la palabra VALOR se sustituye por el número 5.El valor que debe devolver una función se indica con la palabra return. La evaluación de laexpresión debe dar una valor del mismo tipo de dato que el que se ha definido comoresultado. La declaración de una variable puede incluir una inicialización en la mismadeclaración. Se debe tener muy en cuenta que en C todos los argumentos son pasados porvalor. No existe el concepto de paso de parámetros por variable o por referencia.Veamos un ejemplo:
  • 30. int incr ( int v ) main(){ { return v + 1; int a, b; b = 3;} a = incr(b); /* a = 4 mientras que b = 3. No ha cambiado después de la llamada. */ } En el ejemplo anterior el valor del parámetro de la función incr, aunque se modifique dentro de la función, no cambia el valor de la variable b de la función main. Todo el texto comprendido entre los caracteres /* y */ son comentarios al programa y son ignorados por el compilador. En un fuente C los comentarios no se pueden anidar.
  • 31. Expresiones y operadoresLos distintos operadores permiten formar expresiones tanto aritméticas como lógicas. Losoperadores aritméticos y lógicos son:+, - suma, resta++, -- incremento, decremento*, /, % multiplicación, división, módulo>>, << rotación de bits a la derecha, izquierda.& AND booleano| OR booleano^ EXOR booleano~ complemento a 1! complemento a 2, NOT lógico==, != igualdad, desigualdad&&, || AND, OR lógico<, <= menor, menor o igual>, >= mayor, mayor o igual
  • 32. En estos operadores deben tenerse en cuenta la precedencia de operadores y las reglas deasociatividad, que son las normales en la mayoría de lenguajes. Se debe consultar el manualde referencia para obtener una explicación de tallada. Además hay toda una serie deoperadores aritméticos con asignación, como pueden ser += y ^=.En la evaluación de expresiones lógicas, los compiladores normalmente utilizan técnicas deevaluación rápida. Para decidir si una expresión lógica es cierta o falsa muchas veces no esnecesario evaluarla completamente. Por ejemplo una expresión formada <exp1> || <exp2>,el compilador evalúa primero <exp1> y si es cierta, no evalúa <exp2>. Por ello se debenevitar construcciones en las que se modifiquen valores de datos en la propia expresión, puessu comportamiento puede depender de la implementación del compilador o de laoptimización utilizada en una compilación o en otra. Estos son errores que se puedencometer fácilmente en C ya que una asignación es también una expresión.Debemos evitar: if (( x++ > 3 ) || ( x < y ))y escribir en su lugar: x++; if (( x > 3 ) || ( x < y ))
  • 33. Hay un tipo especial de expresión en C que se denomina expresión condicional y estárepresentada por los operadores ? : . Su utilización es como sigue: <e> ? <x> : <y>. Seevalúa si e entonces x; si no, y.int mayor ( int a, int b ){ return ( a > b ) ? TRUE : FALSE;}waste_time (){float a, b = 0.0;( b > 0.0 ) ? sin(M_PI / 8) : cos(M_PI / 4);}
  • 34. Conversión de tiposCuando escribimos una expresión aritmética a+b, en la cual hay variables o valores dedistintos tipos, el compilador realiza determinadas conversiones antes de que evalúe laexpresión. Estas conversiones pueden ser para aumentar o disminuir la precisión del tipo alque se convierten los elementos de la expresión. Un ejemplo claro, es la comparación de unavariable de tipo int con una variable de tipo double. En este caso, la de tipo int esconvertida a double para poder realizar la comparación.Los tipos pequeños son convertidos de la forma siguiente: un tipo char se convierte a int,con el modificador signed si los caracteres son con signo, o unsigned si los caracteres sonsin signo. Un unsigned char es convertido a int con los bits más altos puestos a cero. Unsigned char es convertido a int con los bits más altos puestos a uno o cero, dependiendodel valor de la variable.Para los tipos de mayor tamaño: si un operando es de tipo double, el otro es convertido adouble. Si un operando es de tipo float, el otro es convertido a float. Si un operando esde tipo unsigned long, el otro es convertido a unsigned long. Si un operando es de tipolong, el otro es convertido a long. Si un operando es de tipo unsigned, el otro es convertidoa unsigned. Si no, los operandos son te tipo int.
  • 35. Una variable o expresión de un tipo se puede convertir explícitamente a otro tipo,anteponiéndole el tipo entre paréntesis.cambio_tipo (){float a;int b;b = 10;a = 0.5;if ( a <= (float) b ) menor();}
  • 36. Control de flujo.La sentencia de control básica es if (<e>) then <s> else <t>. En ella se evalúa unaexpresión condicional y si se cumple, se ejecuta la sentencia s; si no, se ejecuta lasentencia t. La segunda parte de la condición, else <t>, es opcional.int cero ( double a ){ if ( a == 0.0 ) return (TRUE); else return (FALSE);}
  • 37. En el caso que <e> no sea una expresión condicional y sea aritmética, se considera falso sivale 0; y si no, verdadero. Hay casos en los que se deben evaluar múltiples condiciones yúnicamente se debe evaluar una de ellas. Se puede programar con un grupo de sentenciasif then else anidadas, aunque ello puede ser farragoso y de complicada lectura. Paraevitarlo nos puede ayudar la sentencia switch. Su utilización es:switch (valor){ case valor1: <sentencias> case valor2: <sentencias> ... default: <sentencias>}
  • 38. Cuando se encuentra una sentencia case que concuerda con el valor del switch seejecutan las sentencias que le siguen y todas las demás a partir de ahí, a no ser que seintroduzca una sentencia break para salir de la sentencia switch. Por ejemplo,ver_opcion ( char c ){ switch(c) { case a: printf("Op An"); break; case b: printf("Op Bn"); break; case c: case d: printf("Op C o Dn"); break; default: printf("Op ?n"); }}
  • 39. Otras sentencias de control de flujo son las que nos permiten realizar iteraciones sobre unconjunto de sentencias. En C tenemos tres formas principales de realizar iteraciones. Lasentencia while (<e>) <s> es seguramente la más utilizada. La sentencia, o grupo desentencias <s> se ejecuta mientras la evaluación de la expresión <e> sea verdadera.long raiz ( long valor ) { long r = 1; while ( r * r <= valor ) r++; return r; }
  • 40. Otra sentencia iterativa, que permite inicializar los controles del bucle se la sentencia for( <i>; <e>; <p> ) <s>. La sentencia for se puede escribir también como:<i>;while ( <e> ){<s>;<p>;}El ejemplo anterior se podría escribir como:long raiz ( long valor ){long r;for ( r = 1; r * r <= valor; r++ ) ;return r;}