1 - Introduccion A C

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 49

INTRODUCCION A C

Fundamentos de Computación I
ORIGENES DEL C

C es el resultado de un proceso de desarrollo comenzado con un lenguaje anterior


denominado BCPL, e influenció otro lenguaje denominado B, que en los años ’70 llevó
al desarrollo del “C”.
Fue creado e implementado por primera vez por Dennis Ritchie en un DEC-PDP11 bajo
sistema operativo UNIX.
En 1978 se editó la primera publicación de C por Kernighan y Ritchie.
Con la popularidad de las microcomputadoras se crearon muchas implementaciones de
C y aparecieron discrepancias. Para remediar la situación el Instituto de Estándares
Americanos (ANSI) estableció un comité a principios del verano de 1983 para crear un
estándar que definiera de una vez por todas el lenguaje, y éste se aprueba en 1988.
CARACTERISTICAS DE C

C se clasifica como un lenguaje de nivel medio porque combina elementos de


lenguajes de alto nivel con la funcionalidad del lenguaje ensamblador.
Como lenguaje de nivel medio permite la manipulación de bits, bytes y direcciones;
elementos básicos con los que funciona la computadora, esto lo hace particularmente
adecuado para la programación de sistemas.
En la actualidad se lo utiliza para cualquier tipo de tareas debido a su portabilidad y
eficiencia.
El código C es muy portable, o sea, que es posible adaptar el software escrito para un
tipo de computadora en otra.
Los programas corren prácticamente sin cambios en cualquier máquina que maneje C.
C proporciona distintos tipos de datos básicos, los tipos fundamentales son caracteres,
enteros y números de punto flotante de varios tamaños que se combinan con los
operadores aritméticos y lógicos .
C permite cualquier conversión de tipos.
C no lleva a cabo comprobaciones de errores en tiempo de ejecución, como por ejemplo
que se sobrepasen los límites de los arreglos o que haya incompatibilidad de tipos en
los argumentos. El programador es el único responsable de llevar a cabo esas
comprobaciones.
C es un lenguaje estructurado que permite muchas posibilidades en programación.
El principal componente estructural de C es la función.
En C las funciones permiten definir las tareas de un programa y codificarlas por
separado, haciendo que los programas sean modulares. Una vez que se ha creado una
función que trabaja perfectamente, se puede aprovechar en distintas situaciones.
En C se crean bloques de código colocando una serie de sentencias entre llaves.
Ejemplo: if (x < 10)
{ contador = 1; a = x * 3; }

En este caso las dos sentencias tras el if y entre las llaves se ejecutan juntas si x es
menor que 10.
Estas dos sentencias junto con las llaves representan un bloque de código.
Se trata de una unidad lógica: no se puede ejecutar una de las sentencias sin la otra.
Además, implementa directamente varias construcciones de bucles, tales como
while, do-while, for, y si bien también incluye el goto, éste no es la forma normal de
control.
Tiene la ventaja de usar compilador en lugar de intérprete, es más rápido.
El intérprete lee el código fuente de un programa línea a línea, realizando las
instrucciones específicas contenidas en esa línea, el código fuente debe estar presente
cada vez que se quiere ejecutar el programa. O sea, que cada vez que se ejecuta un
programa el código debe ser interpretado. (lentitud).
El compilador lee el programa entero y lo convierte a código objeto, que es una
traducción del código fuente del programa a una forma que puede ser ejecutada
directamente por la computadora. Una vez que el programa está compilado el código
fuente deja de tener sentido durante la ejecución. O sea, que una vez compilado lo único
que hay que hacer es ejecutarlo escribiendo su nombre (mayor rapidez).
En C las mayúsculas y las minúsculas son diferentes.
Todas las palabras claves de C, que son 43 (32 del standard ANSI y 11 de TURBO C),
están en minúscula, por lo tanto, else es palabra clave, mientras que ELSE o Else no lo
son.
Las 32 palabras claves del standard ANSI son:
Auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
Todos los programas en C consisten en una o más funciones estándares o creadas.
La única función que debe estar inevitablemente presente es la llamada main (), ya
que el programa comienza a ejecutarse con la llamada a esta función. Aunque
técnicamente main () no forma parte del lenguaje C (no es palabra clave), se la debe
tratar como si lo fuera. Usar main () como nombre de variable confundiría al
compilador.
En código C bien escrito main () contiene el esbozo de lo que el programa hace; este
esbozo estará compuesto por llamadas a funciones: programación top down).
FORMA DE UN PROGRAMA EN C

Un programa en C, cualquiera sea su tamaño, está formado por funciones y variables.

Variables: almacenan los valores utilizados durante los cálculos.

Funciones: contienen proposiciones que indican las operaciones de cálculo que se van a

realizar, normalmente se les puede dar cualquier nombre, excepto la función main (),

que como ya dijimos debe estar en todo programa y es la primera en ejecutarse.

Ejemplo:
#include <stdio.h> Indica al compilador que debe incluir información acerca de la biblioteca
estándar de E/S (Standard InputOutput).
/* muestra la Cualquier carácter entre/* y */ es ignorado por el compilador y es tratado
suma de 2 números */ como un comentario.
int main () Define la función main (), que es la función principal del programa, está
seguida por un par de paréntesis vacíos, lo que significa que no hay
transferencia de argumentos. En otras funciones entre los paréntesis se
coloca la lista de argumentos que transfieren valores entre la función que
llama y la función llamada.
{ Las proposiciones de main () o de cualquier otra función van entre llaves {}
int a, b, c; En C se deben declarar todas las variables antes de su uso, al principio de
la función y antes de cualquier proposición ejecutable. Una declaración
está formada por un nombre de tipo y una lista de variables.

a = 10; proposición de asignación, inicializa las variables. Cada proposición


b = 15; individual termina con “;”.
c = a + b; se asigna a la variable c el resultado de una operación aritmética.

printf (“la suma es c = %d \n”, main llama a la función de biblioteca printf con e l argumento:
c); (8) (“la suma es c = %d\n”, c)
} \n representa el carácter nuevo línea y hace avanzar la impresión al
margen izquierdo de la siguiente línea,
printf no proporciona una nueva línea automáticamente (\n representa un
solo carácter).
Una secuencia de caracteres entre comillas dobles se llama cadena de
caracteres o constante de cadena.
CONSIDERACIONES AL ESCRIBIR UN PROGRAMA

• Utilizar comentarios
• Elegir nombres de variables con significado
• Utilizar líneas en blanco para separar las distintas secciones de la función
• Espacios en blanco entre los operadores
• Utilizar sangrado
• Mantener una línea con el posicionamiento de las llaves
• Tener en cuenta que x y X son dos caracteres distintos, que la mayor parte del
programa se escribe en minúscula de imprenta y se usa la mayúscula de imprenta para
escribir nombres de constantes
• Escribir una sentencia por línea
• C averigua dónde termina una sentencia y comienza la siguiente por medio de los
puntos y coma introducidos.
EL MODELO DE COMPILACIÓN DE C

CODIGO FUENTE

PREPROCESADOR

El compilador de C traduce el código fuente en código


de ensamblador. El código fuente es recibido del
preprocesador
COMPILADOR

CODIGO ENSAMBLADOR

ENSAMBLADOR El ensamblador crea a partir del código fuente los archivos objeto

LIBRERIAS CODIGO OBJETO


Si algún archivo fuente hace referencia a funciones de una biblioteca o
funciones que están definidas en otros archivos fuentes, el enlazador
ENLAZADOR
combina estas funciones con main () para crear un archivo ejecutable.
Las referencias a variables externas son resueltas en esta etapa

CODIGO EJECUTABLE
Etapas que cubre el compilador para obtener el código ejecutable.
EL PREPROCESADOR
El preprocesador acepta el código fuente como entrada y es responsable de:
• quitar los comentarios
• interpretar las directivas del preprocesador las cuales inician con #.
DIRECTIVAS DEL PREPROCESADOR
El preprocesamiento es el primer paso en la etapa de compilación de un programa.
El preprocesador tiene más o menos su propio lenguaje el cual puede ser una
herramienta muy poderosa para el programador.
Todas las directivas del preprocesador o comandos inician con un #.
Las ventajas que tiene usar el preprocesador son:
• los programas son más fáciles de desarrollar,
• son más fáciles de leer,
• son más fáciles de modificar
• y el código de C es más transportable entre diferentes arquitecturas de máquinas.
#define
La directiva #define se usa para definir constantes simbólicas o realizar sustitución de
macros. Su formato es el siguiente:
#define <nombre de macro> <nombre de reemplazo>
Por ejemplo:
#define FALSO 0
#define VERDADERO !FALSO
El preprocesador también permite configurar el lenguaje. Por ejemplo, se pueden
cambiar los delimitadores de bloque de código {...} por otros delimitadores inventados
por el programador como inicio
... fin haciendo:
#define inicio {
#define fin}
Por ejemplo:
#define MIN (a, b) (a < b)? a: b
main ()
{
int x=10, y=20;
printf ("EL mínimo es %d\n", MIN (x, y));
}
Cuando se compila este programa, el compilador sustituirá la expresión definida
por MIN (a, b), reemplazando (a, b) por x e y que son los operandos reales del
programa. Así después de que el compilador hace la sustitución, la sentencia
printf será ésta:
printf ("El mínimo es %d\n", (x < y)? x: y);
#include

El nombre del archivo fuente que se incluirá se debe encerrar entre comillas dobles
“…” o entre los signos menor que y mayor que < … >.
Por ejemplo:
#include <archivo>
#include "archivo"
Cuando se indica <archivo> el preprocesador busca el archivo especificado solo en el
directorio establecido para contener los archivos de inclusión.
Si se usa la forma "archivo" el preprocesador busca primero en el directorio actual, es
decir, donde el programa está siendo ejecutado.
Los archivos de inclusión usualmente contienen los prototipos de las funciones y las
declaraciones de los archivos cabecera (header files) y no tienen código de C
(algoritmos).
Librería
El lenguaje C provee de una gran cantidad de funciones ya codificadas para que el
programador las utilice directamente. Este conjunto de funciones recibe el nombre de
librería. La librería es en esencia un conjunto de módulos objeto que han sido
reunidos en un único archivo (con la extensión LIB). El enlazador extrae de este gran
depósito de código objeto aquellas funciones que
realmente han sido usadas por el programador en su código fuente. Las
declaraciones de estas funciones de
librería están disponibles en varios archivos de cabecera, provistos por el C. Por lo
tanto, para utilizar
funciones de librería, el programador sólo tiene que incluir el archivo de cabecera
correspondiente y dejar al enlazador la tarea de hallar el código de las funciones en
los archivos de librería.
NOMBRES DE IDENTIFICADORES
Se conocen como identificadores los nombres usados para referenciar las variables,
las funciones, las etiquetas y otros objetos definidos por el usuario.
Las reglas a tener en cuenta para los nombres de los identificadores son:
• Puede estar formado por letras mayúsculas, letras minúsculas, dígitos y el carácter
de subrayado ‘_’,
• El primer carácter no puede ser un dígito, y tampoco conviene que sea el carácter
de subrayado ‘_’, puesto que las rutinas de biblioteca con frecuencia usan tales
nombres. Por lo tanto, conviene que el primer carácter sea una letra.
• Su longitud puede variar entre 1 y 32 caracteres.
• Es conveniente elegir nombres que estén relacionados con el propósito de la
variable y que no sea probable confundirlos tipográficamente.
• No debe coincidir con ninguna palabra clave.
• No debe coincidir con el nombre de ninguna función escrita por el usuario o que se
encuentre en la biblioteca C.
• Se acostumbra usar minúsculas para nombres de variables y mayúsculas para
nombres de constantes simbólicas
Los siguientes son ejemplos de nombres de identificadores:
Correctos Incorrectos
cont 1cont
prueba_1 hola!
acum12 acum-12
NUM_3 NUM-3
N123 N*123
TIPOS DE DATOS

En C las variables se corresponden con una posición n de memoria y poseen:


un nombre que las identifica y permite así, referirse al contenido de una dirección
particular de memoria y un tipo que las describe, para interpretar el valor contenido en
esa dirección. Existen cuatro tipos de datos básicos en C:

El C proporciona además un tipo de dato de propósito especial cuyo significado es


“sin valor” y cuya palabra clave es void. No existen variables de tipo void.
Sirve para especificar que una función no devuelve ningún valor, o bien, para
declarar explícitamente una función sin parámetros
MODIFICADORES DE TIPO

Los tipos de datos básicos pueden estar precedidos por modificadores que alteran el
significado del tipo base para que se ajuste más precisamente a cada necesidad.
Los modificadores de tipo que existen en C son:
short: reduce a la mitad la longitud de almacenamiento
long: duplica la longitud de almacenamiento
unsigned:número sin signo (siempre positivo)
signed:número con signo (positivo o negativo)
VARIABLES

En C todas las variables deben declararse antes de su uso, generalmente al principio


de la función y antes de cualquier proposición ejecutable. Al declarar una variable se
le está especificando:
• al programa, cómo debe interpretar los contenidos de la memoria, y por lo tanto se
establece cuánta necesita.
• al compilador, el significado de los símbolos de operación que se le apliquen a los
valores contenidos en esas direcciones de memoria.
La declaración de variables se hace por medio de una sentencia que tiene el siguiente
formato: tipo lista_de_variables dónde, tipo debe ser un tipo de datos válido de C y
la lista_de_variables puede consistir en uno o más nombres de variables separados
por comas.
Ejemplos: int i, j, k; unsigned suma; char a, b, c; double prom1;
INICIALIZACIÓN DE VARIABLES

Inicializar significa especificar un valor de comienzo.


Para aquellas que no se inicialicen se debe asumir que contienen valores
desconocidos, “basura”, porque si bien hay algunos compiladores que inicializan
automáticamente a cero, no conviene tomarlo como algo seguro (globales a 0, locales
con basura).
La inicialización de cualquier variable se realiza mediante la asignación de un valor
constante que puede realizarse en la sentencia de declaración o en una sentencia por
separado. El formato general de la inicialización es:
La ventaja de inicializar en la declaración en lugar de usar una sentencia de asignación
separada está en que el compilador producirá un código más rápido.
Ejemplos:
int cant = 97;
char c = ‘a’;
int x = 0, y = 0; o bien: int x, y; o bien: int x, y;
x = 0; x = y = 0;
y = 0;

VARIABLES LOCALES Y GLOBALES

Según el lugar dónde se declaran las variables se clasifican en distintos tipos:


Variables Locales
También llamadas privadas o automáticas:
• Se declaran dentro de una función o de un bloque de código.
• Sólo pueden ser referenciadas por sentencias que estén dentro de esa función o de
ese bloque de código, ya que fuera de los mismos no se las conoce.
• Sólo existen mientras se está ejecutando la función o el bloque de código en el que
están declaradas. Se crea cuando se llama a dicha función o se entra a dicho bloque y
se destruye cuando se sale de ellos, por lo tanto, no conservan los valores entre
llamadas.
• Su nombre puede ser usado por otras funciones
Ejemplos

:
{
func1() int t;
{ if (t > 0)
int x;
x = 10; {
. char s; /* esta existe únicamente en este bloque */ }
.
} /* aquí no se conoce a la variable s */
func2() }
{
int x;
x = 35;
·
La variable s se define dentro de un bloque de código,
·
fuera de él la variable s es desconocida. Este tipo de
}
variables se conocen como locales a bloque.

La variable entera x se define dos veces, una


vez en func1() y otra en func2(), pero una no
tiene relación con la otra, ya que cada x sólo
es conocida en la propia función en la que fue
declarada.
Variables Globales

Se declaran fuera de todas las


#include <stdio.h>
funciones. int var; /* var es global */
void f2()
{
• Son conocidas a lo largo de todo el int x, var; /* var es local */
var = 34;
programa y por lo tanto se pueden x = var * 2;
printf ("x = %d\n", x); /* imprimirá 68 */
usar en cualquier parte del código }
void f1()
• Mantienen su valor durante toda la {
int h;
h = var;
ejecución del programa. f2();
printf ("var es %d\n", var); /* imprimirá 10 */
• Si una variable local y una variable }

global tienen el mismo nombre, toda


int main( )
referencia a ese nombre de variable {
var = 10;
f1();
dentro de la función dónde se ha }

declarado la variable local se refiere a


ésta y no tiene efecto sobre la variable
global.
Las variables globales son muy útiles cuando muchas funciones del programa usan
los mismos datos, sin embargo, se debe evitar el uso innecesario de variables
globales por las siguientes 3 razones:
* las variables globales usan memoria todo el tiempo que el programa está en
ejecución, no sólo cuando se necesitan (importante si la memoria es un recurso
escaso).
* usar una variable global dónde podría ir una local hace a la función menos
general, ya que depende de algo que debe estar definido fuera de ella.
* usar muchas variables globales puede acarrear problemas de programación
(especialmente en programas grandes) cuando se modifica el valor en algún lugar
del programa.
CONSTANTES
Declarar una constante es parecido a declarar una variable, excepto que el valor
no puede ser cambiado. La palabra clave const se usa para declarar una constante,
como se muestra a continuación:
const int a = 1;
• Se puede usar const antes o después del tipo.
• Es usual inicializar una constante con un valor, ya que no puede ser cambiada
de alguna otra forma.
La directiva del preprocesador #define es un método más flexible para definir
constantes en un programa, a las constantes así definidas se las denomina
constantes simbólicas.
Frecuentemente se ve la declaración const en los parámetros de una función. Lo
anterior simplemente indica que la función no cambiará el valor del parámetro.
Por ejemplo, la siguiente función usa este concepto:
char *strcpy (char *dest, const char *orig);
El segundo argumento orig es una cadena de C que no será alterada, cuando se
use la función de la biblioteca para copiar cadenas.

CONSTANTES NUMÉRICAS

Pueden ser enteras (contienen un número entero) o de coma flotante (contienen un


número en base 10 que contiene un punto decimal o un exponente o ambos).
Ejemplos de Constantes:
Enteras de Coma Flotante
5280 0.2
32767 1.
0 2e-8
743 12.3e-5
CONSTANTES NO NUMÉRICAS
Pueden ser de 2 tipos:
• de carácter: es un carácter delimitado entre comillas simples. El valor de una
constante de carácter es el número correspondiente al código del procesador
(generalmente el ASCII). Hay algunos caracteres no imprimibles que se representan
como constantes de carácter mediante una secuencia de escape que aparece como 2
caracteres, pero en realidad son sólo uno (‘\n’, ‘\0’, etc.).
• cadena de caracteres: es una secuencia de ninguno, uno o más caracteres encerrada
entre comillas dobles. El compilador ubica un carácter nulo (‘\0’) al final de cada
cadena para que los programas puedan encontrar el final. Técnicamente una cadena
de caracteres es un vector cuyos elementos son caracteres.
NOTA: no es lo mismo ‘x’ que “x”; en el prien el primer caso se trata de un único
carácter, x, cuyo valor es el que le corresponde en el conjunto de caracteres del
procesador, y en el segundo caso se trata de una cadena que tiene 2 caracteres, una x y
un \0.
CÓDIGOS DE BARRA INVERTIDA
Son constantes de carácter que se utilizan para representar caracteres que son
imposibles de introducir desde el teclado. Se utilizan igual que las demás constantes
de carácter, o sea, pueden asignarse a una variable o bien utilizarlas dentro de una
cadena de caracteres; (c = ‘\t’, “error\n”).
OPERADORES

El C define muchos más operadores que otros lenguajes.


Combinados con distintos operandos pueden generar expresiones que siguen las reglas
del álgebra, pudiendo los paréntesis alterar el orden de evaluación que le
Correspondería por la prioridad propia de cada operador.

• ARITMÉTICOS

Suma ................ +
Resta ................ –
Multiplicación ... *
División ............ /
Módulo ............. % (resto de la división entera- no puede aplicarse a operandos float
o double)
Incremento…… ++
Decremento…. --
INCREMENTO Y DECREMENTO

C contiene dos operadores muy útiles que no existen generalmente en otros lenguajes.
Son el incremento y el decremento, ++ y --.
++ ............. aumenta en 1 el valor del operando --
-- ............ disminuye en 1 el valor del operando
El formato de la expresión que resulta de aplicar el operador incremento o decremento
es:

1º se modifica en 1 el valor de la variable


OPERADOR VARIABLE
2º la variable usa su nuevo valor

1° la variable usa su valor


VARIABLE OPERADOR 2º se modifica en 1 el valor de la variable
Ejemplos:
++n equivale a n=n+1
z = b++ equivale a z=b y luego b = b + 1
x = --r equivale a r = r – 1 y luego x = r

Con éstos se pueden generar expresiones aritméticas cuyos operandos pueden ser
constantes, variables u otro tipo de expresiones.
• Cuando en una expresión se combinan distintos tipos de operadores, la
prioridad en la evaluación es:
1º ++ -- - (monario)
2º */ %
3º +-
Cuando en una expresión se combinan operadores de igual prioridad, la evaluación
es de izquierda a derecha. Los paréntesis alteran este orden de evaluación.
• RELACIONALES

Mayor ................ >


Menor ................ <
Mayor o igual …. >=
Menor o igual …. <=
Igual ................... = =
Distinto .............. !=
Con éstos se pueden generar expresiones relacionales cuyos operandos pueden ser
constantes,variables u otro tipo de expresiones.
• Cuando en una expresión se combinan distintos tipos de operadores, la prioridad en
la evaluación es:
1º > <>=<=
2º == !=
• Cuando en una expresión se combinan operadores de igual prioridad, la evaluación
es de izquierda a derecha. Los paréntesis alteran este orden de evaluación.
• El resultado de una operación relacional es un número entero:
1 para verdadero y 0 para falso.
• LOGICOS

Conjunción (y) &&


Opción (o) ....................... ||
Negación (no) ................. !
Con éstos se pueden generar expresiones lógicas cuyos operandos pueden ser
constantes, variables u otro tipo de expresiones.
• Cuando en una expresión se combinan distintos tipos de operadores, la prioridad
en la evaluación es:
1º !
2º &&
3º ||
• Cuando en una expresión se combinan operadores de igual prioridad, la evaluación
es de izquierda a derecha. Los paréntesis alteran este orden de evaluación.
• El resultado de una operación lógica es un número entero:
1 para verdadero y 0 para falso
En C, verdadero es cualquier valor distinto de 0 y falso es 0
• LA COMA COMO OPERADOR ( , )

Como operador la coma encadena varias expresiones, su función es la de indicarle


al compilador la sucesión de cosas que debe hacer (hacer esto y esto y esto).
Cuando se usa en la parte derecha de una sentencia de asignación, el valor
asignado es el valor de la última expresión de la lista separada por comas.
Ejemplo:
x = (y = 3, y + 1); ===> x = 4
y = 10;
x = (y = y – 5, 25 / y); ===> x = 5
los () son necesario por la precedencia: = >,
• OPERADOR DE ASIGNACIÓN (=)

Provoca el almacenamiento de un valor en una variable. El formato general resulta:


variable operador valor
dónde valor puede ser una constante, otra variable (ya inicializada), o una
expresión.
Como en otros lenguajes la operación de asignación es una sentencia, pero a
diferencia de muchos
de ellos se trata, en C, de un operador muy potente.
Variaciones en la sentencia de asignación:
• En la inicialización puede asignársele el mismo valor a distintas variables, no así
en la declaración,
la forma sería: variable1 = variable2 = variable3 = valor
• Permite usar abreviaturas cuando una expresión aritmética involucra a la misma
variable de ambos lados del signo igual con la forma:
variable = variable operador expresión

y el operador involucrado es: +, -, *, / o %; puede reemplazarse por:

variable operador = expresión

• OPERADOR CONDICIONAL ( ?: )

C contiene un operador muy potente y conveniente que puede usarse para


sustituir ciertas sentencias de la forma if ... else. El operador ternario ?: toma la
forma general:
Exp1 ? Exp2 : Exp3;

El operador ?: actúa de la siguiente manera: evalúaExp1, si es cierta evalúa Exp2 y


toma ese valor para la expresión.
Si Exp1 es falsa evalúa Exp3 tomando su valor para la expresión.
y = x > 9 ? 100 : 200
en este caso si x es mayor que 9, a y se le asigna el valor 100, de lo contrario a y se le
asigna el valor 200

• EL OPERADOR sizeof

El operador de tiempo de compilación sizeof es un operador monario que


devuelve la longitud, en bytes, de la variable o del especificador de tipo entre
paréntesis al que precede.
Ejemplo: int main ()
{ Nota: para calcular el tamaño de un
float f; tipo, el nombre debe ir entre (). No así
printf (“%f\n”, sizeof f);
printf (“%f\n”, sizeof (int));
los nombres de variables
}
EXPRESIONES Y SENTENCIAS

Una expresión representa una unidad de datos simple, tal como un número o un
carácter.
La expresión puede consistir en una entidad simple, como una constante, una variable,
un elemento de un arreglo o una referencia a una función. También puede consistir en
alguna combinación de tales identidades interconectadas por uno o más operadores.
Por ejemplo:
a + b; x = y; c = a + b; x = = y
Una sentencia consiste en una expresión seguida de un punto y coma (;) y hace que la
computadora lleve a cabo alguna acción. La ejecución de la sentencia de expresión hace
que se evalúe la expresión. Algunos ejemplos de sentencias son:
a = 3; ++ i; c = a + b; suma += 10;
CONVERSIÓN DE TIPO DE DATOS

Los operandos de tipos distintos que aparecen en una expresión se convierten a un


mismo tipo en forma automática de acuerdo con ciertas reglas o en forma forzada.
• CONVERSIÓN AUTOMÁTICA DE TIPO IMPLÍCITA
Hay que diferenciar entre el tipo de dato del resultado de una expresión (regla nº 1) y
el tipo de dato con que ese resultado se almacena en la variable (regla nº 2).
Regla nº 1: en una expresión aritmética dónde se vinculan por lo menos 2 operandos,
si estos son de distinto tipo, el compilador C, previo a la resolución de la operación
igualará los tipos de datos convirtiéndolos automáticamente según una escala de
dominio de tipos que podríamos expresar como:
char ---> int ---> float ---> double
Esto implica decir que los char se convierten a int tomando el valor ASCII del carácter
en cuestión, los int se convierten a float y estos a double
Regla nº 2: en una asignación, independientemente de los tipos de datos que
intervienen se almacenará el resultado de la expresión convirtiéndose automáticamente
al tipo de la variable de asignación.
Expresando las asignaciones por su tipo podríamos resumir:
int = char.......... se almacena el código ASCI I del carácter
int = float.......... se almacena como entero truncando los decimales
float = double....... se almacena en simple precisión redondeando los decimales
float = int............. se almacena el valor entero con parte decimal 0
float = char........... se almacena el código ASCII del carácter con su parte decimal 0
char = float........... se almacena el carácter correspondiente truncando los decimales
A partir de acá y dependiendo del tipo de dato con que se haya declarado
la variable res se producirá o no pérdida de información al almacenarse el
resultado de la operación
Otros ejemplos:

• a = 7 + 3.8
1º El resultado es 10.8
2º si a es int se almacena 10
si a es float se almacena 10.800000
si a es char se almacena el carácter “nueva línea”
• a = ‘A’ + 5.0
1º El resultado es 70.0
2º si a es int se almacena 70
si a es float se almacena 70.000000
si a es char se almacena el carácter F
a = ‘A’ + 5.9
1º El resultado es 70.9
2º si a es int se almacena 70
si a es float se almacena 70.900000
si a es char se almacena el carácter F

Nota: cuando una expresión aritmética que se asigna a una variable char da un
resultado mayor que 255 o menor que 0, el carácter que se almacena es el que
corresponde a los 8 bits menos significativos
• CONVERSIÓN FORZADA DE TIPO EXPLÍCITA O MOLDES (CAST )

Si algún operando de una expresión debe ser usado momentáneamente con otro tipo,
distinto al con el que fue declarado o más allá del que adquirió automáticamente de
acuerdo con las reglas anteriores, es posible provocar esa conversión. El operando
será afectado por el nuevo tipo de dato de la siguiente forma:

(nuevo tipo de dato) operando

En el siguiente cuadro se muestra la posible pérdida de información que se puede


producir en las conversiones de tipos más usuales asumiendo palabras de 16 bits
(2 bytes):
TABLA GENERAL DE PRECEDENCIAS

También podría gustarte