JAVA Tokens Llamamos token a la unidad más pequeña interpretada por el compilador. Podemos dividirlos en 5 tipos: Identificadores Palabras clave Literales Operadores Separadores El compilador se encargará de eliminar en tiempo de compilación los espacios en blanco, tabuladores y retornos de carro, así como los Comentarios. Identificadores Los identificadores son los nombres que asignamos a variables, métodos y clases. Las restricciones que existen en estos identificadores son las siguientes: El compilador diferencia entre mayúsculas y minúsculas en los identificadores deben comenzar con una letra, un subrayado (_) o un símbolo de dólar ($). No pueden contener espacios. No pueden usarse las palabras clave de Java como Identificadores Palabras clave Las palabras clave son palabras reservadas para un uso especial en Java y que no pueden ser utilizadas como nombres en el código. Estas palabras son: abstract double int super boolean else interface switch break extends long synchronized byte false native this byvalue final new threadsafe case finally null throw catch float package transient 1 char for private true class goto protected try const if public void continue implements return while default import short do instanceof static Literales Llamamos literales a los números enteros, los números de coma flotante, los booleanos, los caracteres y las cadenas que se presentan de forma explícita dentro del código. A su vez, cada uno de estos literales puede aparecer en diferentes formatos: Enteros: Decimales (base 10) Hexadecimales (base 16): Comienzan con 0x ó 0X Octales (base 8): Comienzan con 0 De coma flotante: double (64 bits) float (32 bits): Terminan con f ó F Notación científica Booleanos: true false Caracteres: Normales: Representan un carácter Unicode De control: Van precedidos por un \: \ \ backslash \ b retroceso \ r retorno de carro 2 \ t tabulador \ f form feed \ n line feed \ ' comilla simple \ " comilla doble \udddd carácter Unicode \ddd número Octal \ continuación Cadenas: Se implementan en Java como un objeto String: Operadores Los operadores nos permiten realizar operaciones entre datos u objetos. Los operadores junto a las variables y datos a los que se aplican forman las expresiones. Un ejemplo de expresión sería: x = y * 6 donde: variables: x, y literales: 6 operadores: =, * La evaluación se realiza siempre de derecha a izquierda. Precedencia de operadores: La precedencia de operadores determina el orden en que estos se evalúan. A continuación se presenta lista de operadores desde la máxima a la mínima precedencia. Todos los que están en la misma fila tienen la misma precedencia, y esta precedencia va disminuyendo al bajar a las filas inferiores: . [] () ++ −− !~*/% + − << >> >>> < > <= >= == != & ^ && || ?: = Por lo tanto, la expresión: 3 x = 5 * 9 + 4 / 2 se evalúa como si fuera: x = (5 * 9) + (4 / 2) ya que * y / tiene una precedencia superior a +. Operadores Enteros Se pueden realizar tres tipos de operaciones sobre enteros: unarias, binarias y relacionales. Operadores Unarios: Los operadores unarios actúan sobre un solo entero. Devuelve un tipo int excepto cuando el operando es un long, en cuyo caso el resultado será también de tipo long. Incremento: ++ Aumenta una variable entera una unidad. Se puede utilizar como prefijo o como sufijo. Prefijo: Se produce la variación antes de evaluar la expresión en la que se encuentra. Ejemplo: y = ++x Antes de la expresión: x = 4 Después de la expresión: y = 5, x = 5 Sufijo: Se produce la variación después de evaluar la expresión en la que se encuentra. Ejemplo: y = x++ Antes de la expresión: x = 4 Después de la expresión: y = 4, x = 5 Decremento: −− Disminuye una variable entera una unidad. Se puede utilizar como prefijo o como sufijo. Negación: − Cambia el signo de un valor entero. Ejemplo: y = −x Antes de la expresión: x = 4 Después de la expresión: y = −4 Complemento a nivel de bits: ~ Se conmuta cada bit del número, los 1 pasan a 0 y viceversa. Operadores Binarios: Los operadores unarios actúan sobre pares de enteros. Devuelven un tipo int excepto cuando uno de los operandos es un long, en cuyo caso el resultado será también de tipo long. Adición: + 4 Sustracción: − Multiplicación: * División: / Módulo: % Resto de una división AND a nivel de bits: & OR a nivel de bits: | XOR a nivel de bits: ^ Comparan cada bit de cada numero realizan las operaciones lógicas especificadas. Desplazamiento a la izquierda: << Desplazamiento a la derecha: >> Desplazamiento a la derecha con inclusión de ceros: >>> Desplazan los bits individuales de un entero en una cantidad entera determinada. Operadores Relacionales: Los operadores unarios actúan sobre pares de números enteros. Devuelven un Booleano. Menor que: < Mayor que: > Menor o igual que: <= Mayor o igual que: >= Igual que: = Distinto a: != Operadores de coma flotante: Igual que sobre enteros, sobre números de coma flotante se pueden realizar tres tipos de operaciones: unarias, binarias y relacionales. Operadores Unarios: Los operadores unarios actúan sobre un solo número de coma flotante. Devuelve un tipo float cuando el número es de este tipo, y un tipo double si el número es un double. Incremento: ++ 5 Aumenta una variable de coma flotante en 1.0 Se puede utilizar como prefijo o como sufijo. Decremento: −− Disminuye una variable de coma flotante en 1.0 Se puede utilizar como prefijo o como sufijo. Operadores booleanos: Los operadores booleanos operan sobre tipos booleanos. Devuelven un resultado Booleano. AND: & OR: | XOR: ^ AND lógico: && Evita la evaluación del lado derecho de la expresión si no es necesario OR lógico: || Evita la evaluación del lado derecho de la expresión si no es necesario Negación: ! Igual que: == Distinto a: != Condicional: ?: Operadores de cadenas: Actúan sobre cadenas de caracteres. Concatenación de cadenas: + Operadores de asignación: Hacen la misma función que los operadores normales, pero almacenando el valor resultante en la parte izquierda de la expresión. Adición: += 6 Sustracción −= Multiplicación: *= División: /= Módulo: %= AND: &= OR: |= XOR: ^= Desplazamiento a la izquierda: <<= Desplazamiento a la derecha: >>= Desplazamiento a la derecha con inclusión de ceros: >>>= Ejemplo: x += 6, equivale a x = x + 6 Separadores Los separadores indican al compilador cómo está organizado el código. Los caracteres separadores son: () Se usa en expresiones para variar la precedencia y en métodos para indicar sus parámetros. {} Se usan para definir los bloques de código. [] Se usan en la definición de matrices. ; Se usa para delimitar sentencias. , Se usa para declarar un cierto número de variables del mismo tipo y dentro de la sentencia for. . Se usa en el enunciamiento de jerarquías de Clases. Comentarios Un comentario es un texto que añadimos al código por motivos documentales. El compilador los ignora completamente. Existen tres maneras de realizar un comentario: 7 /*comentario*/ El compilador no tiene en cuenta lo que exista entre "/*" y "*/" (Ocupe una o varias líneas). //comentario El compilador no tiene en cuenta lo que exista desde "//" y el final de la línea. /**comentario */ Igual que "/* */" excepto que el comentario se puede utilizar para realizar documentación automática. C ++ Caracteres de C ++ Estos caracteres son utilizados para formar constantes, los identificadores y las palabras claves de C++. El compilador de C++ trata las letras mayusculas y minusculas como como caracteres diferentes. Por ejemplo los identificadores Pi y PI son diferentes. Caracteres especiales y signos de puntuacion Se utilizan de diferentes formas y son los siguientes: , . ; : ? ¨ ' ( ) {} [ ] < ! | / \ ~ + # % & ^ * − = > Tipos de datos: Hay dos clases de tipos: tipos fundamentales y tipos derivados. Tipos fundamentales Hay varios tipos fundamentales de datos. Los ficheros de cabecera limits.h y float.h especifican los valores máximo y mínimo para cada tipo. Los podemos clasificar en: Tipos enteros: char, short, int, long y enum. Tipos reales: float, double y long double. otros: void. Cada tipo entero puede ser calificado por las palabras clave signed o unsigned, lo que da lugar a tener disponibles los siguientes tipos extras: signed char, unsigned char 8 signed short, unsigned short signed int, unsigned int signed long, unsigned long Un entero calificado signed es un entero con signo, esto es un número positivo o negativo. Un número entero calificado unsigned es un número entero sin signo, el cual es manipulado como un número entero positivo. Si los modificadores signed y unsigned se utilizan con un tipo específico, se asume el tipo int. Por este motivo, las siguientes declaraciones son equivalentes: signed x; signed int x; unsigned y; unsigned int y; char (carácter − 1 byte) El tipo char es utilizado para almacenar un valor entero en el rango −128 a 127, correspondiente a un carácter del código ASCII. Solamente los valores 0 al 127 son equivalentes a un carácter. 0 De forma similar el tipo unsigned char puede almacenar valores en el rango de 0 a 255, valores correspondientes a los números ordinales de los 256 caracteres ASCII. En ANCI C, signed y unsigned char son tipos diferentes. short (entero formato corto − 2 bytes) El tipo short proporciona un entero en el rango de valores de: −3278 a 32767 (−2E15 a 2E15−1). De forma similar el tipo unsigned short puede almacenar valores en el rango de 0 a 65535 (0 a 2E16−1). Ejemplo: short y, j; Este ejemplo declarara i y j, como variables enteras con posibilidad de tomar valores entre −32768 y 32767. int (entero) Un entero es para C un número sin punto decimal. El rango de valores depende de la maquina. Igualmente ocurre con el tipo unsigned int. Para una máquina con un procesador de 16 bits el rango de valores es de: 32768 a 32767 (−2E15 a 2E15−1) para el tipo int. 0 a 65535 (0 a 2E16−1)para el tipo unsigned. 9 El uso de enteros produce un código compacto y rápido. Para una maquina de 16 bits este tipo es equivalente al tipo short y solo ocupa 2 bytes de memoria. En general: tamaño(short) <= tamaño(int) long (entero formato largo − 4 bytes) Este tipo de números es idóneo para aplicaciones de gestión. Al igual que los enteros, son números sin punto decimal comprendidos en el rango de: −2147483648 a 2147483647 (−2E31 a 2E31−1) para el tipo long. 0 a 4294967295 (0 a 2E32−1) para el tipo unsigned long. En general: tamaño(int) <= tamaño (long) enum La declaración de un tipo enumerado es simplemente una lista de valores que pueden ser tomados por una variable de ese tipo. Los valores del tipo enumerado se representaran con identificadores, que serán las constantes del nuevo tipo. Creación de una enumeración Crear una enumeración es definir un nuevo tipo de datos, denominado tipo enumerado y declarar una variable de este tipo. La sintaxis es la siguiente: enum tipo_enumerado { definición de nombres de constantes enteras }; tipo_enumerado es un identificador que nombra el nuevo tipo definido. Después de definir un tipo enumerado, podemos declarar una o mas variables de este tipo, de la forma: [enum] tipo_enumerado [variable[, variable]...]; float (reales en simple precisión − 4 bytes) Estos números son los mas recurridos en el lenguaje de programación. Un real en simple precisión es un numero que puede tener un numero decimal y que puede estar comprendido en el rango de: −3.40E + 38 a −1.17E −37 para números negativos 1.17E −37 a 3.40E +38 para números positivos 10 Un numero real en simple precisión no tiene mas de 7 dígitos significativos. double (reales en doble precisión − 8 bytes) Un numero real en doble precisión es un numero que puede tener un punto decimal y puede estar comprendido en el rango de: −1.79E+308 a −2.22E−307 para números negativos 2.22E−307 a 1.79E+308 para los números positivos Un numero real en doble precisión tiene hasta 15 dígitos significativos. Esto da a lugar a cálculos mas exactos que en simple precisión. long double (reales doble precisión formato largo − 8 bytes) Para este compilador, este tipo es igual al tipo double. void El tipo void se utiliza para declarar funciones que nom retornan un valor o para declarar un puntero a un tipo no especificado. Si void aparece entre paréntesis a continuación del nombre de una función, no es interpretado como un tipo. En este caso indica que la función no acepta argumentos. TIPOS DERIVADOS Los tipos derivados son construidos a partir de los tipos fundamentales. Algunos de ellos son los siguientes: punteros estructuras unión arrays funciones clases CONSTANTES Una constante es un valor que, una vez fijado por el compilador, no cambia durante la ejecución del programa. Una constante en C puede ser un número o una cadena de caracteres. Constantes enteras El lenguaje C+ + permite especificar un entero en base: 10, 8, 16 y 2. En general, si la constante es positiva, el signo + es opcional y si es negativa, llega el signo −. El tipo de una 11 constante entera viene determinado por su valor. También se puede indicar explícitamente el tipo de una constante entera, añadiendo los sufijos L,U, o UL (mayúsculas o minúsculas). Si el sufijo es L, su tipo es long cuando el valor puede ser representado en este tipo, si no es unsigned long. Si el sufijo es U, su tipo es unsigned int cuando el valor puede ser representado en este tipo, si no es unsigned long. Si el sufijo es UL, su tipo es unsigned long. Ejemplos de constantes enteras: constante decimal puede tener uno o mas dígitos, 0 a 9, de los cuales el primero de ellos es distinto de cero. constante octal puede tener 1 o mas dígitos, 0 a 7, precedidos por 0 (cero). Su valor esta comprendido dentro los limites de un rango. constante hexadecimal puede tener 1 o mas caracteres, 0 a 9, y A a F, precedidos por 0x o 0X (cero mas x). Su valor esta comprendido dentro los limites de un rango. constante binaria puede tener 1 o mas dígitos, 0 o 1, precedidos por 0b o 0B (cero mas b). Este tipo de constantes es una extensión de Zortech C+ +. Constantes reales Una constante real esta formada por una parte entera, seguida por un punto decimal, y una parte fraccionaria. También se permite la notación científica, en cuyo caso se añade al valor una e o E, seguida por un exponente positivo o negativo. parte−entera.parte−fraccionaria[{e/E}{[+]/−}dígitos] donde dígitos representa cero o mas dígitos del 0 al 9 y E o e es el símbolo de exponente de base 10 que puede ser negativa o positiva. Constantes de un solo carácter Este tipo de constantes esta formado por un único carácter encerrado entre comillas simples. Una secuencia de escape es considerada como un único carácter. Constantes de caracteres Una constante de caracteres es una cadena de caracteres encerrados entre comillas dobles. PALABRAS CLAVE Las palabras clave son identificadores predefinidos que tienen significado especial para el compilador C. Un identificador definido por el usuario, no puede tener el mismo nombre que una palabra clave. El lenguaje C, tiene las siguientes palabras clave: auto double int struct break else long switch case enum register typedef 12 char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Además de las palabras clave anteriores, el compilador C+ + tiene también las siguientes: asm friend overload template catch inline private this class new protected virtual delete operator public las palabras claves siempre se deben escribir en minúsculas. OPERADORES Los operadores son símbolos que indican como son manipulados los datos. Se pueden clasificar en los siguientes grupos: aritméticos, lógicos, relaciónales, unitarios, lógicos para manejo de bits, de asignación, operador ternario para expresiones condicionales y otros. Operadores aritméticos Operador + − * / % Operación Suma. Los operandos pueden ser enteros, reales o punteros Resta. Los operandos pueden ser enteros, reales o punteros Multiplicación. Los operandos pueden ser enteros o reales División. Los operandos pueden ser enteros o reales Modulo o resto de una división entera. Los operandos tiene que ser enteros. Operadores lógicos Operador && ** ! Operación AND. Da como resultado el factor lógico 1 si ambos operandos son distintos de cero. Si uno de ellos es cero el resultado es el valor lógico 0. Si el primer operando es igual a cero, el segundo operando no es evaluado. OR. El resultado es cero si ambos operandos son 0. Si uno de los operandos tiene un valor distinto de 0, el resultado es 1. Si el primer operando es distinto de cero, el segundo operando no es evaluado. NOT. el resultado es 0 si el operando tiene un valor distinto de cero, y 1 en caso contrario. El resultado es de tipo int. Los operandos pueden ser enteros, reales o punteros. 13 Operadores de relación Operador < > <= >= == != Operación Primer operando menor que el segundo Primer operando mayor que el segundo Primer operando menor o igual al segundo Primer operando mayor o igual que el segundo Primer operando igual que el segundo Primer operando distinto que el segundo Los operandos pueden ser de tipo entero, real o puntero. Expresiones de Boole Una expresión de Boole da como resultado los valores lógicos 0 o 1. Los operadores que intervienen en una expresión de Boole pueden ser: operadores lógicos y operadores de relación. Operadores unitarios Operador − ~ Operando Cambia el signo al operando. El operando puede ser entero o real. Complemento a 1. El operando tiene que ser entero Operador lógico para el manejo de bits Operador & * ^ << >> Operando Operador AND a nivel de bits Operador OR a nivel de bits Operador XOR a nivel de bits Desplazamiento a la izquierda Desplazamiento a la derecha Los operadores para este tipo de operaciones tienen que ser tipo entero ( tamaño(operador) <= tamaño(int) ), no pueden ser reales. Operadores de asignación Operador ++ −− = *= /= %= += −= Operando Incremento. Decremento. Asignacion simple. Multiplicacion mas asignacion. Division mas asignacion. Modulo mas asignacion. Suma mas asignacion. Resta mas asignacion. 14 << = >> = &= |= ^= Desplazamiento a izquierdas mas asignacion. Desplazamiento a derechas mas asignacion. Operacion AND sobre bits mas asignacion. Operacion OR mas asignacion. Operador XOR sobre bits mas asignacion. En una operacion de asignacion, el valor de la derecha, es convertido al tipo del valor de la izquierda. Otros operadores Operador coma Operador de indireccion (*) Operador de direccion − de (&) Operador sizeof (tamaño de) Los operadores que hemos visto hasta ahora, tambien son aplicables a C, los que veremos a continuacion, solo pueden utilizarse en C+ +. Operdor :: this & new delete .* −>* Operacion Operador de resolucion del ambito de una variable o de una funcion miembro de una clase. significa la direccion del objeto (estructura o clase) sobre el que estamos trabajando. Este operador hace que el operando que le sigue tome la direccion de la variable asignada, en lugar del valor de la misma. Es lo que se conoce referencia de una variable. Aplicado a un parametro formal de una funcion, declara a este como parametro variable (pasar un valor por referencia), dejando de ser un parametro valor Crea un objeto de un tipo especificado, asignado a memoria dinamicamente. Destruye un objeto creado dinamicamente por el operador new. operador para acceder a un miembro de una clase, cuando el miembro es referenciado por un puntero. El operando de la izquierda es el nombre de un objeto de esa clase y el operando a la derecha es un puntero asl miembro de la clase. operador para acceder a un miembro de una clase cuando ambos, miembro y clase, son referenciados por punteros. El operando de la izquierda es un puntero a un objeto de esa clase y el operando a la derecha es un puntero al miembro de la clase. PRIORIDAD Y ORDEN DE EVALUACION La tabla que se presenta a continuacion, resume las reglas de prioridad y asociatividad de todos los operdores. Los operadores escritos sobre una misma linea tienen la misma prioridad. izda. a dcha. izda. a dcha. Una expresion entre parentesis, siempre se evalua primero. Los parentesis tienen mayor prioridad y son evaluados de mas internos a mas externos. 15 Operador Asociatividad ( ) [ ] . − > :: −> *.* & izda. a dcha. − ~ ! * & + + − − sizeof (tipo) new delete dcha. a izda. * / % izda. a dcha. + − izda. a dcha. << >> izda. a dcha. < < = > > = izda. a dcha. = = ! = izda. a dcha. & izda. a dcha. ^ izda. a dcha. | izda. a dcha. & & izda. a dcha. | | izda. a dcha. ? : dcha a izda. = * = / = % = + = − = << = >> = & = | = ^ = dcha a izda. , izda. a dcha. 16