Conceptos del lenguaje C y tipos de datos
De Wiki Alfonso Morcuende
Contenido
|
Características del lenguaje C
El lenguaje de programación C ha sido utilizado para el desarrollo de infinidad de herramientas de trabajo (OS, compiladores, procesadores de textos, BB.DD, etc). El lenguaje C se caracteriza por ser un lenguaje de propósito general.
La ventaja más destacable es la transportabilidad o portabilidad, es decir, la posibilidad de utilizarlo tanto en macroordenadores como en mini y microordenadores, lo que le sitúa ente uno de los lenguajes más portables.
Otra característica, relacionada con la anterior es la compatibilidad, que se da cuando el código escrito para una máquina concreta es fácilmente transferible a otro compilador y otra máquina.
Otras características:
- Muy flexible
- Muy apropiado para controlar rutinas hechas en ensamblador
- Permite generar programas de fácil modificación
- Predominante bajo cualquier máquina UNIX
- Muy veloz y potente, lo que permite creación de software efectivo
- Permite una programación estructurada
- Produce programas de código compacto y eficiente
- Es un lenguje de alto nivel y mantiene características de lenguajes de bajo nivel
- Es un lenguaje compilado
- El código se escribe mayoritariamente en minúsculas
Algunas de las desventajas son:
- No dispone de un editor propio para escribir los programas fuentes.
- Aunque no es una desventaja propia del lenguaje C, si no de cualquier lenguaje compilado, las modificaciones sencillas requieren más tiempo en conseguir el fichero ejecutable que el empleado en un lenguaje interpretado.
- La modularidad de C tiende a incrementar el tiempo de compilación
- Poco legible y eminentemente críptico.
Tipos de datos
- Básicos
- Numéricos
- Entero
- int
- Real
- Simple precisión
- float
- Doble precisión
- double
- Simple precisión
- Entero
- Carácter
- char
- Vacio
- void
- Numéricos
- Derivados
- Puntero
- Estructurados
Los datos básicos serán explicados en este tema el resto de tipos de datos se explicaran en temas posteriores.
En el lenguaje C no existe el tipo de dato lógico o booleano, pero el concepto de verdadero se toma con el valor 1 y el falso con el valor 0.
Identificadores
Los identificadores en C son nombres constituidos por una secuencia de letras, dígitos y el carácter subrayado que permiten hacer referencia a funciones, variables, constantes y otros elementos dentro de un programa.
Las reglas para la construcción de un identificador en C son las siguientes:
- Deben comenzar obligatoriamente por un carácter alfabético (a-z, A-Z) o el signo de subrayado (_)
- Siguiendo al primer carácter, pueden ser intercalados caracteres alfabéticos, el signo de subrayado y carácteres numéricos (0-9)
- El número de caracteres utilizados en la construcción del identificador va en función del compilador utilizado
- NO está permitido el uso de blancos intermedios
- Las letras mayúsculas y minúsculas son interpretadas como caracteres diferentes
Ejemplos
Longitud = 2 * PI * radio; Sup_Circulo(diametro);
Los siguientes ejemplos completos de programas en C muestran la construcción y uso de identificadores.
#include <studio.h>
main()
{
int var;
int Var;
int result;
var = Var = 3;
result = var + 2 * Var;
printf("\n El resultado de la operación es %d", result);
}
#include <studio.h>
main()
{
int _Contador, Num15 = 15;
int Suma_Total = 0;
int Resul_Total;
for(_Contador = 1; _Contador < Num15; _Contador++)
{
Suma_Total = Suma_Total + _Contador;
Resul_Total = Suma_Total;
printf("\n Total = %d", Resul_Total);
}
}
Definición de variables
Definir una variable es reservar el suficiente espacio en la memoria para poder almacenar un valor. Solamente con la definición no se tiene el valor deseado en memoria. Dicho valor se puede asignar por inicialización de la variable o durante la ejecución del programa.
Los sitios donde pueden definirse las variables son: dentro de las funciones (variables locales), fuera de las funciones (variables globales) y en la lista de parámetros de las funciones (parámetros formales).
Formato o sintáxis para la definición de una variable:
<Clase_almacenamiento> <Modificador_tipo> Tipo_dato Nombre_variable; Ejemplo: static long int cantidad;
En una sentencia de definición es obligatorio expresar el tipo de dato y el nombre de la variable, mientras que la clase de almacenamiento y el modificador de tipo son opcionales.
- Clase de almacenamiento: Especifica la forma en que se almacenará la variable. Existen cuatro especificadores para determinar la clase de almacenamiento: auto, extern, static y register. Por defecto de usa auto
- Modificador de tipo: Cambia el significado de un tipo básico, afectando esencialmente al signo y al tamaño reservado en memoria. Existen cuatro modificadores de tipo: signed, unsigned, short y long. Por defecto se usa signed
- Tipo de dato: Es uno de los tipos de datos básicos ya vistos
- Nombre de la variable: es un identificador ajustado a las normas ya explicadas.
En una sentencia de definición se puede definir más de una variable en forma de lista, separadas por comas con la condición de que toas las variables sean del mismo tipo.
Ejemplo
int importe, suma, total, media;
Las variables pueden ser inicializadas lo que significa que puede asignarse un valor en el momento de su definición.
Ejemplo
int procentaje = 0; float precio = 250.5, total; char letra, carac = 'A';
Modificadores de acceso
Los modificadoes de acceso pueden preceder a la definición de una variable y son dos const y volatile. Se utilizan para controlar la forma en la que se odifican las variables.
Modificador const
Especifica que el valor de una variable no puede ser modificado en la ejecución de un programa. Actúa como una constante, lo cual permite su empleo en múltiples sitios del programa mediante su identificador.
const int porcen = 5; /* Definición e inicialización */ precio = base * (1 + porcen/100); /* Uso de la variable */ porcen = 3; /* Sentencia errónea no permitida por el compilador */
Si se quiere modificar el valor hay que modificar y volver a definir la variable, inicializándola con el nuevo valor.
Modificador volatile
Indica al compilador que el valor de una variable puede ser modificado
Tipos de datos básicos
Los tipos de datos en C son:
- Entero
- int
- Real de simple precisión
- float
- Real de doble precisión
- double
- Caracte
- char
- Vacio
- void
Tipos de dato entero
Se definen con la palabra clave int y se utilizan para representar números enteros con signo.
- Para procesadores de 16 bits el rango es de: -32768 a 32767
- Para procesadores de 32 bits el rango es de: -21474883648 a 2147483647
a) Definición de variables
Formato: int Lista_variables; Ejemplo: int num, conmutador, indicador;
b) Empleo de constantes
Las constantes int están constituidas por una serie de dígitos precedidos o no por un signo + o -. En la constante positiva no es necesario el uso de +. Los dígitos pueden expresarse en sistema digital, octac y hexadecimal. Para expresar una constante en octal el primer dígito debe de ser un 0. Para expresarla en hexadecimal la cifra debe de estar precedida con 0X.
Ejemplos: Sistema de numeración decimal: -52, 3508 Sistema Octal: -063, 0465 Sistema Hexadecimal: -0X1A, 0X24
Para el tipo de dato int se pueden usar los siguientes modificadores:
- short
- long
- signed
- unsigned
Modificador short
Se emplea para la representación de números enteros pequeños con signo. Su rango de representación es de -32768 a 32767
a) Definición de variables
Formato: short int Lista_variables; short Lista_variables; /* Las dos son válidas y equivalentes */ Ejemplos: short int a, b; short c, d;
b) Empleo de constantes
No existen constantes del tipo short int pues explicitamente las constantes son de tipo int.
Modificador long
Se emplea para números enteros más grandes de lo permitido por un int. Su rango de valores es de -2147483648 a 2147483647, por lo que procesadores de 16 bits el rango de representación y el tamaño aumentas en relación con un int, mientras que en un procesador de 32 bits el rangoy el tamaño son iguales que en un int.
a) Definición de variables
Formato: long int Lista_variables; long Lista_variables; /* Las dos son válidas y equivalentes */ Ejemplos: long int a, b; long c, d;
b) Empleo de constantes
Si se quiere especificar que una constante entera es de tipo long, cuando su valor está dentro del rango de un int, se le debe posponer la letra L
Ejemplo: -452L, 92L, 32270518
Modificador signed
Se emplea para numeros enteros con signo, es el modificador de tipo por defecto para el tipo de dato int.
Modificador unsigned
Se emplea para números enteros sin signo, por lo que al eliminar el signo se gana un bit aumentando el rango de balores de 0 a 65535 en procesadores de 16 bits y de 0 a 4294967295 en procesadores de 32 bits.
a) Definición de variables
Formato: unsigned int Lista_variables; unsigned Lista_variables; /* Las dos son válidas y equivalentes */ Ejemplos: unsigned int a, b; unsigned c, d;
b) Empleo de constantes
Se puede especificar que una constante es de tipo unsigned posponiéndole la letra U
Ejemplo: 4275U
Se puede combinar el modificador unsigned con los modificadores short y long, siendo el más empleado el unsigned long que permite el máximo rango de representación para un número entero sin signo.
Tipo de dato real
Se define con las palabras clave float para punto flotante de simple precisión y double para punto flotante de doble precisión y se utiliza para representar números reales.
a) Definición de variables
Formato: float Lista_variables; /* Para simple precisión */ double Lista_variables; /* Para doble precisión */ Ejemplos: float superficie, importe; double total, longitud;
b) Empleo de constantes
Se emplean dos notoaciones:
- Notación decimal -1.025, 2473.85
- Notación científica 24.5E-3, 0.75E2
c) Modificador de tipo
En algunos compiladores se tiene el modificador long para el tipo double, lo que permite una alta precisión.
Tipos de dato caracter
Se define con la palabra clave char y se utiliza para representar un caracter perteneciente a un determinado código. Los códigos más utilizados son el ASCII de 8 bits y el EBCDIC. Internamente el tipo de dato char es un número entero. Puede llevar asociados los modificadores del tipo signed o unsigned.
a) Definición de variables
Formato: char Lista_variables; /* Para simple precisión */ Ejemplos: char digito, inicial, carac_alfa;
b) Empleo de constantes
La forma más normal de expresar una constante de tipo char es delimitarla mediante el uso de comillas simples.
Ejemplo: 'a', 'M', '?', '3'
Con las constantes de tipo char se pueden realizar operaciones aritméticas pues internamente se opera con los números correspondientes a su código.
Ejemplo: 'C' + '4' se corresponde con 67 + 52 = 119 que es el caracter 'W' 'C' + 4 se corresponde con 67 + 4 = 71 que es el caracter 'G'
Con el fin de poder representar caracteres no imprimibles, se puede utilizar otra forma de representación, cuyo formato es \ddd. Hay dos formas de emplear esta nomenclatura:
1. Representando el carácte correspondiente en octal o en hexadecimal. 2. Utilizando símbolos especiales en las secuencias de escape.
\a pitido \b retroceso \n nueva línea \r retorno de carro \t tabulador horizontal \' comilla simple \" comilla doble
Tipos de dato vacio
Se define con la palabra clave void que significa que el dato es nulo, por lo que no ocupa espacio en memoria y por tanto su tamaño en bytes es cero.
Se utiliza para:
- Definir un puntero genérico (no se conoce el tipo de dato de la variable que hay que apuntar)
- Especificar que una función no retorna de forma explícita ningún valor.
- Declarar que una función no utiliza parámetros
Ejemplos: void *apunt; /* Puntero genérico */ void Escribe_Puntos(35); /* Función que no retorna ningún valor */ int Verificar_Error(void); /* Declara una función sin parámetros */
Operadores
Los operadores en C se pueden clasificar de la siguiente forma:
- Indicadores de expresión
- Aritméticos
- Relacionales y lógicos
- Para tratamiento de bits
- Para punteros
- Para estructuras
- Asignación
- Coma
- Tamaño
- Molde
- Condicional
Operadores indicadores de expresión
Se utilizan para indicar prioridad o una determinada misión en las expresiones. Los operadores son:
- Parentésis (), que puede tener dos significados:
- Determinar la máxima prioridad en una expresión, comenzando por los más internos
(a / (b + c)) / (m + n) * (p + q)
- Para encerrar los parámetros de una función
float Importe(sueldo, descuento) int Figura(void)
- Determinar la máxima prioridad en una expresión, comenzando por los más internos
- Corchetes[], que sirven para encerrar los índices de las tablas
empleado[20];
Operadores aritméticos
Se utilizan para efectuar operaciones aritméticas. Se clasifican en:
- Monarios
- Signo negativo -
- Incremento ++
- Decremento --
- Binarios
- Suma +
- Resta -
- Multiplicación *
- División /
- Modulo %
a) Operador de signo negativo - Se utiliza para indicar signo menos de un operando numérico. Con este símbolo se puede cambiar de signo a una variable, pues equivale a multiplicar por -1.
nume = -nume; equivale a: nume = (-1) * nume;
b) Operador Incremento ++ Se utiliza para aumentar el valor de su operando en 1. La expresión ++c equivale a c = c + 1. El operador ++ puede ir como prefijo ++c o como sufijo c++. La diferencia estriba en el momento en que se efectúa la operación aritmética.
a = 5; b = ++a; Los valores de las variables quedan como a=6, b=6 a = 5; b = a++; Los valores de las variables quedan como a=6, b=5
Este operador es muy útil cuando se emplea para el incremento de contadores.
c) Operador Decremento -- Se utiliza para disminuir el valor de un operando en 1. La operación -c equivale a c = c - 1. Puede ir como prefijo o como dufijo, actuando de forma similar al operador ++.
e) Operadores multiplicación *, division / y módulo % El operador * realiza el producto entre dos operandos.
a * b
El operador / realiza la división obteniendo el cociente de la misma. En el lenguaje C no existe ningún símbolo para la división entera, obteniéndose el cociente de una división entera cuando los dos operandos son valores numéricos enteros. Si un operando es numérico real la división será real.
54/4 El resultado es 13 54.4/4 El resultado es 13.6
El operador % permite obtener el resto de una división entera. Por tanto los dos operandos deben de ser enteros.
num % 2; Suponiendo que num sea un número entero, si num es par el resultado de la operación será 0.
f) Prioridad entre operadores aritméticos
- -, ++, -- Signo menos, incremento, decremento
- *, /, % Multiplicación, división, módulo
- +, - Suma, resta
Operadores relacionales y lógicos
Se utilizan para realizar operaciones lógicas entre operandos, obteniendo como resultado un valor verdadero o falso. El C el resultado falso es el valor cero.
- a) Los operadores relacionales son los siguientes
- < Menor que
- <= Menor o igual que
- > Mayor que
- >= Mayor o igual que
- == Igual a
- != distinto de
- b) Los operadores Lógicos son los siguientes
- && Conjunción Y
- || Disyunción O
- ! Negación NO
- c) Prioridad entre operadores relacionales y lógicos
- ! Negación lógica
- > >= < <= Mayor, Mayor o igual, Menor, Menor o igual
- == != Igual a, Distinto de
- && Conjunción lógica
- || Disyunción lógica
Operadores para tratamiento de bits
Se utilizan para realizar operaciones a nivel de bit y los operandos deben ser de tipo char o int
Operadores de asignación
Se utilizan para cargar una variable con el valor de una expresión. Pueden ser de dos tipos, simple o compuesto.
El operador de asignación simple utiliza el símbolo = indicando que la variable situada a su izquierda se cargará con el valor resultante de la expresión situada a su derecha.
Variable = Espresión; media = suma / num;
El operador de asignación compuesto utiliza dos símbolos, uno es el de asignación simple y el otro es un símbolo de operación. Los símbolos que se pueden utilizar son: +, -, /, %, <<, >>, &, |
Formato: Variable Símbolo_operación = Expresiónn; La declaración es equivalente a: Variable = Variable Símbolo_operación Expresión; Ejemplo: total /= importe + 100; Equivale a: total = total / (importe + 100);
Operadores coma
Se utiliza para separar dos expresiones dentreo de una expresión total, evaluéndose primero la expresión de la izquierda y convirtiendo la de la derecha en el valor de la expresión total.
Este operador se emplea esencialmente en dos casos:
- Para realizar una asignación de una expresión, que previamente requiere otra expresión.
Ejemplo: a = (b = 5, b +2); Equivale a: b = 5; a = b + 2;
- Para realizar varias operaciones dentro de la condición de un bucle
Ejemplo: for( i=0, k=15; i<k; k-) Equivalente a: i=0; for(k=15; i<k; k-)
Operadores de tamaño
Se utiliza para obtener la longitud en bytes de una variable o de un especificador de un tipo de dato. Emplea la palabra resrvada sizeof. Cuando se emplea para un especificador de tipo dato, éste debe ir entre paréntesis y cuando se emplea para una variable, puede it o no con paréntesis.
sizeof (int) /* Obtiene la longitud en bytes del tipo de dato 'int' */ sizeof cant /* Obtiene la longitud en bytes de la variable 'cant' */
El empleo del operador sizeof facilita la portabilidad del código a otros ordenadores.
Operadores de molde
Se utiliza para convertir el tipo de dato de un operando utilizando una expresión. Se expresa precediendo al operando con el tipo de dato deseado encerrado entre paréntesis. El tipo de dato del operando no varía en su definición, únicamente se convierte para la expresión en la que se utiliza el moldeado.
Formato: (Tipo) Operando; Ejemplo: float a = 9.25; int b; b= (int) a / 2;
El valor de b después de la asignación es 4, por haberse realizado la división entera siendo los dos operando de la división del tipo numérico entero (a sigue siendo float pero en la expresión se toma con el valor entero 9 y la división se realiza como entera).
Operadores condicional
Se utiliza para realizar una operación alternativa mediante una condición. Rerquiere de tres operandos (ternario) que pueden ser tres expresiones. Se emplean los símbolos ? y :
Formato: Expresión1 ? Expresion2 : Expresion3;
Se evalúa la Expresión1, si el resultado es verdadero se evalua la Expresión2 y su resultado se toma como valor de la expresión total, por el contrario si el resultado de la Expresión1 es falso, se toma como resultado total el resultado de la Expresión3.
Ejemplo: Se trata de asignar a resul el mayor valor entre a o b. resul = (a > b) ? a : b; Su equivalente mediante una sentencia condicional es: if(a > b) resul = a; else resul = b;
Expresiones
Las expresiones son un conjunto de operandos (constantes, variables y valores retornados por funciones) y operadores. Después de efectuar en la expresión las operaciones indicadas por los operadores se obtiene un determinado valor, que se corresponderá con uno de los tipos básicos de los datos en C.
Conversiones de tipo en las expresiones
Dos tipos de conversiones:
- a) conversión de tipo en la evaluación de una expresión.
Se aplican unas normas de promoción del tipo de dato cuando se relaciona con otro tipo de dato de mayor nivel, teniendo en cuenta que es una promoción temporal, de forma que se mantien el tipo de dato con que se ha definido la variable.
-
Si existe un molde de tipo para un determinado operando, este se convierte en el tipo de dato especificado por el operador.
Ejemplo: float suma, num; (int) suma / (int) num;
-
Se realiza una conversión automática para los tipos de datos float que se convierten en double y para los tipos de datos char y short int que se convierten en int.
Ejemplo: float a + float b; Se convierten automáticamente en double a + double b; char a + short b; Se convierten automáticamente en int a + int b;
-
Para los demás tipos de datos se realiza la promoción siguiente:
- Cuando un operando es long double el otro se conviete en long double
- Cuando un operando es double el otro se conviete en double
- Cuando un operando es long el otro se conviete en long
- Cuando un operando es unsigned el otro se conviete en unsigned
- En los demás casos se convieerte en int
-
Si existe un molde de tipo para un determinado operando, este se convierte en el tipo de dato especificado por el operador.
- b) Conversión de tipo en las asignaciones La expresión situada a la derecha de la asignación se convierte al tipo de la variable situada a la izquierda de la misma.

