Periodico Diciembre 2014- 2015 CRA EBN EMMA ELISA FINOL CASTRO
Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.
-
Upload
magdalena-alcaraz-silva -
Category
Documents
-
view
230 -
download
0
Transcript of Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.
![Page 1: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/1.jpg)
1Daniel Finol
TÉCNICAS DE PROGRAMACIÓN
Lenguaje C - 2
Daniel Finol
![Page 2: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/2.jpg)
Daniel Finol
TIPOS OPERADORES Y EXPRESIONES
Capítulo 2 de K y R
![Page 3: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/3.jpg)
Daniel Finol
Nombres de variables y constantes Nombres de variables y constantes:
Letras (mayúsculas o minúsculas; A != a). Dígitos decimales. Subrayado (‘_’).
Primer carácter: No puede ser dígito. No debe ser ‘_’.
Tradición (convención): minúsculas para los nombres de variables. MAYÚSCULAS SOSTENIDAS para las constantes
simbólicas.
![Page 4: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/4.jpg)
Daniel Finol
Nombres de variables y constantes
No usar palabras claves.
Nombres Documentación.
Externas: Sólo hay garantía primeros 31 caracteres. Ahora (C99) sí se garantiza A != a.
![Page 5: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/5.jpg)
Daniel Finol
Tipos de variable
• El tipo de una variable indica:– el conjunto de valores que puede tener,– las operaciones que se pueden realizar sobre ella.
• Tipos básicos:
char Un byte; guarda un carácter.
int Un entero.
float Punto flotante; precisión sencilla (single).
double Punto flotante; precisión doble.
![Page 6: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/6.jpg)
Daniel Finol
Tamaños y Modificadores de tipos
Modificadores (o calificadores) para int: short int >= 16 bits.
long int >= 32 bits.
short <= int <= long.
int es del tamaño “normal” de los enteros de la máquina.
La palabra int puede omitirse de la declaración.
![Page 7: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/7.jpg)
Daniel Finol
Tamaños y Modificadores de tipos
Modificadores signed y unsigned:
Se aplican a int y char.
unsigned: cero o positivo.
unsigned char = [0 , 255]
signed char = [-128 , 127] (complemento a 2)
long double: p. flotante precisión extendida.
![Page 8: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/8.jpg)
Daniel Finol
Constantes
Una constante entera que tenga el sufijo u o U se toma como unsigned.
Una constante entera es long si:
No cabe en un int.
Está terminada por L o l (ele).
![Page 9: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/9.jpg)
Daniel Finol
Constantes
Una constante es de punto flotante si: Contiene un punto decimal: 1.234. Está en notación científica: 1e-2.
Una constante de punto flotante se toma como double excepto: Si termina en f o F; se toma como float. Si termina en l (ele) o L; se toma como long double.
![Page 10: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/10.jpg)
Daniel Finol
Constantes
Constantes de carácter: 'A', '\0'.
Expresiones constantes. Se calculan en tiempo de compilación. Ej.:
#define MAXLINE 1000 char line[MAXLINE+1];
![Page 11: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/11.jpg)
Daniel Finol
Constantes
"Constante de cadena", "". Las comillas no forman parte de la cadena, sólo la
delimitan.
Una cadena es un arreglo de caracteres.
La representación interna de una constante de cadena tiene un carácter nulo al final.
El espacio de almacenamiento requerido es uno más que el número de caracteres entre comillas.
![Page 12: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/12.jpg)
Daniel Finol
Longitud de una cadena.
Para saber la longitud de una cadena hay que recorrerla toda:
int strlen(char s[]){
int i;
i = 0;while (s[i] != '\0')
++i;return i;
}
strlen está en <string.h>
![Page 13: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/13.jpg)
Daniel Finol
'x' != "x";
'x' es un pequeño entero (char).
"x" es un arreglo de dos caracteres.
![Page 14: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/14.jpg)
Daniel Finol
Secuencias de escape
\a alerta (campana) \\ backslash
\b backspace \? question mark
\f formfeed \' single quote
\n nueva línea \" double quote
\r retorno de carro \ooo octal number
\t horizontal tab \xhh hexadecimal number
\v vertical tab
![Page 15: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/15.jpg)
Daniel Finol
Enumeraciones
enum Crea una lista de constantes auto enumeradas:
enum booleana {FALSO, VERDAD};
enum escapes { BELL = '\a', BACKSPACE = '\b', TAB = '\t', NEWLINE = '\n', VTAB = '\v', RETURN = '\r' };
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC };
![Page 16: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/16.jpg)
Daniel Finol
Enumeraciones
Se pueden declarar variables de tipo enum pero el compilador no chequea qué se le asigna.
Sirve más bien como ‘documentación-en-código’.
![Page 17: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/17.jpg)
Daniel Finol
Declaraciones
Una declaración especifica un tipo de dato seguido de una o más variables de ese tipo. Si hay más de una variable, estas se separan por
comas. Termina en punto y coma.
Una variable puede ser inicializada en su declaración: int i = 0;
![Page 18: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/18.jpg)
Daniel Finol
Inicialización Variables No-Automáticas
Si no es automática (externas y estáticas):
se inicializa una sola vez al (antes del) inicio del programa.
se debe inicializar con una expresión constante.
se inicializan a cero por defecto (atención: sólo variables no automáticas).
![Page 19: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/19.jpg)
Daniel Finol
Inicialización Variables Automáticas
Si es automática (locales no estáticas):
la inicialización se ejecuta cada vez que se entra al bloque donde se encuentra (si se inicializa).
puede ser inicializada con cualquier expresión.
si no es inicializada contiene valores indefinidos: basura.
![Page 20: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/20.jpg)
Daniel Finol
Declaraciones: const
El calificador const puede aplicarse a la declaración de una variable para especificar que su valor no será cambiado:
const double e = 2.71828182845905;
const char msg[] = "warning: ";
int strlen(const char[]);
Los elementos de los arreglos no serán cambiados
![Page 21: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/21.jpg)
Daniel Finol
Operadores aritméticos
Operadores aritméticos binarios: +, -, *, / y %.
La división entera trunca: 4 / 3 == 1 3 / 4 == 0
x % y es el residuo de x entre y: 4 % 3 == 1
![Page 22: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/22.jpg)
Daniel Finol
Operadores aritméticos
El módulo es cero cuando x es múltiplo de y. Ej:
if((year % 4 == 0 && year % 100 != 0) || year % 400==0)
printf("%d es año bisiesto\n", year);
else
printf("%d no es bisiesto\n", year);
![Page 23: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/23.jpg)
Daniel Finol
Operadores Aritméticos
Con operandos negativos no se especificaba:Dirección de truncamiento de /.Signo del resultado de %.
Ahora (C99) sí:Dirección de truncamiento: cero.Tiene signo y satisface la ecuación:
(a/b)*b + a%b == a
-22 / 7 = -4-22 % 7 =
-22 / 7 = -3 -22 % 7 = -1
![Page 24: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/24.jpg)
Daniel Finol
Operadores relacionales y lógicos
Operadores relacionales: > < <= >=
tienen menor precedencia que los aritméticos:
i < lim – 1 se interpreta como i < (lim – 1).
Operadores de igualdad:== !=
![Page 25: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/25.jpg)
Daniel Finol
Operadores relacionales y lógicos
Operadores lógicos:&& ||
&& tiene mayor precedencia que ||. Ambos son evaluados de izquierda a derecha
La evaluación se detiene tan pronto se conozca el resultado (verdadero o falso).
![Page 26: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/26.jpg)
Daniel Finol
Operadores lógicos
for(i=0; i < lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
Tienen menor precedencia que los operadores relacionales.
Verificar si hay espacio para guardar el carácter antes de leerlo.
![Page 27: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/27.jpg)
Daniel Finol
Operadores lógicos
for(i=0; i < lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
Leerlo antes de probar si es EOF o nueva línea.
Precedencia de != es mayor que la de asignación; se necesitan paréntesis en
(c=getchar()) != '\n'
![Page 28: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/28.jpg)
Daniel Finol
El valor numérico de una expresión lógica y relacional es 1 si es verdadera y 0 de ser falsa.
Operador unario de negación !
if(!valid) if(valid == 0)
![Page 29: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/29.jpg)
Daniel Finol
Conversiones de tipo
Si un operador tiene operandos de tipos distintos, éstos se convierten a un tipo común siguiendo ciertas reglas.
Las únicas conversiones automáticas son las que convierten un operando "pequeño" o "angosto" o uno más "grande" o "amplio" sin pérdida de información.
![Page 30: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/30.jpg)
Daniel Finol
Conversiones de tipo
Ej.: de entero a punto flotante en f + i.
Operaciones que pueden perder información no son ilegales (no producen error).
![Page 31: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/31.jpg)
Daniel Finol
Conversión de una cadena
Un char es un entero pequeño, de modo que se puede usar en expresiones aritméticas.
atoi convierte una cadena de dígitos a su equivalente en un valor entero:
int atoi(char s[]) {
¿?
}
![Page 32: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/32.jpg)
Daniel Finol
Conversión de una cadena
Un char es un entero pequeño, de modo que se puede usar en expresiones aritméticas.
atoi convierte una cadena de dígitos a su equivalente en un valor entero:
int atoi(char s[]) { int i, n;
n = 0; for(i = 0; s[i] >= '0' && s[i] <= '9'; ++i) n = 10 * n + (s[i] - '0'); return n; }
![Page 33: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/33.jpg)
Daniel Finol
char a int
El estándar no especifica si las variables char tienen signo o no.
Cuando una variable char se convierte a int ¿es posible que produzca un número negativo?
Respuesta: depende de la implantación.
Portabilidad: se debe especificar unsigned o signed si se van a guardar datos que no son caracteres en una variable char.
![Page 34: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/34.jpg)
Daniel Finol
Conversiones automáticas
En una operación binaria (que no sea de asignación):
se promueve la variable más "pequeña" al tipo de la más grande.
los char y short se promueven a int.
![Page 35: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/35.jpg)
Daniel Finol
Conversiones automáticas
En una asignación se transforma el valor de la derecha al tipo de la variable de la izquierda.
int i;
char c;
...
i = c;
c = i;
int i;
char c;
...
c = i;
i = c;
![Page 36: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/36.jpg)
Daniel Finol
casting
Se puede forzar explícitamente la conversión de tipo de cualquier expresión con el operador de cast:
(nuevo-tipo) expresión
Si usan funciones que no han sido declaradas se realiza una conversión por defecto de los argumentos que no necesariamente corresponde a los tipos de los parámetros de la función. Esto puede producir errores. Ej. sqrt.
![Page 37: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/37.jpg)
Daniel Finol
casting – Números aleatorios unsigned long int next = 1;
int rand(void) {
next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; }
void srand(unsigned int seed) { next = seed; }
![Page 38: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/38.jpg)
Daniel Finol
Operadores de incremento y decremento
++ y -- incrementa o disminuye en 1 la variable.
Prefijo (++x o --x): modifican x antes de su uso.
Posfijo (x++ o x--): modifican x luego de su uso.
n = 5;x = n++;
n = 5;x = ++n;
if (c == '\n') nl++;
if (c == '\n') ++nl;
![Page 39: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/39.jpg)
Daniel Finol
Operador de incremento - ¿Qué hace esta función? void s(char s[], int c) { int i, j;
for (i = j = 0; s[i] != '\0'; i++) if (s[i] != c) s[j++] = s[i]; s[j] = '\0'; }____________________________________________________
if (s[i] != c) { s[j] = s[i]; j++; }
![Page 40: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/40.jpg)
Daniel Finol
Operador de incremento - ¿Qué hace la función? void f(char s[], char t[]) { int i, j;
i = j = 0; while (s[i] != '\0') i++; while ((s[i++] = t[j++]) != '\0') ; }
![Page 41: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/41.jpg)
Daniel Finol
Manejo de bits
• Los operadores para manejo de bits sólo pueden aplicarse a enteros (char, short, int y long):
& Y (AND) de bits
| O (OR) inclusivo de bits
^ O exclusivo (XOR) de bits
<< desplazamiento (shift) a la izquierda
>> desplazamiento (shift) a la derecha
~ complemento a uno (unario)
![Page 42: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/42.jpg)
Daniel Finol
Operadores de bits
El operador Y de bits (&) sirve para enmascarar bits: n = n & 0177
1 & 2 == ?
1 && 2 == ?
![Page 43: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/43.jpg)
Daniel Finol
El operador O Inclusivo (|) puede encender bits:n = n | SET_ON
1 | 2 == ?
1 || 2 == ?
![Page 44: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/44.jpg)
Daniel Finol
Operadores de bits
El operador O Exclusivo (^) pone uno en cada posición donde sus operandos tienen bits distintos y cero donde no.
1 ^ 2 == ?
![Page 45: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/45.jpg)
Daniel Finol
Operadores de bits
<< desplazamiento a la izquierda
llena con ceros
5 << 3 == ?
![Page 46: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/46.jpg)
Daniel Finol
Operadores de bits
<< desplazamiento a la izquierda llena con ceros
5 << 3 …000101 << 3 …001010 == ? …010100 == ? …101000 == ?
![Page 47: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/47.jpg)
Daniel Finol
Operadores de bits
<< desplazamiento a la izquierda
llena con ceros
x << n == x*2n
![Page 48: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/48.jpg)
Daniel Finol
Operadores de bits
>> desplazamiento a la derecha.
unsigned >> llena con ceros.
signed >> depende de la implantación.
![Page 49: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/49.jpg)
Daniel Finol
Operadores de bits
>> desplazamiento a la derecha. 5 >> 1 == ?
40 >> 3 == ?
5 >> 3 == ?
![Page 50: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/50.jpg)
Daniel Finol
Operadores de bits
~ complemento
Queremos borrar los 6 bits más bajos de x. ¿Cómo lo hacemos?
![Page 51: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/51.jpg)
Daniel Finol
Operadores de bits
~ complemento
x = x & ~077
independiente del tamaño de x
![Page 52: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/52.jpg)
Daniel Finol
Operadores de bits -- getbits
unsigned getbits(unsigned x, int p, int n) { return (x >> (p+1-n)) & ~(~0 << n); }
![Page 53: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/53.jpg)
Daniel Finol
Operadores de asignación
Las asignaciones donde el operando de la izquierda se repite inmediatamente a la derecha del ‘=‘ pueden abreviarse:
i = i + 2 i += 2
i += 2 (“incrementar i en 2”)
se lee más fácil que:
i = i + 2 (“tomar i sumarle 2 y poner el resultado en i”)
![Page 54: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/54.jpg)
Daniel Finol
Operadores de asignación
Hay operadores de asignación para:
+ - * / % << >> & ^ |
expresión1 = (expresión1)op (expresión2)
expresión1 op= expresión2
x *= y + 1 x = x * (y + 1)
excepto que expresión1 se evalúa una sola vez
![Page 55: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/55.jpg)
Daniel Finol
Una ventaja de los operadores de asignación
yyval[yypv[p3+p4] + yypv[p1]] = yyval[yypv[p3+p4] + yypv[p1]] + 2
yyval[yypv[p3+p4] + yypv[p1]] += 2
![Page 56: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/56.jpg)
Daniel Finol
Operadores de asignación – Conteo de bits
int bitcount(unsigned x) { ¿? }
![Page 57: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/57.jpg)
Daniel Finol
Operadores de asignación – Conteo de bits
int bitcount(unsigned x) { int b;
for (b = 0; x != 0; x >>= 1) if (x & 01) b++; return b; } x es sin-signo para asegurar que no hay extensión de signo
![Page 58: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/58.jpg)
Daniel Finol
Ejercicio
• ¿Qué efecto tiene la siguiente expresión en x?
x &= (x-1)
• Use esto para escribir una versión más rápida de bitcount
![Page 59: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/59.jpg)
Daniel Finol
Expresiones condicionales ?:
expr1 ? expr2 : expr3
z = (a > b) ? a : b;
Tipo: si f es float y n int:
(n > 0) ? f : n es float.
![Page 60: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/60.jpg)
Daniel Finol
Expresiones condicionales ?:
for (i = 0; i < n; i++)
printf("%6d%c",a[i], (i%10==9 || i==n-1) ? '\n' : ' ');
________________________________________________________
printf("Hay %d elemento%s.\n", n, n==1 ? "" : "s");
![Page 61: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/61.jpg)
Daniel Finol
Precedencia
Operadores Asociatividad
() [] -> . izquierda a derecha
! ~ ++ -- + - * (type) sizeof derecha a izquierda
* / % izquierda a derecha
+ - izquierda a derecha
<< >> izquierda a derecha
< <= > >= izquierda a derecha
== != izquierda a derecha
& izquierda a derecha
^ izquierda a derecha
| izquierda a derecha
&& izquierda a derecha
|| izquierda a derecha
?: derecha a izquierda
= += -= *= /= %= &= ^= |= <<= >>=
derecha a izquierda
, izquierda a derecha
if(x & MASK == 0)
![Page 62: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/62.jpg)
Daniel Finol
Precedencia
Para la mayoría de los operadores no está definido el orden de evaluación de sus operandos.
x = f() + g()
Excepciones: &&, ||, ?:, y ','
![Page 63: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/63.jpg)
Daniel Finol
Precedencia
El orden de evaluación de los argumentos tampoco está definido:
/* MALO */ printf("%d %d\n", ++n, power(2, n));
Es decir, la coma que separa los argumentos de una función no es el operador coma.
![Page 64: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/64.jpg)
Daniel Finol
Efectos colaterales ≈ Daños colaterales
Las llamadas a funciones, asignaciones anidadas y operadores de incremento y decremento producen "efectos colaterales“:
Alguna variable se modifica como efecto de la evaluación de una expresión.
![Page 65: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/65.jpg)
Daniel Finol
Efectos colaterales ≈ Daños colaterales
s[i] = i++; ¿?
Escribir código que dependa del orden de evaluación es una mala práctica. (No es transportable)
![Page 66: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/66.jpg)
Daniel Finol
Ejercicio – set_bit
Hacer una función que encienda o apague el n-ésimo bit de un entero.
int set_bit(int x, int n, int b)
![Page 67: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/67.jpg)
Daniel Finol
EjercicioDeben crear un programa que lea de la entrada
estándar una secuencia de 1’s y 0’s y usarlos para llenar los bits un arreglo de char's
De manera que los primeros ocho 1's y 0's representen los bits del primer char del arreglo los siguientes los del siguiente char, etc.
La entrada puede estar dividida en líneas, de encontrarse un caracter nueva línea antes de haber leído los ocho bits del char actual los leídos hasta ese momento se tomarán como los bits menos significativos y los restantes se tomarán por ceros.
Después de leer toda la entrada deben imprimirse los bits de los char's leídos
![Page 68: Daniel Finol 1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C - 2 Daniel Finol.](https://reader035.fdocument.pub/reader035/viewer/2022062217/5665b4911a28abb57c923c62/html5/thumbnails/68.jpg)
Daniel Finol
Ejercicio
¿Cómo intercambiar dos variables sin usar variables o almacenamiento temporal?