martes, 21 de abril de 2009

programa de menu y formulas pidiendo 2numeros

23/04/09

Realizar un programa que despliegue un menu como el anterior que lea dos numero enteros y realiza la operacion correspondiente (suma, resta o multiplicacion)

#include
int main ()
{
int opcion;
printf("\n\t\t* * * * * * * * * * * *\n");
printf("\t\t* menu principal *\n");
printf("\t\t* Suma [1] *\n");
printf("\t\t* Resta [2] *\n");
printf("\t\t* Multiplicacion [3] *\n");
printf("\t\t* Salir [0] *\n");
printf("\t\t* * * * * * * * * * * *\n");
printf("\nElige tu opcion:");
scanf("%d", &opcion);
{
int num1, num2;
printf("Introdusca dos numeros separados con un espacio:");
scanf("%d %d" ,&num1, &num2);
printf("\nHOLA, los numeros que eligiste son: %d y %d\n", num1, num2);
{
int R, S, M;
R= num1-num2;
S= num1+num2;
M= num1*num2;
switch (opcion)
{
case 0:
puts("Salir ...");
break;
case 1:
printf("la suma es: %d", S);
break;
case 2:
printf("La Resta es: %d", R);
break;
case 3:
printf("La Multiplicacion es: %d", M);
break;
default:
printf("la opcion disponible es 1, 2, 3 y 0");
}
return 0;
}
return 0;
}
return 0;
}

lunes, 20 de abril de 2009

programa de opciones 0, 1, 2, 3


20/abril/2009


# include

int main ()

{

int opcion;

printf("* * * * * * * * * * * *\n");

printf("* menu principal *\n");

printf("* Suma [1] *\n");

printf("* Resta [2] *\n");

printf("* Multiplicacion [3] *\n");

printf("* Salir [0] *\n");

printf("* * * * * * * * * * * *\n");

printf(" Elige tu opcion: ");

scanf("%d", &opcion);

switch (opcion)

{

case 0: puts("Salir...");

break;

case 1:

puts("Suma...");

break;

case 2: puts("Resta...");

break;

case 3:

puts("Multiplicacion...");

break;

default:

printf("la opcion disponible es 1, 2, 3 y 0");

}

return 0;
}

martes, 14 de abril de 2009

ejercicios de 5.1 a 5.10

14/04/09

EJEMPLO 5.1
#include
int main ()
{
int n, d;
printf ( "Introduzca dos enteros: ");
scanf("%d %d",&n,&d);
if (n%d == 0)printf(" %d es divisible por %d\n",n,d);
return 0;
}


EJEMPLO 5.2
#include
void main ()
{
float nota;
printf("Introduzca la nota obtenida (0-10): ");
scanf("%f", &nota);
if (nota >= 5)
puts("Aprobado");
}


EJEMPLO 5.3
#include
void main ()
{
float numero;
printf("Introduzca un numero positivo o negativo: ");
scanf("%f",&numero);
if (numero > 0)
printf("%f es mayor que cero\n",numero);
if (numero < 0)
printf("%f es menor que cero\n",numero);
if (numero == 0)
printf("%f es igual a cero\n",numero);
}


EJEMPLO 5.4
#include
int main()
{
int n, d;
printf( "Introduzca dos enteros; ");
scanf("%D %d",&n,&d);
if (n%d == 0)
printf("%d es divisible por %d\n",n,d);
else printf("%d no es divisible por %d\n",n,d);
return 0;
}


EJEMPLO 5.5
#include
int main()
{
int x, y;
printf( "Introduzca dos enteros: ");
scanf("%d %d",&x,&y);if (x > y)
printf("%6d\n",x);
else printf("%6d\n",y);
return 0;
}


EJEMPLO 5.6
#include
#include
intmain()
{
float f,x;
printf("\n Elige un valor de x: ");
scanf("%f",&x);
if (x <= 0.0)
f = pow(x,2) - x;
else
f = -pow(x,2) + 3*x;
printf("f(%.1f) = %.3f",x,f);
return 0;
}


EJEMPLO 5.8
#include
void main()
{
float numero;
printf( " Introduzca un numero positivo o negativo: ");
scanf("%f",&numero);
if (numero > 0)
{
printf("%.2f %s", numero, "es mayor que cero\n");
puts( "Pruebe de nuevo introduciendo un numero negativo");
}
else if (numero <10)
{
printf("%.2f %s", numero, "es menor que cero\n");
puts( "pruebe de nuevo introduciendo un numero positivo");
}
else
{ printf("%.2f %s", numero, "es igual a cero\n");
puts( " ¿por que no introduce otro numero? ");
}
}


EJEMPLO 5.10
#include
int main()
{
int a, b, c, mayor;
printf("\nIntroduzca tres enteros:");
scanf("%d %d %d",&a,&b,&c);
if (a > b)
if (a > c) mayor =a;
else mayor =c;
else
if (b > c) mayor =b;
else mayor =c;
printf("El mayor es %d \n",mayor);
return 0;
}

CAPíTULO 5 ESTRUCTURAS DE SELECCIÓN: SENTENCIAS IF Y SWITCH

14/04/09



5.1. ESTRUCTURAS DE CONTROL
Las estructuras de control controlan el flujo de ejecución de un programa o función. Las estructuras de control permiten combinar instrucciones o sentencias individuales en una simple unidad lógica con un punto de entrada y un punto de salida.
Las instrucciones o sentencias se organizan en tres tipos de estructuras de control que sirven para controlar el flujo de la ejecución: secuencia, selección (decisión) y repetición. Hasta este momento sólo se ha utilizado el flujo secuencial. Una sentencia compuesta es un conjunto de sentencias encerradas entre llaves ({ y 1) que se utiliza para especificar un flujo secuencial.
{
sentencia ;
sentencia ;
sentencia ;
}
El control fluye de la sentenciu, a la .sentencia2 y así sucesivamente. Sin embargo, existen problemas que requieren etapas con dos o más opciones o alternativas a elegir en función del valor de una condición + o expresión.




5.2. LA SENTENCIA if
En C, la estructura de control de selección principal es una sentencia if. La sentencia if tiene dos
alternativas o formatos posibles. El formato más sencillo tiene la sintaxis siguiente:


i f (Expresión) Acción
Acción se ejecuta si la expresión
\ lógica es verdadera Expresión lógica que determina
SI la acción se ha de ejecutar


La sentencia i f funciona de la siguiente manera. Cuando se alcanza la sentencia if dentro de un
programa, se evalúa la expresión entre paréntesis que viene a continuación de if. Si Expresión es
verdadera, se ejecuta Acción; en caso contrario no se ejecuta Acción (en su formato más simple,
Acción es una sentencia simple y en los restantes formatos es una sentencia compuesta). En cualquier caso la ejecución del programa continúa con la siguiente sentencia del programa. La Figura 5.1 muestra un diagrama deflujo que indica el flujo de ejecución del programa.
Otro sistema de representar la sentencia i f es:

if (condición) sentencia;

condicion es una expresión entera(lógica).
sentencia es cualquier sentencia ejecutable, que se ejecutará sólo si la condición toma




5.3. SENTENCIA if DE DOS ALTERNATIVAS: if -else
Un segundo formato de la sentencia i f es la sentencia if -else. Este formato de la sentencia if tiene la siguiente sintaxis:
if (Expresión)
Expresión lógica que determina la de ejecutar
Acción1


accion que se realiza si la expresion logica es verdaddera


else


accion2
acción que se ejecuta si la expresion lógica es falsa
En este formato Acción y Acción son individualmente, o bien una Única sentencia que termina
en un punto y coma (;) o un grupo de sentencias encerrado entre llaves. Cuando se ejecuta la sentencia if -else, se evalúa Expresión. Si Expresión es verdadera, se ejecuta Acción y en caso contrario se ejecuta Acción . La Figura 5.2 muestra la semántica de la sentencia if -else.
un valor distinto de cero.






5.4. SENTENCIAS if -else ANIDADAS
Hasta este punto, las sentencias if implementan decisiones que implican una o dos alternativas. En esta sección, se mostrará como se puede utilizar la sentencia i f para implementar decisiones que impliquen diferentes alternativas.
Una sentencia i f es anidada cuando la sentencia de la rama verdadera o la rama falsa, es a su vez
una sentencia if. Una sentencia if anidada se puede utilizar para implementar decisiones con varias alternativas o multi-alternativas.



La sentencia if anidada tiene tres alternativas. Se incrementa una de las tres variables (num-pos ,num-neg y num-ceros) en 1, dependiendo de que x sea mayor que cero, menor que cero o igual a cero, respectivamente. Las cajas muestran la estructura lógica de la sentencia if anidada; la segunda sentencia if es la acción o tarea falsa (a continuación de else) de la primera sentencia if.
La ejecución de la sentencia if anidada se realiza como sigue: se comprueba la primera condición
(x > O); si es verdadera, numjos se incrementa en 1 y se salta el resto de la sentencia if. Si la primera condición es falsa, se comprueba la segunda condición (x <>


5.4.1. Sangría en las sentencias if anidadas
El formato muitibifurcación se compone de una serie de sentencias if anidadas, que se pueden escribir en cada línea una sentencia if. La sintaxis myltibifurcación anidada es:



5.4.2. Comparación de sentencias if anidadas y secuencias de sentencias if
Los programadores tienen dos alternativas: 1) usar una secuencia de sentencias if; 2) una Única
sentencia if anidada. Por ejemplo, la sentencia i f del Ejemplo 5.7 se puede reescribir como la siguiente secuencia de sentencias if.
if (x > O)
if (x < O)
if ( x == O)
numsos = num-pos + 1;
num-neg = num-neg + 1;
num-ceros = num-ceros + 1;


Aunque la secuencia anterior es lógicamente equivalente a la original, no es tan legible ni eficiente. Al contrario que la sentencia i f anidada, la secuencia no muestra claramente cual es la sentencia a ejecutar para un valor determinado de x. Con respecto a la eficiencia, la sentencia if anidada se ejecuta más rápidamente cuando x es positivo ya que la primera condición (x > o) es verdadera, lo que significa que la parte de la sentencia i f a continuación del primer e i s e se salta. En contraste, se comprueban siempre las tres condiciones en la secuencia de sentencias if. Si x es negativa, se comprueban dos condiciones en las sentencias if anidadas frente a las tres condiciones de las secuencias de sentencias if. Una estructura típica if -else anidada permitida es:
if (numero > O)
{
...

}
else
{

if ( . . . )
{
...

}
else
if ( ... )
{
...
}
}
. . .
}


5.5. SENTENCIA DE CONTROL switch
La sentencia switch es una sentencia C que se utiliza para seleccionar una de entre múltiples alternativas. La sentencia switch es especialmente Útil cuando la selección se basa en el valor de una variable simple o de una expresión simple denominada expresicín de control o selector. El valor de esta expresión puede ser de tipo int o char, pero no de tipo float ni double.

La expresión de control o se1 ector se evalúa y se compara con cada una de las etiquetas de case.
La expresión selector debe ser un tipo ordinal (por ejemplo, int , char, pero no float o string ) . Cada etiqueta es un valor Único, constante y cada etiqueta debe tener un valor diferente de los otros. Si el valor de la expresión selector es igual a una de las etiquetas case -por ejemplo, etiqueta - entonces la ejecución comenzará con la primera sentencia de la secuencia sentencia y continuará hasta que se encuentra el final de la sentencia de control switch, o hasta encontrar la sentencia break. Es habitual que después de cada bloque de sentencias correspondiente a una secuencia se desee terminar la ejecución del switch; para ello se sitúa la sentencia break como Última sentencia del bloque. break hace que siga la ejecución en la siguiente sentencia al switch.


5.5.1. Caso particular de case
Está permitido tener varias expresiones case en una alternativa dada dentro de la sentencia switch. Por ejemplo, se puede escribir:
switch(c) {
case '0':case '1': case '2': case '3': case '4':
case '5':case '6': case '7': case '8': case '9':
num-digitos++; /*se incrementa en 1 el valor de num-digitos * /
break;
case" :case '\t': case '\n':
num-blancos++; /*se incrementa en 1 el valor de num-blancos*/
break;
default:
num-distintos++;
}


5.5.2. Uso de sentencias switch en menús
La sentencia i f -else es más versátil que la sentencia switch y se puede utilizar unas sentencias if -else anidadas o multidecisión, en cualquier parte que se utiliza una sentencia case. Sin embargo,
normalmente, la sentencia switch es más clara. Por ejemplo, la sentencia switch es idónea para
implementar menús.
Un menú de un restaurante presenta una lista de alternativas para que un cliente elija entre sus
diferentes opciones. Un menú en un programa de computadora hace la misma función: presentar una lista de alternativas en la pantalla para que el usuario elija una de ellas.
En los capítulos siguientes se volverá a tratar el tema de los menús en programación con ejemplosprácticos.


5.6. EXPRESIONES CONDICIONALES: EL OPERADOR ? :
Las sentencias de selección (if y switch) consideradas hasta ahora, son similares a las sentencias
previstas en otros lenguajes, tales como Pascal y Fortran 90. C tiene un tercer mecanismo de selección, una expresión que produce uno de dos valores, resultado de una expresión lógica o booleana (también denominada condición). Este mecanismo se denomina expresión condicional. Una expresión condicional tiene el formato C ? A : B y es realmente una operación ternaria (tres operandos) en el que c , A y B son los tres operandos y ? : es el operador.


5.7. EVALUACIÓN EN CORTOCIRCUITO DE EXPRESIONES LÓGICAS
Cuando se evalúan expresiones lógicas en C se puede emplear una técnica denominada evaluación en cortocircuito. Este tipo de evaluación significa que se puede detener la evaluación de una expresión lógica tan pronto como su valor pueda ser determinado con absoluta certeza. Por ejemplo, si el valor de (soltero == ’s ’ ) es falso, la expresión lógica (soltero == ’s’) &&(sexo = ’h’) hh (edad> 18) && (edad <= 4 5) será falsa con independencia de cual sea el valor de las otras condiciones. La razón es que una expresión lógica del tipo

falso && ( . . . )

debe ser siempre falsa, cuando uno de los operandos de la operación AND es falso. En consecuencia no y necesidad de continuar la evaluación de las otras condiciones cuando (sol tero == ’s’) se evalúa a falso.
El compilador C utiliza este tipo de evaluación. Es decir, la evaluación de una expresión lógica de
la forma, && a se detiene si la subexpresión de la izquierda se evalúa a falsa.

C realiza evaluación en cortocircuito con los operadores && y I I , de modo que evalúa primero la expresión más a la izquierda de las dos expresiones unidas por && o bien por I I . Si de esta evaluación se deduce la información suficiente para determinar el valor final de la expresión (independiente del valor de la segunda expresión), el compilador de C no evalúa la segunda expresión.

5.9. ERRORES FRECUENTES DE PROGRAMACIÓN
I . Uno de los errores más comunes en una sentencia if es utilizar un operador de asignación (=)en lugar de un operador de igualdad (==).
2. En una sentencia i f anidada, cada cláusula el se se corresponde con la i f precedente más
cercana.

Por ejemplo, en el segmento de programa siguiente
if (a > O)
if (b > O)
c = a + b ;
else
c = a + abs(b) ;
d = a * b * c ;
¿Cuál es la sentencia if asociada a else?
El sistema más fácil para evitar errores es el sangrado o indentación, con lo que ya se aprecia
que la cláusula else se corresponde a la sentencia que contiene la condición b > o
if (a > O)
if (b > O)
else
c = a + b ;
c = a + abs(b) ;
d = a * b * c ;


3. Las comparaciones con operadores == de cantidades algebraicamente iguales pueden producir
una expresión lógica falsa, debido u que la mayoría de los números reales no se almacenan
exactamente. Por ejemplo, aunque las expresiones reales siguientes son equivalentes:
a * ( l / a )
1 . 0
son algebraicamente iguales, la expresión
a * ( l / a ) == 1 . 0
puede ser falsa debido a que a es real.
4. Cuando en una sentencia s w i tch o en un bloque de sentencias falta una de las llaves ( { , 1)
aparece un mensaje de error tal como:
Error . . . : Cumpound statement missing } in funct-ion
Si no se tiene cuidado con la presentación de la escritura del código, puede ser muy difícil
5. El selector de una sentencia s w l t ch debe ser de tipo entero o compatible entero. Así las
localizar la llave que falta.
constantes reales
2 . 4 , - 4 . 5 , 3 . 1 4 1 6
no pueden ser utilizadas en el selector.
6. Cuando se utiliza una sentencia s w i t ch, asegúrese que el selector de s w i t ch y las etiquetas
case son del mismo tipo (in t , char pero no f 1 o a t ) . Si el selector se evalúa a un valor no
listado en ninguna de las etiquetas case, la sentencia s w i t ch no gestionará ninguna acción;
por esta causa se suele poner ma etiqueta d e f d u l t pura resolver este problema.

CAPíTULO 4 OPERADORES Y EXPRESIONES

4.1. OPERADORES Y EXPRESIONES
Los programas C constan de datos, sentencias de programas y expresiones. Una expresión es,
normalmente, una ecuación matemática, tal como 3 + 5. En esta expresión, el símbolo más (+) es el operador de suma, y los números 3 y 5 se llaman operandos. En síntesis, una expresión es una secuencia de operaciones y operandos que especifica un cálculo.
Cuando se utiliza el + entre números (o variables) se denomina operador binario, debido a que el
operador + suma dos números. Otro tipo de operador de C es el operador unitario («unario»), que actúa sobre un Único valor. Si la variable x contiene el valor 5, -x es el valor -5. El signo menos (-) es el operador unitario menos.
C soporta un conjunto potente de operadores unarios, binarios y de otros tipos.


4.2. OPERADOR DE ASIGNACIÓN
El operador = asigna el valor de la expresión derecha a la variable situada a su izquierda.
codigo = 3467;
fahrenheit = 123.456;
coordX = 525;
coordY = 725;
Este operador es asociativo por la derecha, eso permite realizar asignaciones múltiples. Así,
a = b = c = 45;
equivale a
a = (b = (c = 45));
o dicho de otro modo, a las variables a, b y c se asigna el valor 4 5.
Esta propiedad permite inicializar varias variables con una sola sentencia
int a, b, c;
a = b = c = 5; / * se asigna 5 a las variables a, b y c */
Además del operador de asignación =, C proporciona cinco operadores de asignación adicionales.
Estos operadores de asignación actúan como una notación abreviada para expresiones utilizadas
En la Tabla 4.1 aparecen los seis operadores de asignación.
con frecuencia. Así, por ejemplo, si se desea multiplicar 1 O por i, se puede escribir


4.3. OPERADORES ARITMÉTICOS
Los operadores aritméticos sirven para realizar operaciones aritméticas básicas. Los operadores
aritméticos C siguen las reglas algebraicas típicas de jerarquía o prioridad. Estas reglas especifican la precedencia de las operaciones aritméticas.
Considere la expresión
3 + 5 * 2
¿Cual es el valor correcto, 1 6 ( 8 * 2 ) o 13 ( 3 + 1 O ) ? De acuerdo a las citadas reglas, la multiplicación se realiza antes que la suma. Por consiguiente, la expresión anterior equivale a:
3 t (5 * 2 )
En C las expresiones interiores a paréntesis se evalúan primero; a continuación, se realizan los
operadores unitarios, seguidos por los operadores de multiplicación, división, resto, suma y resta.


4.3.1. Asociatividad
En una expresión tal como
3 * 4 + 5
el compilador realiza primero la multiplicación -por tener el operador * prioridad más alta- y luego la suma, por tanto, produce 17. Para forzar un orden en las operaciones se deben utilizar paréntesis
3 * (4 + 5)
produce 2 7, ya que 4 + 5 se realiza en primer lugar.
de izquierda a derecha o de derecha a izquierda. Por ejemplo,
La asociatividad determina el orden en que se agrupan los operadores de igual prioridad; es decir,
x ~ y + z se agrupa como (x ~ y ) + z
ya que - y +, con igual prioridad, tienen asociatividad de izquierda a derecha. Sin embargo,
x = y = z
se agrupa como
x = ( y = z)
dado que su asociatividad es de derecha a izquierda.


4.3.2. Uso de paréntesis
Los paréntesis se pueden utilizar para cambiar el orden usual de evaluación de una expresión
determinada por su prioridad y asociatividad. Las subexpresiones entre paréntesis se evalúan en primer lugar según el modo estándar y los resultados se combinan para evaluar la expresión completa. Si los paréntesis están «anidados» -es decir, un conjunto de paréntesis contenido en otro- se ejecutan en primer lugar los paréntesis más internos. Por ejemplo, considérese la expresión
(7 * (10 - 5) % 3)* 4 + 9
La subexpresión (1 O - 5) se evalúa primero, produciendo
( 7 * 5 % 3 ) * 4 + 9
A continuación se evalúa de izquierda a derecha la subexpresión (7 * 5 % 3 )
(35 % 3) * 4 + 9
seguida de
2 * 4 + 9
Se realiza a continuación la multiplicación, obteniendo
8 + 9
y la suma produce el resultado final
17


4.4. OPERADORES DE INCREMENTACIÓN Y DECREMENTACIÓN
De las características que incorpora C, una de las más Útiles son los operadores de incremento ++ y decremento --. Los operadores ++ y --, denominados de incrementación y decrementación, suman o restan 1 a su argumento, respectivamente, cada vez que se aplican a una variable.


4.5. OPERADORES RELACIONALES
C no tiene tipos de datos lógicos o booleanos, como Pascal, para representar los valores verdadero (true) y falso (false). En su lugar se utiliza el tipo i n t para este propósito, con el valor entero O que representa a falso y distinto de cero a verdadero.

falso cero
verdadero distinto de cero


Operadores tales como >= y == que comprueban una relación entre dos operandos se llaman
operadores relacionales y se utilizan en expresiones de la forma:

expresión, operador-re1 aci onal expresión
expresión, y expresión expresiones compatibles C
operador-re1 acional un operador de la tabla 4.7


Los operadores relacionales se usan normalmente en sentencias de selección ( i f ) o de iteración
(while, for), que sirven para comprobar una condición. Utilizando operadores relacionales se realizan operaciones de igualdad, desigualdad y diferencias relativas. La Tabla 4.7 muestra los operadores relacionales que se pueden aplicar a operandos de cualquier tipo de dato estándar: char, int , float, double, etc.
Cuando se utilizan los operadores en una expresión, el operador relaciona1 produce un O, o un 1,
dependiendo del resultado de la condición. O se devuelve para una condiciónfalsa, y 1 se devuelve para una condición verdadera. Por ejemplo, si se escribe
c = 3 < 7 ;
la variable c se pone a 1, dado que como 3 es menor que '1, entonces la operación < devuelve un valor de 1, que se asigna a c.


4.6. OPERADORES LÓGICOS
Además de los operadores matemáticos, C tiene también operadores lógicos. Estos operadores se
utilizan con expresiones para devolver un valor verdadero (cualquier entero distinto de cero) o un valor falso (O). Los operadores lógicos se denominan también operadores hooleanos, en honor de George Boole, creador del álgebra de Boole.
Los operadores lógicos de C son: not ( ! 1 , and (&&I y or ( I I I . El operador lógico ! (not, no)
producefalso (cero) si su operando es verdadero (distinto de cero) y viceversa. El operador lógico && (and, y ) produce verdadero sólo si ambos operandos son verdadero (no cero); si cualquiera de los operandos es falso produce falso. El operador lógico I I (or, o) produce verdadero si cualquiera de los operandos es verdadero (distinto de cero) y produce falso sólo si ambos operandos son falsos. La Tabla 4.8 muestra los operadores lógicos de C.


4.6.1. Evaluación en cortocircuito
En C los operandos de la izquierda de && y t I se evalúan siempre en primer lugar; si el valor del
operando de la izquierda determina de forma inequívoca el valor de la expresión, el operando derecho no se evalúa. Esto significa que si el operando de la izquierda de && es falso o el de t 1 es verdadero, el operando de la derecha no se evalúa. Esta propiedad se denomina evaluacio'n en cortocircuito y se debe a que si p es falso, la condición p && q es falsa con independencia del valor de q y de este modo C no evalúa q. De modo similar si p es verdadera la condición p I I q es verdadera con independencia del valor de q y C no evalúa a q.


4.7. OPERADORES DE MANIPULACIÓN DE BITS
Una de las razones por las que C se ha hecho tan popular en computadoras personales es que el lenguaje ofrece muchos operadores de manipulación de bits a bajo nivel.
Los operadores de manipulación o tratamiento de bits (binuise) ejecutan operaciones lógicas sobre cada uno de los bits de los operandos. Estas operaciones son comparables en eficiencia y en velocidada sus equivalentes en lenguaje ensamblador.
Cada operador de manipulación de bits realiza una operación lógica bit a bit sobre datos internos.
Los operadores de manipulación de bits se aplican sólo a variables y constantes char, int y long, y
no a datos en coma flotante. Dado que los números binarios constan de 1 ,s y 0,s (denominados bits), estos 1 y 0 se manipulan para producir el resultado deseado para cada uno de los operadores.
Las siguientes tablas de verdad describen las acciones que realizan los diversos operadores sobre los diversos patrones de bit de un dato int (char o long).


4.7.1. Operadores de asignación adicionales
AI igual que los operadores aritméticos, los operadores de asignación abreviados están disponibles también para operadores de manipulación de bits. Estos operadores se muestran en la Tabla 4.13.


4.7.2. Operadores de desplazamiento de bits (>>, <<)
Equivalen a la instrucción SHR ( << ) de los microprocesadores 80x86. Efectúa un
desplazamiento a la derecha (>>) o a la izquierda (<<) de n posiciones de los bits del operando, siendo n un número entero. El número de bits desplazados depende del valor a la derecha del operador. Los formatos de los operadores de desplazamiento son:
( >>) y SHL
1. valor << numero-de-bi ts;
2. valor >> numero-de-bits;
El valor puede ser una variable entera o carácter, o una constante. El número-de-hits determina
cuántos bits se desplazarán. La Figura 4.2 muestra lo que sucede cuando el número 29 (binario
O001 1101) se desplaza a la izquierda tres bits con un desplazamiento a la izquierda bit a bit (<<).


4.7.3. Operadores de direcciones
Son operadores que permiten manipular las direcciones de las variables y registros en general:
*expresión
&valorpi (lvalue)
registro.miembro
puntero-hacia-registro -> miembro


4.8. OPERADOR CONDICIONAL
El operador condicional, ? : , es un operador ternario que devuelve un resultado cuyo valor depende de la condición comprobada. Tiene asociatividad a derechas (derecha a izquierda).
Al ser un operador ternario requiere tres operandos. El operador condicional se utiliza para
reemplazar a la sentencia i f -e 1 se lógica en algunas situaciones. El formato del operador condicional es:
expresion-c ? expresion-v : expresion-f;
Se evalúa expresion-c y su valor (cero = falso, distinto de cero = verdadero) determina cuál es
la expresión a ejecutar; si la condición es verdadera se ejecuta expresion-v y si es falsa se ejecuta
expres i on- f.
La Figura 4.3 muestra el funcionamiento del operador condicional.


4.9. OPERADOR COMA
El operador coma permite combinar dos o más expresiones separadas por comas en una sola línea. Se evalúa primero la expresión de la izquierda y luego las restantes expresiones de izquierda a derecha. La expresión más a la derecha determina el resultado global. El uso del operador coma es como sigue:
expresión , expresión , expresión , . . . , expresión
Cada expresión se evalúa comenzando desde la izquierda y continuando hacia la derecha. Por
ejemplo, en
int i = 10, j = 25;
dado que el operador coma se asocia de izquierda a derecha, la primera variable está declarada e
inicializada antes que la segunda variable j . Otros ejemplos son:
i++, j++ ; equivale u
i++, j++, k++ ; equivale a
i++; j++;
i++; j++; k++;
El operador coma tiene la menor prioridad de todos los operadores C, y se asocia de izquierda
a derecha.
El resultado de la expresión global se determina por el valor de expresión,,. Por ejemplo,
int i, j, resultado;
resultado = j = 10, i = j, ++i;
El valor de esta expresión y valor asignado a resultado es 11. En primer lugar, a j se asigna el
La técnica del operador coma permite operaciones interesantes
i = 1 0 ;
j = (i = 12, i + 8 ) ;
Cuando se ejecute la sección de código anterior, j vale 2 O, ya que i vale 1 O en la primera sentencia, valor 1 o, a continuación a i se asigna el valor de j . Por último, i se incrementa a 1 1 .
en la segunda toma i el valor 12 y al sumar i + 8 resulta 2 O.


4.10. OPERADORES ESPECIALES ( ) [ ]
C admite algunos operadores especiales que sirven para propósitos diferentes. Entre ellos se destacan:
() , [ ] .


4.10.1. El operador ( )
El operador ( ) es el operador de llamada a funciones. Sirve para encerrar los argumentos de una
función, efectuar conversiones explícitas de tipo, indicar en el seno de una declaración que un
identificador corresponde a una función, resolver los conflictos de prioridad entre operadores.


4.10.2. El operador []
Sirve para dimensionar los arrays y designar un elemento de un array.

Ejemplos de ello:
double v[201; / * define un array de 20 elementos * /
printf ("v[2] = %e",v[21); / * escribe el elemento 2 de v * /
return vli-INFERIOR]; / * devuelve el elemento i-INFERIOR * /


4.11. EL OPERADOR SIZEOF
Con frecuencia su programa necesita conocer el tamaño en bytes de un tipo de dato o variable. C
proporciona el operador s i zeo f , que toma un argumento, bien un tipo de dato o bien el nombre de una variable (escalar, array, registro, etc.). El formato del operador es
sizeof (nombre-variabl e)
s i z eo f ( t ipo-da t o )
sizeof(expresión)