Tema 2: Nociones básicas
Constantes y variables, tipos de datos básicos, declaración de los tipos básicos. Asignación. Operadores aritméticos básicos,
expresiones. Operadores relacionales y lógicos.
Los tipos constante y variable
En C, una variable debe ser declarada antes de ser usada. Las variables pueden ser declaradas al comienzo de un bloque de código.
Las variables locales se deben crear cuando se llama a una función, y son destruidas cuando se regresa de la función.
Ejemplos:
int alto, bajo;
int alto = 250; /* temperatura máxima */
int bajo = -40; /* temperatura mínima */
Los tipos constante y variable Tipos de variable:
int: número entero con signo
float: número punto flotante (real)
double: número de punto flotante de doble precisión char: un “byte” de memoria para almacenar un caracter short: entero de rango reducido
long: entero de rango expandido unsigned: entero de rango positivo
unsigned long: entero de rango positivo con rango expandido Obs.
• Todas las variables deben comenzar con un caracter. Los demás pueden ser números, letras y/o “underscore”. Las mayúsculas y minúsculas son diferentes.
Obs (cont.).
• Nombres prohibidos: main, while, switch, etc.
• Como convención se evita usar mayúsculas en variables. Se usan en constantes.
• Las variables globales se declaran fuera de las funciones. Usualmente se declaran al principio del programa, pero después de las directivas para el compilador.
• Cuando una variable global es declarada en un archivo, pero se quiere usar en otro, esta variable se denomina externa y debe ser declarada.
Ejemplo:
extern int temperatura;
Se debe realizar antes de entrar a una función.
• Otro tipo de variable son las estáticas (static); es un tipo de variable local, pero no se destruye al salir de la función, esta se preserva, y está
disponible en el próximo llamado de la función Ejemplo:
static int contador;
Especificadores de clase de almacenamiento de variables
extern: permite señalar la existencia de variables globales en archivos separados de un proyecto grande
Archivo main.c int x , y ; char c ;
main () { ... }
Archivo func1.c
extern int x , y ; extern char c ;
void func1(void) { x = y / 10;
}
Archivo func2.c
extern int x , y ; extern char c ;
void func2(void) { y = 10;
}
Especificadores de clase de almacenamiento de variables
static: permite guardar el valor de una variable local entre llamadas de una misma función; sólo pueden ser utilizadas en el bloque o función donde están definidas. Son inicializadas en 0 por el compilador (también pueden ser inicializadas explícitamente a cualquier otro valor, pero en la misma instrucción de declaración).
#include <stdio.h>
void test_static(void);
main ()
{ test_static();
test_static();
}
Archivo main.c Archivo test_static.c void test_static(void) { static int i;
i++;
printf(" i = %d \n",i);
}
Al ejecutar este programa se imprime en pantalla: i = 1
i = 2
ver ejC01
Especificadores de clase de almacenamiento de variables
register: permite almacenar una variable en zonas de la memoria llamadas
"registros", de manera que el tiempo de acceso sea el más rápido posible. El compilador administra el uso de este tipo de variables, pudiendo ignorar la especificación en ciertos casos. Típicamente se usa para variables de uso repetitivo, como los índices en una
instrucción cíclica.
#include <stdio.h>
#define MAXVALOR 10 main ()
{ register unsigned int cont;
float valor = 0.0;
for (cont=1; cont <= MAXVALOR; ++cont) valor += (float) 1/cont;
printf("\n e = %12.7f \n",valor);
} ver ejC1C
Tipos constantes
Es la versión escrita de un número o carácter:
1, 0, 5.73, 12.5e9, 'a', ''casa''.
Obs.
Constante caracter no se usan comúnmente. Una constante “conjunto de
caracteres” se encierra entre comillas dobles y termina automáticamente con el nulo: '\0'.
Caracteres prohibidos:
'\n': nueva línea '\t': tabulador '\\': backslash
'\'': comilla sencilla
'\0': nulo (usado automático para finalizar un conjunto de caracteres) '\r': retrocede
Operadores y expresiones
Un operador es una función que se aplica a valores para dar un resultado.
Los operadores más elementales son
+, -, *, /.
Operadores y valores se combinan para formar una expresión.
• Asignación:
y = m * x + c
• Operadores aritméticos +: adición
-: sustracción
*: multiplicación /: división
%: resto de la división entera
Obs. *, / y % se ejecutan antes que + y -.
Operadores y expresiones
C tiene formas cortas (abreviaciones) para algunas expresiones:
i++; o ++i; equivalente a i=i+1 (operador incremento) i--; o --i; equivalente a i=i-1 (operador decremento) y pueden ser combinados con otras expresiones:
x = a * ++b; equivalente a b = b + 1; x = a * b;
x = a * b++; equivalente a x = a * b; b = b + 1;
x = i-- * (a + b); equivalente a x = i * (a + b); i = i -1;
x = --i * (a + b); equivalente a i = i -1; x = i * (a + b);
i += 10; equivalente a i = i + 10;
i -= 10; equivalente a i = i - 10;
i *= 10; equivalente a i = i * 10;
i /= 10; equivalente a i = i /10;
ejemplo 1:
ejemplo 2:
ver ejC2
Operadores y expresiones
Obs.
• Cuando variables de diferente tipo se mezclan en una operación, el resultado será del tipo de mayor tamaño.
Ejemplo: “float” * “double” produce “double”.
• La función raíz cuadrada trabaja sobre doble precisión, y el resultado es doble precisión:
int i = 256;
float solución;
solución = sqrt(i);
ejemplo 3:
z = z + 1;
x = (z - w) % 100;
w = w – 1;
es equivalente x = ((++z) – (w--)) % 100;
ver ejC2
Peculiaridades de la declaración de variables y la asignación
En C, a diferencia de la mayoría de los lenguajes de alto nivel, la asignación devuelve un valor, el cual corresponde justamente al valor asignado.
Por ejemplo, la asignación x = 3; devuelve el valor 3.
Así es posible escribir instrucciones como la siguiente: i = j = 3;
En este caso, se efectúa primero la asignación que está más a la derecha, esto es j = 3; la cual devuelve el valor 3. Por lo tanto, la siguiente asignación tiene sentido, y a la variable i se le asigna ese valor devuelto, es decir 3.
Es fácil ver que después de la ejecución de la siguiente instrucción i = (j = 4) + 5;
la variable j vale 4, mientras que la variable i vale 9.
Peculiaridades de la declaración de variables y la asignación
En C, es obligatorio declarar las variables locales a una función (ya sea main u otra cualquiera) antes de usarlas. Por lo tanto, hay que cuidar que las
inicializaciones hechas al momento de declarar variables tengan sentido para el compilador.
Es así como la siguiente declaración acompañada de inicialización tiene sentido:
int j, i = (j = 4) + 5;
mientras que esta otra no lo tiene (se genera un error de compilación):
int i = (j = 4) + 5, j;
ver ejC2A
Combinación de variables y/o constantes de diferentes tipos en una expresión
• Cuando todos los valores a la derecha del "=" son del mismo tipo, el
resultado toma ese mismo tipo (por ejemplo, la división de dos enteros es un entero)
• Cuando se encuentran valores de tipos diferentes:
Los caracteres son convertidos a enteros
Si uno de los valores es double, los demás son convertidos a double y el resultado es double
Si uno de los valores es long, los demás son convertidos a long y el resultado es long
ver ejC2A
Conversión automática de tipos básicos
El lenguaje C permite la conversión entre casi todos los tipos de variable. A pesar de esto, se recomienda el uso controlado de este hecho, sobre todo mediante los castings.
Algunas conversiones automáticas se muestran en la siguiente tabla:
conversión efecto
char asignado a int (i = c) c queda almacenado en el byte menos significativo de i (el que está más a la derecha)
int asignado a char (c = i) Se pierde la parte más significativa del entero
int asignado a float (f = i) Sin problema: f tiene parte entera i y parte decimal 0
float asignado a int (i = f) Se pierde la parte decimal de f float asignado a double (x = f) Sin problema
double asignado a float (f = x) Se pierde precisión ver ejC2A
Operadores y expresiones Operadores relacionales:
símbolo significado
== igualdad
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
!= distinto de
Obs.
• Son usados frecuentemente en la estructuras de control “if”, “for”, “while”
• El resultado es una expresión lógica: verdadero (1) o falso (0).
ver ejC2
Operadores y expresiones Operadores lógicos:
símbolo significado
a && b retorna verdadero si a y b son ambos verdaderos
a || b retorna verdadero si a ó b son verdaderos
! a negado de a
a b a && b
V V V
V F F
F V F
F F F
a b a || b
V V V
V F V
F V V
F F F