1. Lenguaje C
Tipos, operadores y expresiones
Material basado en el libro The C Programming Language. Brian W. Kernighan, Dennis M.
Ritchie. Prentice-Hall 1988. ISBN 0-13-110362-8 (paperback); ISBN 0-13-110370-9
1
2. Nombres de variables
● Letras mayúsculas y minúsculas
● Guión bajo
○ Cuenta como letra
● Números
○ No como primera letra
x1
windSpeed
reactive_power
No se debe comenzar por guión bajo.
Convenio habitual: variables con
minúsculas, constantes con mayúsculas.
2
3. Tipos de datos
Tipos básicos
char
int
float
double
Calificadores
short
long
long long
signed
unsigned
short int sh;
long int contador;
int se suele omitir:
short sh;
long contador;
3
4. Los límites están en:
<limits.h>
<float.h>
sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)
1 ≤ sizeof(char)
2 ≤ sizeof(short) ≤ sizeof(int)
4 ≤ sizeof(long)
8 ≤ sizeof(long long)
sizeof(float) ≤ sizeof(double) ≤ sizeof(long double)
Tipos de datos
Tamaños
#include <limits.h>
…
short s; int i;
…
if (i < SHRT_MAX) s = i;
4
5. Límites de enteros
<limits.h>
Mínimo Máximo
char
signed char
unsigned char
CHAR_MIN
SCHAR_MIN
UCHAR_MIN
CHAR_MAX
SCHAR_MAX
UCHAR_MAX
(signed) short
unsigned short
SHRT_MIN
USHRT_MIN
SHRT_MAX
USHRT_MAX
(signed) int
unsigned
INT_MIN
UINT_MIN
INT_MAX
UINT_MAX
long
unsigned long
LONG_MIN
ULONG_MIN
LONG_MAX
ULONG_MAX
long long
unsigned long
long
LLONG_MIN
ULLONG_MIN
LLONG_MAX
ULLONG_MAX
5
7. Constantes
Ejemplos
char
signed char
unsigned char
'@', 'x2f', '013', 't'
(signed) short
unsigned short
1234
1234U, 1234u
(signed) int
unsigned
long
unsigned long
1234L, 1234l
1234UL, 1234ul
long long
unsigned long long
1234LL, 1234ll
1234ULL, 1234ull
7
9. Caracteres especiales
a Campana Barra invertida
b Retroceso ? Signo de interrogación
f Form feed ' Comilla simple
n Nueva línea " Comilla doble
r Retorno de carro ooo Código octal
t Tabulador horizontal xhh Código hexadecimal
v Tabulador vertical 0 Terminador de cadenas
9
10. Cadenas de texto
"Soy una cadena"
"" // cadena vacía
"Soy una cadena" " muy larga"
● Son vectores de caracteres
char str[5] = "Hola";
Siempre hay un caracter
terminador ‘0’ al final
¡OJO! ‘x’ no es lo mismo que “x”
10
11. Constantes simbólicas
#define NOMBRE expresión_constante
#define MAXLEN 10
enum Color {
Rojo = 1,
Verde = 2,
Azul = 4,
};
enum Mes {
Ene, Feb, Mar, Abr,…
};
char str[MAXLEN];
int c = Rojo + Verde;
int mes = Feb;
O bien indicando el valor de
alguno:
enum Mes {
Ene = 1, Feb,
Mar,…
};
11
12. Declaraciones
int lower, upper, step;
char c, line[1000];
char esc = '';
int i = 0;
const double e = 2.7182818284;
const char msg[] = "warning";
int strlen(const char s[]) {
…
}
● Declarar antes de usar
● Es posible inicializar con
valor
● Es posible calificar como
const
○ Variable no va cambiarse
○ Argumento no se modifica
12
13. Operadores
Aritméticos + - * / %
++ --
De relación > >= < <= ==
!=
Lógicos ! && ||
De bits ~ | & ^ >>
<<
De asignación = += -= *= /=
%=
~= |= &= ^= ~=
>>= <<=
De arrays y punteros & * -> []
Especiales ?: , (tipo) sizeof
13
14. Operadores aritméticos
Binarios: + - * / %
x % y Resto de dividir x entre y (solo
enteros)
x / y División entera o real según tipos de x
e y
Unarios: + - ++ --
Precedencia: unarios, * / %, + -
Asociatividad: binarios de izquierda a derecha
unarios de derecha a
izquierda 14
15. Op. de relación y lógicos
Binarios: < <= > >=
&& ||
Unarios: !
Precedencia: !, aritméticos, relación, &&, ||
Asociatividad: binarios de izquierda a derecha
unarios de derecha a
izquierda
15
16. Conversiones de tipo
Cuando un operador tiene operandos de distintos tipos se
convierten a un tipo común
● De forma automática hacia tipos más amplios sin pérdida de información
● Se prohíben expresiones sin sentido (e.g. float como índice de vector)
● Expresiones que pueden perder información generan advertencias pero
no son ilegales
int atoi(char s[]) { // convierte s a entero
int i, n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}
Conversión char → int
16
17. Reglas de conversión implícita
Si un operador binario tiene dos operandos de distinto tipo
● Si un operando es long double, convierte el otro a long double
● En caso contrario, si uno es double, convierte el otro double
● En caso contrario, si uno es float, convierte el otro float
● En caso contrario, convierte char y short a int
● Después, si uno es long long convierte el otro a long long
● Después, si uno es long convierte el otro a long
int i; int i;
char c; char c;
i = c; c = i;
c = i; i = c;
No hay conversión automática
float → double
Enteros grandes a enteros pequeños
se convierten truncando bits más
significativos
Puede perder
información
17
18. Reglas de conversión implícita
Llamadas a función
En ausencia de prototipo
● char y short de convierten a int
● float se convierte a double
El ABI puede imponer
más conversiones
Si hay prototipo aplica
reglas de conversión
implícita
double f(double x);
int main() {
printf("%lf", f(2));
}
double f(double x) {
return x*x
+ 2*x
- 5;
}
Prototipo imprescindible para
que funcione correctamente
biblioteca
independiente
18
19. Conversión de tipos explícita
Operador de coerción (type cast)
(tipo) expresión
● Convierte expresión al tipo indicado
● Como si se hubiera asignado a una variable del tipo indicado
19
20. Operadores ++ y --
Versión prefijo y postfijo
● Prefijo incrementa antes de que el valor se use
● Postfijo incrementa después de que el valor se use
n = 5; n = 5;
x = n++; x = ++n;
Ejemplo: Concatenar cadenas
void strcat(char s[], char t[]) {
int i = 0, j = 0;
while (s[i] != '0') i++;
while ((s[i++] = t[j++]) != '0') ;
}
x == 6, n == 6
x == 5, n == 6
Busca final de s
Copia t
20
21. Ejercicios
1. Implementar la función
int htoi(char str[])
que convierte una cadena que contiene un número
hexadecimal en el entero correspondiente
2. Implementar la función
void squeze(char str[], int c)
que elimina todas las ocurrencias del caracter c en la
cadena str.
21
22. Operadores de bits
& AND bit a bit
| OR bit a bit
^ XOR bit a bit
<< Desplazamiento a la izquierda
>> Desplazamiento a la derecha
~ NOT bit a bit (complemento a 1)
0 0 1 0 0 1 0 1
0
0
1
1
0
0
1
1
char a = 0x25; b = 0x33;
a&b == 0x21
a|b == 0x37
a^b == 0x16
~a == 0xda
&
&
&
&
&
&
&
&
0 0 1 0 0 0 0 1
22
23. Operadores de bits
Obtener los n bits a partir de la posición p del entero x
unsigned getbits(unsigned x, int p, int n) {
return (x >> (p+1-n)) & ~(~0 << n);
}
n
p
x
23