02 Identificadores y Operadores
02 Identificadores y Operadores
Una de las innovaciones que se introdujeron con la aparición de los primeros lenguajes
de programación de alto nivel fue la implementación de los denominados
"identificadores".
La memoria del computador está compuesta por una serie de celdas que sirven para
almacenar información. Cada una de estas celdas se identifica por un número al que se
denomina "dirección de memoria". Cada vez que en un programa se tuviera que guardar
un dato, se deberá indicar en qué dirección de memoria se va a colocar. Si luego
queremos utilizar ese dato para realizar alguna operación, debemos recordar en qué
posición de memoria se colocó para poder extraerlo y utilizarlo. Si por otro lado, en
ese programa se quisiera ejecutar una porción de código ubicado en alguna parte de la
memoria, tendríamos que hacerlo indicando la dirección de memoria donde se ubica.
Como puede apreciar, elaborar un programa, en esas condiciones, sería una tarea muy
complicada.
Afortunadamente los lenguajes de programación de alto nivel proporcionan una
herramienta que permite que esta tarea sea mucho más simple, esta herramienta se
denomina "Identificador".
Un identificador es un nombre, que define el programador, que sirve para denotar
ciertos elementos de un programa. Estos elementos pueden ser las denominadas
variables, constantes y funciones (elementos que se tratarán más adelante). Cuando se
ejecuta el programa, el sistema relaciona estos nombres con alguna dirección de
memoria. De este modo, a la hora de programar, ya no se requiere recordar posiciones
de memoria sino los nombres dados a estas posiciones de memoria.
Reglas de Formación
1/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
Ejemplo de identificadores inválidos son:
año
425x
No hay datos
α-β
Tecla↵
Tres-Cuatro
TIPOS DE DATOS
unsigned char 8 0 a 255 (Se emplea para representar números pequeños sin signo y
caracteres de la tabla ASCII extendida)
EXPRESIONES
VALORES CONSTANTES
Los valores constantes están referidos a la forma cómo podemos escribir un valor
según el tipo de dato al que queremos referirnos. A continuación se muestra estas
formas:
Un tipo int se debe escribir como: 357, 1243, 38, etc.
Valores de tipo float como: 18.74, 3.94e-3, 1.6523E85, etc.
Un valor octal como: 0473, 0478
Un valor hexadecimal como: 0x4AB, 0x4AB
Un valor de tipo char como: 97 ó 'a' (ambos valores son lo mismo, el caracter a va entre apóstrofos)
2/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
También se pueden representar los caracteres así:
'\a' carácter de alarma (Bell)
'\n' nueva línea (line feed)
'\t' tabulador horizontal
'\\' diagonal invertido (back slash)
'\?' signo de interrogación
'\'' apóstrofe
'\"' comillas
VARIABLES Y CONSTANTES
VARIABLES:
CONSTANTES:
Una constante es básicamente lo mismo que una variable, con la única diferencia que la
constante debe ser inicializada en su definición y este valor no se podrá modificar a lo
largo del programa. Se definen de la siguiente manera:
const double Pi=3.1415926;
const int R = 33;
const char L = 'A';
CONSTANTES SIMBÓLICAS:
3/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
proceso de compilación. Este proceso se denomina pre-compilación. Una constante
simbólica se define mediante la cláusula #define de la siguiente manera:
#define TEXTO_A_BUSCAR texto_de_reemplazo.
Se recomienda que los identificadores que definan constantes simbólicas deban estar
escritos en su totalidad en mayúsculas.
El "TEXTO_A_BUSCAR" debe estar formado por una sola palabra, mientras que el
"texto_de_reemplazo" puede estar formado por varias palabras, pero todo debe
estar en una sola línea.
#include <stdio.h>
#define ENTERO int
#define REAL double
#define PROGRAMA main
#define INICIO {
#define FIN }
#define IMPRIMIR printf
int PROGRAMA (void) INICIO
ENTERO n=50;
REAL f, g;
…
IMPRIMIR ("Hola amigos");
…
FIN
Una constante simbólica muy empleada en C/c++ es EOF (End Of File), definida en
stdio.h y en muchas otras bibliotecas de funciones. Esta constante simbólica es
reemplazada por el pre-procesador por el valor -1, y es usada para detectar el final de
un archivo.
OPERADORES
Los operadores son elementos de enlace en una expresión y nos sirven para realizar
operaciones y obtener un resultado.
A continuación se presentan los distintos operadores que se encuentran en el lenguaje
C/C++. Los operadores se pueden considerar como unarios y binarios, se dice que un
operador es unario cuando se aplica a un solo elemento, será binario cuando se aplica
sobre dos elementos.
OPERADORES ARITMÉTICOS:
OPERADOR SIGNIFICADO
+ Suma
- Resta
* Multiplicación
/ División
% Módulo
4/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
El resultado de una operación depende de los operandos que la componen, si uno de
ellos es de punto flotante, el resultado lo será también, de lo contrario será un
número entero.
Por ejemplo:
3/4 dará como resultado cero (0)
3.0/4 dará como resultado 0.75
3/4.0 dará como resultado 0.75
OPERADORES DE ASIGNACIÓN:
Asignación múltiple:
+= -= *= /= %=
Estos operadores sirven para abreviar las operaciones de asignación en las que la
variable a la que se le está asignado un valor aparece en la expresión de la derecha.
Algunos ejemplos se muestran a continuación:
Expresión Equivale a hacer
a += 5; a = a + 5;
b -= 2 b = b - 2;
c *= 11; c = c * 11;
d /= 7; d = d / 7;
e %= 8; e = e % 8;
5/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
CONVERSIÓN DE TIPOS EN LA ASIGNACIÓN:
Se debe tener mucho cuidado cuando se manejan expresiones que devolverán valores
de un tipo diferente al de la variable que recibe el resultado. El compilador no avisa si
la conversión se va realizar de la manera que uno puede esperar. El ejemplo siguiente
muestra una de estas situaciones.
int a = 527;
char c;
c=a
Si ejecutamos el código, veremos que el valor asignado a la variable c es 15. Luego,
¿cómo un valor como 527 se pudo convertir en 15?
La respuesta es simple, el valor hexadecimal de 527 es 00 00 02 0Fh ya que un entero
se almacena en 4 bytes. Al pasar este valor a una variable como c, que es de tipo char
y por lo tanto se almacenará en un byte, los tres bytes más significativos del valor de
la variable a se perderán, por lo que solo se almacenará en la variable c el byte menos
significativo, que en este caso es 0Fh y que no es otra cosa que el valor 15.
6/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
OPERADORES UNARIOS DE INCREMENTO Y DECREMENTO:
OPERADORES DE RELACIÓN:
Los operadores de relación se aplican, como su nombre lo indica, para relacionar dos
valores. El resultado de esta operación será uno (1) si la relación es correcta y cero
(0) sino lo es.
Operador Significado
== Igual
!= Diferente
> Mayor que
< Menor que
>= Mayor o igual
<= Menor o igual
OPERADORES LÓGICOS:
Los operadores de lógicos se aplican sobre expresiones lógicas. Una expresión lógica,
en C/C++, aquella que devuelva un valor falso (valor cero) o un valor verdadero (valor
7/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
diferente de cero). El resultado de esta operación será uno (1) si la operación es
correcta y cero (0) sino lo es.
Operador Significado
! Not (negación)
&& And (conjunción)
|| Or (disyunción)
OPERADOR CONDICIONAL:
El operador condicional sirve para decidir, entre dos expresiones, qué valor se le
asignación a una variable. Este operador consta de dos símbolos: "?" y ":" y se forma
de la siguiente manera:
Variable = expr1 ? expr2 : expre3
Al evaluarse, si la expr1, da un valor diferente de cero (verdadero) entonces la
expresión condicional devuelve el valor de la expr2, de lo contrario devuelve el valor de
la expr3.
Por ejemplo:
b = a > c ? a + 1 : a - 1;
b = a - 3 ? a : c ;
Una expresión por lo general emplea más de un operador, si ese es el caso, entonces
debemos tener en cuenta en qué orden se aplicarán los operadores, esto debido a que
estos no se evaluarán necesariamente en el orden en se ubican en la expresión.
A continuación se presenta una tabla en la que se muestra el orden de evaluación o la
precedencia de los operadores.
Nivel Operador
1° ( )
2° !, ++, --, +, - (+, - como operadores unarios)
3° *, /, %
4° +, -
5° <, <=, >, >=
6° ==, !=
7° &&
8° ¦¦
9° ? :
10° =, +=, -=, *=, /=
En el caso que dos operadores del mismo nivel estén presentes en una expresión, se
evaluará primero el que esté más a la izquierda.
Ejemplo de uso de operadores:
Leer dos datos y determinar cuál es mayor sin usar “if”:
8/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
//Versión A: Usando operadores de relación
mayor = a*(a>b) + b*(b>a);
printf ("1) El mayor es: %d\n", mayor);
VARIABLES PUNTEROS
Las variables puntero o simplemente punteros son, como su nombre lo indica, variables
y por lo tanto sus propiedades y comportamiento son los mismos que cualquier
variable, esto es, se les puede asignar valores y modificarlos, se deben inicializar
porque el sistema no lo hace automáticamente, etc.
Sin embargo, una variable puntero tiene características adicionales que describiremos
a continuación.
La manera cómo se declara tiene la forma:
TIPO *nombre.
Donde:
TIPO: Puede ser cualquier tipo de dato de los que se mencionan anteriormente.
*: Identifica a la variable como un puntero.
nombre: Es el nombre que daremos al identificador. Se le debe anteponer el
asterisco.
Por ejemplo:
int *ptDatos, *ptValores; // Se les denomina punteros a enteros
double *r, *s, *t; // Se les denomina punteros a double
char *nombre, *apellido; // Se les denomina punteros a caracteres.
Observe que cada variable debe tener antepuesto el *, de no colocarse la
variable no será considerada como un puntero. Así por ejemplo:
int *a, b, *c;
Las variables a y c serán definidas como punteros pero b no, solo será una
variable común.
La particularidad de una variable de tipo puntero es que almacena una dirección de
memoria. En programación cuando mencionamos “dirección de memoria”, nos estamos
9/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
refiriendo a un valor entero que identifica el lugar en la memoria del computador
donde se coloca una variable.
Asignación de valores a un puntero
Una variable de tipo puntero, como ya se indicó, se comporta de manera similar a la de
una variable común, sin embargo tiene características que la diferencian de las demás,
una de ellas es que para poder utilizarla debemos inicializarla, de lo contrario el
programa se caerá, se interrumpirá abruptamente o simplemente dará resultados
incoherentes.
Para explicar lo anterior pensemos primero en una variable común, observe las
siguientes líneas de un programa:
int a, b;
a = b + 1;
printf (“A = %d\n”, a); //Qué valor cree que imprimirá para a?
La respuesta es que imprimirá un valor incoherente, esto se debe a que el lenguaje
C/C++ no inicializa las variables como lo hacen otros lenguajes de programación, por lo
tanto el sistema asigna a las variables a y b valores indeterminados en la primera línea
del programa. En la segunda, a ese valor indeterminado de la variable b le suma 1, que
finalmente es asignado a la variable a.
De la misma manera, trabajar con una variable puntero no inicializada ocasionará
resultados incoherentes con la gravedad que estaremos manejando una dirección de
memoria indeterminada (que no sabremos qué es lo que contiene), por lo tanto
debemos inicializarla de modo que la dirección que contenga la variable puntero
corresponda a un espacio en el que podamos trabajar sin problemas, sin interferir con
otros espacios que podrían estar siendo utilizados por el sistema.
Tenemos dos formas de inicializar una variable de tipo puntero, una se denomina
“asignación estática” la otra “asignación dinámica”.
Asignación estática de memoria
Esta forma se da cuando a una variable puntero se le asigna la dirección de memoria
de una variable común, por ejemplo:
int a = 31;
int *ptInt; //Puntero a entero
int *ptInt;
double *ptDbl;
char *n;
Recomendación:
A pesar que usted sepa el tamaño en bytes de un tipo de dato, nunca lo use
(ptInt = (int*) malloc (4);), esto porque los tamaños de los tipos de datos
cambian según la versión de compiladores que usemos, hace algunos años el tipo int
se definía en 2 bytes y es probable que en el futura tenga 8 bytes. Si usted escribe
un programa y usa el valor constante su programa, seguramente se va a compilar y
ejecutar sin problemas, pero también es muy probable que ese programa no pueda
compilar en versiones futuras o en otras computadoras con otros compiladores.
Asignación con valor nulo
Un puntero puede inicializarse también con un valor nulo, que corresponde a una
dirección cero, esta operación se realiza mediante la constante simbólica “NULL”
definida en la biblioteca stdio.h la forma como se utiliza es la siguiente:
int *ptInt;
ptInt = NULL;
Indirección o desreferencia de un puntero
Otra característica particular de una variable de tipo puntero es que mediante el
puntero podemos manipular el valor contenido en la dirección de memoria que se le
asignó al puntero. Esta característica se emplea mediante el operador *, que aplicado
a un puntero se le denomina operador de indirección u operador de desreferencia. La
forma de utilizar este operador es como se muestra a continuación:
int a = 31;
int *ptInt;
11/12
Curso: Técnicas de programación [INF144] J. Miguel Guanira E.
double *ptDbl;
ptInt = &a;
ptDbl = (double*) malloc (sizeof (double));
12/12