Upload
elena-gomez
View
113
Download
1
Embed Size (px)
Citation preview
C Sharp
C (pronunciado si sharp en ingleacutes) es un lenguaje de programacioacutenorientado a
objetos desarrollado y estandarizado por Microsoft como parte de su plataforma NET
que despueacutes fue aprobado como un estaacutendar por la ECMA (ECMA-334)
e ISO (ISOIEC 23270) C es uno de los lenguajes de programacioacuten disentildeados para
la infraestructura de lenguaje comuacuten
Su sintaxis baacutesica deriva de CC++ y utiliza el modelo de objetos de la plataforma
NET similar al de Java aunque incluye mejoras derivadas de otros lenguajes
El nombre C Sharp fue inspirado por la notacioacuten musical donde (sostenido en
ingleacutes sharp) indica que la nota (C es la nota do en ingleacutes) es un semitono maacutes alta
sugiriendo que C es superior a CC++ Ademaacutes el signo se compone de cuatro
signos + pegados1
Aunque C forma parte de la plataforma NET eacutesta es una API mientras que C es
un lenguaje de programacioacuten independiente disentildeado para generar programas sobre
dicha plataforma Ya existe un compilador implementado que provee el marco Mono -
DotGNU el cual genera programas para distintas plataformas
como WindowsUnix Android iOS Windows Phone Mac OS y GNULinux
Tipos de datos
C contiene dos categoriacuteas generales de tipos de datos integrados tipos de
valor y tipos de referencia El teacutermino tipo de valor indica que esos tipos contienen
directamente sus valores
Tipos para definir nuacutemeros enteros
Tipo de datos de enteros
Tipo EquivalenteBCL Tamantildeo Rango Significado
byte SystemByte 8-bit (1-
byte) 0 a 255
Entero sin
signo
sbyte SystemSByte 8-bit (1-
byte) -128 a 127
Entero con
signo
short SystemInt16 16-bit (2-
byte) -32768 a 32767
Entero corto
con signo
ushort SystemUInt16 16-bit (2-
byte) 0 a 65535
Entero corto
sin signo
int SystemInt32 32-bit (4-
byte) -2147483648 a 2147483647
Entero medio
con signo
uint SystemUInt32 32-bit (4-
byte) 0 a 4294967295
Entero medio
sin signo
long SystemInt64 64-bit (8-
byte)
-9223372036854775808 a
9223372036854775807
Entero largo
con signo
ulong SystemUInt64 64-bit (8-
byte) 0 a 18446744073709551615
Entero largo
sin signo
Los tipos de coma flotante pueden representar nuacutemeros con componentes fraccionales
Existen dos clases de tipos de coma flotante float y double El tipo double es el maacutes
utilizado porque muchas funciones matemaacuteticas de la biblioteca de clases de C usan
valores double Quizaacute el tipo de coma flotante maacutes interesante de C es decimal
dirigido al uso de caacutelculos monetarios La aritmeacutetica de coma flotante normal estaacute sujeta a
una variedad de errores de redondeo cuando se aplica a valores decimales El
tipo decimal elimina estos errores y puede representar hasta 28 lugares decimales
Tipo de datos de coma flotante
Tipo Equivalente BCL Tamantilde
o Rango
Significad
o
float SystemSingle 32-bit
(4-byte) plusmn1401298Eminus45 a plusmn3402823E+38
Coma
flotante
corto
double SystemDouble 64-bit
(8-byte)
plusmn494065645841246Eminus324 a
plusmn179769313486232E+308
Coma
flotante
largo
decima
l
SystemDecima
l
128-bit
(16-
byte)
minus7922816251426433759354395033
5 a
+7922816251426433759354395033
5
Coma
flotante
monetario
Los caracteres en C no tienen un tamantildeo de 8 bits como en otros muchos lenguajes de
programacioacuten sino que usa un tamantildeo de 16 bits llamado Unicode al cual se le
llama char No existen conversiones automaacuteticas de tipo entero achar
Tipo de datos de caracteres
Tipo Equivalente BCL Tamantildeo Rango Significado
char SystemChar 16-bit (2-byte) u0000 a uFFFF Caraacutecter unicode
Para los tipos de datos loacutegicos no existen conversiones automaacuteticas de tipo entero
a bool
Tipo de datos loacutegicos
Tipo Equivalente BCL Tamantildeo Rango Significado
bool SystemBoolean 8-bit (1-byte) true o false Verdadero o falso
OPERADORES
C es un lenguaje muy rico en operadores Se definen seis tipos de operadores
aritmeacuteticos relacionales de asignacioacuten loacutegicos de direccioacuten y de movimiento
Operadores loacutegicos
sect1 Sinopsis
Los operadores loacutegicos producen un resultado booleano ( 321b) y sus operandos son tambieacuten valores loacutegicos o asimilables a ellos (los valores numeacutericos son asimilados a cierto o falsoseguacuten su valor sea cero o distinto de cero) Por contra recuerde que las
operaciones entre bits ( 493) producen valores arbitrarios
Los operadores loacutegicos son tres dos de ellos son binarios el uacuteltimo (negacioacuten) es unario Tienen una doble posibilidad de representacioacuten en el Estaacutendar C++ actual la representacioacuten tradicional que se indica a continuacioacuten y la natural introducida
recientemente que se detalla maacutes adelante
Y loacutegico ampamp AND
O loacutegico || OR
Negacioacuten loacutegica NOT
Las expresiones conectadas con los operadores ampamp y || se evaluacutean de izquierda a derecha y la evaluacioacuten se detiene tan pronto como el resultado verdadero o falso es conocido (muchos programas tienen una loacutegica que se basa en este propiedad)
sect2 ampamp Operador Y loacutegico
Tambieacuten denominado por su nombre en ingleacutes (generalmente en mayuacutesculas) AND loacutegico Devuelve un valor loacutegico true si ambos operandos son ciertos En caso contrario el resultado es false
Sintaxis
expr-AND-logica ampamp expresion-OR-inclusive
Comentario
La operatoria es como sigue El primer operando (de la izquierda) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido es convertido
a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado es false el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es cierto se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota la Norma informa que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubiesen creado
Ejemplo
int m[3] = 012
int x = 0
if (m ampamp x) coutltlt Cierto
elsecoutltlt Falso
Salida
Falso
El valor m que es interpretado como un puntero al primer elemento de la matriz es transformado a un bool Como es distinto de cero (no es un puntero nulo) el resultado es cierto A continuacioacuten el valor x es convertido tambieacuten a bool En este caso la conversioacuten produce falso con lo que este es el resultado del pareacutentesis de la sentencia if
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto ampamp bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto ampamp blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo ampamp negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno falso
Dos cierto
Tres falso
sect3 || Operador O loacutegico
Este operador binario devuelve true si alguno de los operandos es cierto En caso contrario devuelve false
Sintaxis
expr-OR-logica || expresion-AND-logica
Comentario
Este operador sigue un funcionamiento anaacutelogo al anterior El primer operando (izquierdo) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido
es convertido a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado estrue el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es false se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota el Estaacutendar establece que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubieran creado
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto || bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto || blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo || negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos cierto
Tres falso
sect4 Operador NO loacutegico
Este operador es denominado tambieacuten negacioacuten loacutegica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el coacutedigo)
Sintaxis
expresion-cast
Comentario
El operando expresion-cast (que puede ser una expresioacuten que se evaluacutea a un
resultado 121) es convertido a tipo bool con lo que solo puede ser uno de los valores ciertofalso A continuacioacuten el operador cambia su valor Si es cierto es convertido a falso y viceversa
Resulta por tanto que el resultado de este operador es siempre un tipo bool aunque al existir una conversioacuten estaacutendar por la que un cero es convertido a false y cualquier valor
distinto de cero atrue ( 321b) coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0 En otras palabras este operador devuelve cierto (true) si la expresioacuten se evaluacutea a distinto de cero en caso contrario devuelve falso (false)
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false
intmain (void)
if (alto) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos falso
Tres cierto
Si E es una expresioacuten E es equivalente a (0 == E) Como consecuencia las expresiones que siguen son equivalentes dos a dos
if ( valid)
if (valid == 0)
if (valid)
if (valid = 0)
sect7 Representacioacuten expliacutecita
Los operadores loacutegicos entre valores loacutegicos ampamp || la relacioacuten de desigualdad = algunos de los operadores loacutegicos entre bits (amp | ^ ~) y sus expresiones compuestas (amp= |= ^=) tienen una representacioacuten realmente difiacutecil de leer con la desventaja adicional que sus siacutembolos no siempre estaacuten faacutecilmente accesibles en ordenadores con teclados distintos del estaacutendar USA Para resolver este problema el Estaacutendar C++ ha introducido nuevas formas para su representacioacuten las denominamos formas expliacutecitas o
naturales en razoacuten de que se parecen maacutes a las palabras correspondientes del lenguaje natural Las nuevas formas constituyen palabras-clave y la tabla de equivalencias es la siguiente
Palabra
clave Siacutembolo Referencia Descripcioacuten
and ampamp Operador Y loacutegico
or || Operador O loacutegico
not Operador negacioacuten loacutegica
bitand amp 493 Operador AND entre bits
xor ^ 493 Operador OR exclusivo entre bits
bitor | 493 Operador OR inclusivo entre bits
compl ~ 493 Operador complemento a uno de
bits
and_eq amp= 493 Asignacioacuten compuesta (AND entre
bits)
xor_eq ^= 493 Asignacioacuten compuesta (XOR entre
bits)
or_eq |= 493 Asignacioacuten compuesta (OR entre
bits)
not_eq = 4912 Operador relacional de desigualdad
Nota ni el compilador Borland C++ 55 ni MS VC++ 60 soportan esta caracteriacutestica del estaacutendar aunque el de Microsoft anuncia en su documentacioacuten que pueden utilizarse
defines ( 4910b) Por ejemplo
define bitandamp
define bitor |
define and_eqamp=
define or_eq |=
define not_eq =
Por su parte el compilador GNU gcc dispone de la opcioacuten de compilacioacuten -fno-operator-names que permite que las palabras-clave and bitand bitor compl not y or no sean tratadas como sinoacutenimos de los operadores correspondientes
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
short SystemInt16 16-bit (2-
byte) -32768 a 32767
Entero corto
con signo
ushort SystemUInt16 16-bit (2-
byte) 0 a 65535
Entero corto
sin signo
int SystemInt32 32-bit (4-
byte) -2147483648 a 2147483647
Entero medio
con signo
uint SystemUInt32 32-bit (4-
byte) 0 a 4294967295
Entero medio
sin signo
long SystemInt64 64-bit (8-
byte)
-9223372036854775808 a
9223372036854775807
Entero largo
con signo
ulong SystemUInt64 64-bit (8-
byte) 0 a 18446744073709551615
Entero largo
sin signo
Los tipos de coma flotante pueden representar nuacutemeros con componentes fraccionales
Existen dos clases de tipos de coma flotante float y double El tipo double es el maacutes
utilizado porque muchas funciones matemaacuteticas de la biblioteca de clases de C usan
valores double Quizaacute el tipo de coma flotante maacutes interesante de C es decimal
dirigido al uso de caacutelculos monetarios La aritmeacutetica de coma flotante normal estaacute sujeta a
una variedad de errores de redondeo cuando se aplica a valores decimales El
tipo decimal elimina estos errores y puede representar hasta 28 lugares decimales
Tipo de datos de coma flotante
Tipo Equivalente BCL Tamantilde
o Rango
Significad
o
float SystemSingle 32-bit
(4-byte) plusmn1401298Eminus45 a plusmn3402823E+38
Coma
flotante
corto
double SystemDouble 64-bit
(8-byte)
plusmn494065645841246Eminus324 a
plusmn179769313486232E+308
Coma
flotante
largo
decima
l
SystemDecima
l
128-bit
(16-
byte)
minus7922816251426433759354395033
5 a
+7922816251426433759354395033
5
Coma
flotante
monetario
Los caracteres en C no tienen un tamantildeo de 8 bits como en otros muchos lenguajes de
programacioacuten sino que usa un tamantildeo de 16 bits llamado Unicode al cual se le
llama char No existen conversiones automaacuteticas de tipo entero achar
Tipo de datos de caracteres
Tipo Equivalente BCL Tamantildeo Rango Significado
char SystemChar 16-bit (2-byte) u0000 a uFFFF Caraacutecter unicode
Para los tipos de datos loacutegicos no existen conversiones automaacuteticas de tipo entero
a bool
Tipo de datos loacutegicos
Tipo Equivalente BCL Tamantildeo Rango Significado
bool SystemBoolean 8-bit (1-byte) true o false Verdadero o falso
OPERADORES
C es un lenguaje muy rico en operadores Se definen seis tipos de operadores
aritmeacuteticos relacionales de asignacioacuten loacutegicos de direccioacuten y de movimiento
Operadores loacutegicos
sect1 Sinopsis
Los operadores loacutegicos producen un resultado booleano ( 321b) y sus operandos son tambieacuten valores loacutegicos o asimilables a ellos (los valores numeacutericos son asimilados a cierto o falsoseguacuten su valor sea cero o distinto de cero) Por contra recuerde que las
operaciones entre bits ( 493) producen valores arbitrarios
Los operadores loacutegicos son tres dos de ellos son binarios el uacuteltimo (negacioacuten) es unario Tienen una doble posibilidad de representacioacuten en el Estaacutendar C++ actual la representacioacuten tradicional que se indica a continuacioacuten y la natural introducida
recientemente que se detalla maacutes adelante
Y loacutegico ampamp AND
O loacutegico || OR
Negacioacuten loacutegica NOT
Las expresiones conectadas con los operadores ampamp y || se evaluacutean de izquierda a derecha y la evaluacioacuten se detiene tan pronto como el resultado verdadero o falso es conocido (muchos programas tienen una loacutegica que se basa en este propiedad)
sect2 ampamp Operador Y loacutegico
Tambieacuten denominado por su nombre en ingleacutes (generalmente en mayuacutesculas) AND loacutegico Devuelve un valor loacutegico true si ambos operandos son ciertos En caso contrario el resultado es false
Sintaxis
expr-AND-logica ampamp expresion-OR-inclusive
Comentario
La operatoria es como sigue El primer operando (de la izquierda) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido es convertido
a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado es false el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es cierto se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota la Norma informa que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubiesen creado
Ejemplo
int m[3] = 012
int x = 0
if (m ampamp x) coutltlt Cierto
elsecoutltlt Falso
Salida
Falso
El valor m que es interpretado como un puntero al primer elemento de la matriz es transformado a un bool Como es distinto de cero (no es un puntero nulo) el resultado es cierto A continuacioacuten el valor x es convertido tambieacuten a bool En este caso la conversioacuten produce falso con lo que este es el resultado del pareacutentesis de la sentencia if
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto ampamp bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto ampamp blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo ampamp negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno falso
Dos cierto
Tres falso
sect3 || Operador O loacutegico
Este operador binario devuelve true si alguno de los operandos es cierto En caso contrario devuelve false
Sintaxis
expr-OR-logica || expresion-AND-logica
Comentario
Este operador sigue un funcionamiento anaacutelogo al anterior El primer operando (izquierdo) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido
es convertido a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado estrue el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es false se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota el Estaacutendar establece que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubieran creado
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto || bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto || blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo || negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos cierto
Tres falso
sect4 Operador NO loacutegico
Este operador es denominado tambieacuten negacioacuten loacutegica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el coacutedigo)
Sintaxis
expresion-cast
Comentario
El operando expresion-cast (que puede ser una expresioacuten que se evaluacutea a un
resultado 121) es convertido a tipo bool con lo que solo puede ser uno de los valores ciertofalso A continuacioacuten el operador cambia su valor Si es cierto es convertido a falso y viceversa
Resulta por tanto que el resultado de este operador es siempre un tipo bool aunque al existir una conversioacuten estaacutendar por la que un cero es convertido a false y cualquier valor
distinto de cero atrue ( 321b) coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0 En otras palabras este operador devuelve cierto (true) si la expresioacuten se evaluacutea a distinto de cero en caso contrario devuelve falso (false)
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false
intmain (void)
if (alto) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos falso
Tres cierto
Si E es una expresioacuten E es equivalente a (0 == E) Como consecuencia las expresiones que siguen son equivalentes dos a dos
if ( valid)
if (valid == 0)
if (valid)
if (valid = 0)
sect7 Representacioacuten expliacutecita
Los operadores loacutegicos entre valores loacutegicos ampamp || la relacioacuten de desigualdad = algunos de los operadores loacutegicos entre bits (amp | ^ ~) y sus expresiones compuestas (amp= |= ^=) tienen una representacioacuten realmente difiacutecil de leer con la desventaja adicional que sus siacutembolos no siempre estaacuten faacutecilmente accesibles en ordenadores con teclados distintos del estaacutendar USA Para resolver este problema el Estaacutendar C++ ha introducido nuevas formas para su representacioacuten las denominamos formas expliacutecitas o
naturales en razoacuten de que se parecen maacutes a las palabras correspondientes del lenguaje natural Las nuevas formas constituyen palabras-clave y la tabla de equivalencias es la siguiente
Palabra
clave Siacutembolo Referencia Descripcioacuten
and ampamp Operador Y loacutegico
or || Operador O loacutegico
not Operador negacioacuten loacutegica
bitand amp 493 Operador AND entre bits
xor ^ 493 Operador OR exclusivo entre bits
bitor | 493 Operador OR inclusivo entre bits
compl ~ 493 Operador complemento a uno de
bits
and_eq amp= 493 Asignacioacuten compuesta (AND entre
bits)
xor_eq ^= 493 Asignacioacuten compuesta (XOR entre
bits)
or_eq |= 493 Asignacioacuten compuesta (OR entre
bits)
not_eq = 4912 Operador relacional de desigualdad
Nota ni el compilador Borland C++ 55 ni MS VC++ 60 soportan esta caracteriacutestica del estaacutendar aunque el de Microsoft anuncia en su documentacioacuten que pueden utilizarse
defines ( 4910b) Por ejemplo
define bitandamp
define bitor |
define and_eqamp=
define or_eq |=
define not_eq =
Por su parte el compilador GNU gcc dispone de la opcioacuten de compilacioacuten -fno-operator-names que permite que las palabras-clave and bitand bitor compl not y or no sean tratadas como sinoacutenimos de los operadores correspondientes
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
double SystemDouble 64-bit
(8-byte)
plusmn494065645841246Eminus324 a
plusmn179769313486232E+308
Coma
flotante
largo
decima
l
SystemDecima
l
128-bit
(16-
byte)
minus7922816251426433759354395033
5 a
+7922816251426433759354395033
5
Coma
flotante
monetario
Los caracteres en C no tienen un tamantildeo de 8 bits como en otros muchos lenguajes de
programacioacuten sino que usa un tamantildeo de 16 bits llamado Unicode al cual se le
llama char No existen conversiones automaacuteticas de tipo entero achar
Tipo de datos de caracteres
Tipo Equivalente BCL Tamantildeo Rango Significado
char SystemChar 16-bit (2-byte) u0000 a uFFFF Caraacutecter unicode
Para los tipos de datos loacutegicos no existen conversiones automaacuteticas de tipo entero
a bool
Tipo de datos loacutegicos
Tipo Equivalente BCL Tamantildeo Rango Significado
bool SystemBoolean 8-bit (1-byte) true o false Verdadero o falso
OPERADORES
C es un lenguaje muy rico en operadores Se definen seis tipos de operadores
aritmeacuteticos relacionales de asignacioacuten loacutegicos de direccioacuten y de movimiento
Operadores loacutegicos
sect1 Sinopsis
Los operadores loacutegicos producen un resultado booleano ( 321b) y sus operandos son tambieacuten valores loacutegicos o asimilables a ellos (los valores numeacutericos son asimilados a cierto o falsoseguacuten su valor sea cero o distinto de cero) Por contra recuerde que las
operaciones entre bits ( 493) producen valores arbitrarios
Los operadores loacutegicos son tres dos de ellos son binarios el uacuteltimo (negacioacuten) es unario Tienen una doble posibilidad de representacioacuten en el Estaacutendar C++ actual la representacioacuten tradicional que se indica a continuacioacuten y la natural introducida
recientemente que se detalla maacutes adelante
Y loacutegico ampamp AND
O loacutegico || OR
Negacioacuten loacutegica NOT
Las expresiones conectadas con los operadores ampamp y || se evaluacutean de izquierda a derecha y la evaluacioacuten se detiene tan pronto como el resultado verdadero o falso es conocido (muchos programas tienen una loacutegica que se basa en este propiedad)
sect2 ampamp Operador Y loacutegico
Tambieacuten denominado por su nombre en ingleacutes (generalmente en mayuacutesculas) AND loacutegico Devuelve un valor loacutegico true si ambos operandos son ciertos En caso contrario el resultado es false
Sintaxis
expr-AND-logica ampamp expresion-OR-inclusive
Comentario
La operatoria es como sigue El primer operando (de la izquierda) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido es convertido
a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado es false el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es cierto se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota la Norma informa que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubiesen creado
Ejemplo
int m[3] = 012
int x = 0
if (m ampamp x) coutltlt Cierto
elsecoutltlt Falso
Salida
Falso
El valor m que es interpretado como un puntero al primer elemento de la matriz es transformado a un bool Como es distinto de cero (no es un puntero nulo) el resultado es cierto A continuacioacuten el valor x es convertido tambieacuten a bool En este caso la conversioacuten produce falso con lo que este es el resultado del pareacutentesis de la sentencia if
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto ampamp bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto ampamp blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo ampamp negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno falso
Dos cierto
Tres falso
sect3 || Operador O loacutegico
Este operador binario devuelve true si alguno de los operandos es cierto En caso contrario devuelve false
Sintaxis
expr-OR-logica || expresion-AND-logica
Comentario
Este operador sigue un funcionamiento anaacutelogo al anterior El primer operando (izquierdo) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido
es convertido a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado estrue el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es false se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota el Estaacutendar establece que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubieran creado
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto || bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto || blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo || negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos cierto
Tres falso
sect4 Operador NO loacutegico
Este operador es denominado tambieacuten negacioacuten loacutegica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el coacutedigo)
Sintaxis
expresion-cast
Comentario
El operando expresion-cast (que puede ser una expresioacuten que se evaluacutea a un
resultado 121) es convertido a tipo bool con lo que solo puede ser uno de los valores ciertofalso A continuacioacuten el operador cambia su valor Si es cierto es convertido a falso y viceversa
Resulta por tanto que el resultado de este operador es siempre un tipo bool aunque al existir una conversioacuten estaacutendar por la que un cero es convertido a false y cualquier valor
distinto de cero atrue ( 321b) coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0 En otras palabras este operador devuelve cierto (true) si la expresioacuten se evaluacutea a distinto de cero en caso contrario devuelve falso (false)
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false
intmain (void)
if (alto) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos falso
Tres cierto
Si E es una expresioacuten E es equivalente a (0 == E) Como consecuencia las expresiones que siguen son equivalentes dos a dos
if ( valid)
if (valid == 0)
if (valid)
if (valid = 0)
sect7 Representacioacuten expliacutecita
Los operadores loacutegicos entre valores loacutegicos ampamp || la relacioacuten de desigualdad = algunos de los operadores loacutegicos entre bits (amp | ^ ~) y sus expresiones compuestas (amp= |= ^=) tienen una representacioacuten realmente difiacutecil de leer con la desventaja adicional que sus siacutembolos no siempre estaacuten faacutecilmente accesibles en ordenadores con teclados distintos del estaacutendar USA Para resolver este problema el Estaacutendar C++ ha introducido nuevas formas para su representacioacuten las denominamos formas expliacutecitas o
naturales en razoacuten de que se parecen maacutes a las palabras correspondientes del lenguaje natural Las nuevas formas constituyen palabras-clave y la tabla de equivalencias es la siguiente
Palabra
clave Siacutembolo Referencia Descripcioacuten
and ampamp Operador Y loacutegico
or || Operador O loacutegico
not Operador negacioacuten loacutegica
bitand amp 493 Operador AND entre bits
xor ^ 493 Operador OR exclusivo entre bits
bitor | 493 Operador OR inclusivo entre bits
compl ~ 493 Operador complemento a uno de
bits
and_eq amp= 493 Asignacioacuten compuesta (AND entre
bits)
xor_eq ^= 493 Asignacioacuten compuesta (XOR entre
bits)
or_eq |= 493 Asignacioacuten compuesta (OR entre
bits)
not_eq = 4912 Operador relacional de desigualdad
Nota ni el compilador Borland C++ 55 ni MS VC++ 60 soportan esta caracteriacutestica del estaacutendar aunque el de Microsoft anuncia en su documentacioacuten que pueden utilizarse
defines ( 4910b) Por ejemplo
define bitandamp
define bitor |
define and_eqamp=
define or_eq |=
define not_eq =
Por su parte el compilador GNU gcc dispone de la opcioacuten de compilacioacuten -fno-operator-names que permite que las palabras-clave and bitand bitor compl not y or no sean tratadas como sinoacutenimos de los operadores correspondientes
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
Operadores loacutegicos
sect1 Sinopsis
Los operadores loacutegicos producen un resultado booleano ( 321b) y sus operandos son tambieacuten valores loacutegicos o asimilables a ellos (los valores numeacutericos son asimilados a cierto o falsoseguacuten su valor sea cero o distinto de cero) Por contra recuerde que las
operaciones entre bits ( 493) producen valores arbitrarios
Los operadores loacutegicos son tres dos de ellos son binarios el uacuteltimo (negacioacuten) es unario Tienen una doble posibilidad de representacioacuten en el Estaacutendar C++ actual la representacioacuten tradicional que se indica a continuacioacuten y la natural introducida
recientemente que se detalla maacutes adelante
Y loacutegico ampamp AND
O loacutegico || OR
Negacioacuten loacutegica NOT
Las expresiones conectadas con los operadores ampamp y || se evaluacutean de izquierda a derecha y la evaluacioacuten se detiene tan pronto como el resultado verdadero o falso es conocido (muchos programas tienen una loacutegica que se basa en este propiedad)
sect2 ampamp Operador Y loacutegico
Tambieacuten denominado por su nombre en ingleacutes (generalmente en mayuacutesculas) AND loacutegico Devuelve un valor loacutegico true si ambos operandos son ciertos En caso contrario el resultado es false
Sintaxis
expr-AND-logica ampamp expresion-OR-inclusive
Comentario
La operatoria es como sigue El primer operando (de la izquierda) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido es convertido
a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado es false el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es cierto se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota la Norma informa que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubiesen creado
Ejemplo
int m[3] = 012
int x = 0
if (m ampamp x) coutltlt Cierto
elsecoutltlt Falso
Salida
Falso
El valor m que es interpretado como un puntero al primer elemento de la matriz es transformado a un bool Como es distinto de cero (no es un puntero nulo) el resultado es cierto A continuacioacuten el valor x es convertido tambieacuten a bool En este caso la conversioacuten produce falso con lo que este es el resultado del pareacutentesis de la sentencia if
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto ampamp bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto ampamp blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo ampamp negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno falso
Dos cierto
Tres falso
sect3 || Operador O loacutegico
Este operador binario devuelve true si alguno de los operandos es cierto En caso contrario devuelve false
Sintaxis
expr-OR-logica || expresion-AND-logica
Comentario
Este operador sigue un funcionamiento anaacutelogo al anterior El primer operando (izquierdo) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido
es convertido a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado estrue el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es false se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota el Estaacutendar establece que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubieran creado
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto || bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto || blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo || negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos cierto
Tres falso
sect4 Operador NO loacutegico
Este operador es denominado tambieacuten negacioacuten loacutegica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el coacutedigo)
Sintaxis
expresion-cast
Comentario
El operando expresion-cast (que puede ser una expresioacuten que se evaluacutea a un
resultado 121) es convertido a tipo bool con lo que solo puede ser uno de los valores ciertofalso A continuacioacuten el operador cambia su valor Si es cierto es convertido a falso y viceversa
Resulta por tanto que el resultado de este operador es siempre un tipo bool aunque al existir una conversioacuten estaacutendar por la que un cero es convertido a false y cualquier valor
distinto de cero atrue ( 321b) coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0 En otras palabras este operador devuelve cierto (true) si la expresioacuten se evaluacutea a distinto de cero en caso contrario devuelve falso (false)
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false
intmain (void)
if (alto) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos falso
Tres cierto
Si E es una expresioacuten E es equivalente a (0 == E) Como consecuencia las expresiones que siguen son equivalentes dos a dos
if ( valid)
if (valid == 0)
if (valid)
if (valid = 0)
sect7 Representacioacuten expliacutecita
Los operadores loacutegicos entre valores loacutegicos ampamp || la relacioacuten de desigualdad = algunos de los operadores loacutegicos entre bits (amp | ^ ~) y sus expresiones compuestas (amp= |= ^=) tienen una representacioacuten realmente difiacutecil de leer con la desventaja adicional que sus siacutembolos no siempre estaacuten faacutecilmente accesibles en ordenadores con teclados distintos del estaacutendar USA Para resolver este problema el Estaacutendar C++ ha introducido nuevas formas para su representacioacuten las denominamos formas expliacutecitas o
naturales en razoacuten de que se parecen maacutes a las palabras correspondientes del lenguaje natural Las nuevas formas constituyen palabras-clave y la tabla de equivalencias es la siguiente
Palabra
clave Siacutembolo Referencia Descripcioacuten
and ampamp Operador Y loacutegico
or || Operador O loacutegico
not Operador negacioacuten loacutegica
bitand amp 493 Operador AND entre bits
xor ^ 493 Operador OR exclusivo entre bits
bitor | 493 Operador OR inclusivo entre bits
compl ~ 493 Operador complemento a uno de
bits
and_eq amp= 493 Asignacioacuten compuesta (AND entre
bits)
xor_eq ^= 493 Asignacioacuten compuesta (XOR entre
bits)
or_eq |= 493 Asignacioacuten compuesta (OR entre
bits)
not_eq = 4912 Operador relacional de desigualdad
Nota ni el compilador Borland C++ 55 ni MS VC++ 60 soportan esta caracteriacutestica del estaacutendar aunque el de Microsoft anuncia en su documentacioacuten que pueden utilizarse
defines ( 4910b) Por ejemplo
define bitandamp
define bitor |
define and_eqamp=
define or_eq |=
define not_eq =
Por su parte el compilador GNU gcc dispone de la opcioacuten de compilacioacuten -fno-operator-names que permite que las palabras-clave and bitand bitor compl not y or no sean tratadas como sinoacutenimos de los operadores correspondientes
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
Nota la Norma informa que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubiesen creado
Ejemplo
int m[3] = 012
int x = 0
if (m ampamp x) coutltlt Cierto
elsecoutltlt Falso
Salida
Falso
El valor m que es interpretado como un puntero al primer elemento de la matriz es transformado a un bool Como es distinto de cero (no es un puntero nulo) el resultado es cierto A continuacioacuten el valor x es convertido tambieacuten a bool En este caso la conversioacuten produce falso con lo que este es el resultado del pareacutentesis de la sentencia if
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto ampamp bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto ampamp blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo ampamp negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno falso
Dos cierto
Tres falso
sect3 || Operador O loacutegico
Este operador binario devuelve true si alguno de los operandos es cierto En caso contrario devuelve false
Sintaxis
expr-OR-logica || expresion-AND-logica
Comentario
Este operador sigue un funcionamiento anaacutelogo al anterior El primer operando (izquierdo) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido
es convertido a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado estrue el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es false se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota el Estaacutendar establece que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubieran creado
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto || bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto || blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo || negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos cierto
Tres falso
sect4 Operador NO loacutegico
Este operador es denominado tambieacuten negacioacuten loacutegica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el coacutedigo)
Sintaxis
expresion-cast
Comentario
El operando expresion-cast (que puede ser una expresioacuten que se evaluacutea a un
resultado 121) es convertido a tipo bool con lo que solo puede ser uno de los valores ciertofalso A continuacioacuten el operador cambia su valor Si es cierto es convertido a falso y viceversa
Resulta por tanto que el resultado de este operador es siempre un tipo bool aunque al existir una conversioacuten estaacutendar por la que un cero es convertido a false y cualquier valor
distinto de cero atrue ( 321b) coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0 En otras palabras este operador devuelve cierto (true) si la expresioacuten se evaluacutea a distinto de cero en caso contrario devuelve falso (false)
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false
intmain (void)
if (alto) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos falso
Tres cierto
Si E es una expresioacuten E es equivalente a (0 == E) Como consecuencia las expresiones que siguen son equivalentes dos a dos
if ( valid)
if (valid == 0)
if (valid)
if (valid = 0)
sect7 Representacioacuten expliacutecita
Los operadores loacutegicos entre valores loacutegicos ampamp || la relacioacuten de desigualdad = algunos de los operadores loacutegicos entre bits (amp | ^ ~) y sus expresiones compuestas (amp= |= ^=) tienen una representacioacuten realmente difiacutecil de leer con la desventaja adicional que sus siacutembolos no siempre estaacuten faacutecilmente accesibles en ordenadores con teclados distintos del estaacutendar USA Para resolver este problema el Estaacutendar C++ ha introducido nuevas formas para su representacioacuten las denominamos formas expliacutecitas o
naturales en razoacuten de que se parecen maacutes a las palabras correspondientes del lenguaje natural Las nuevas formas constituyen palabras-clave y la tabla de equivalencias es la siguiente
Palabra
clave Siacutembolo Referencia Descripcioacuten
and ampamp Operador Y loacutegico
or || Operador O loacutegico
not Operador negacioacuten loacutegica
bitand amp 493 Operador AND entre bits
xor ^ 493 Operador OR exclusivo entre bits
bitor | 493 Operador OR inclusivo entre bits
compl ~ 493 Operador complemento a uno de
bits
and_eq amp= 493 Asignacioacuten compuesta (AND entre
bits)
xor_eq ^= 493 Asignacioacuten compuesta (XOR entre
bits)
or_eq |= 493 Asignacioacuten compuesta (OR entre
bits)
not_eq = 4912 Operador relacional de desigualdad
Nota ni el compilador Borland C++ 55 ni MS VC++ 60 soportan esta caracteriacutestica del estaacutendar aunque el de Microsoft anuncia en su documentacioacuten que pueden utilizarse
defines ( 4910b) Por ejemplo
define bitandamp
define bitor |
define and_eqamp=
define or_eq |=
define not_eq =
Por su parte el compilador GNU gcc dispone de la opcioacuten de compilacioacuten -fno-operator-names que permite que las palabras-clave and bitand bitor compl not y or no sean tratadas como sinoacutenimos de los operadores correspondientes
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
Comentario
Este operador sigue un funcionamiento anaacutelogo al anterior El primer operando (izquierdo) es convertido a bool Para ello si es una expresioacuten se evaluacutea para obtener el resultado (esta computacioacuten puede tener ciertos efectos laterales) A continuacioacuten el valor obtenido
es convertido a bool ciertofalso siguiendo las reglas de conversioacuten estaacutendar ( 321b) Si el resultado estrue el proceso se detiene y este es el resultado sin que en este caso sea necesario evaluar la expresioacuten de la derecha (recueacuterdese que en el disentildeo de C++ prima la velocidad)
Si el resultado del operando izquierdo es false se continuacutea con la evaluacioacuten de la expresioacuten de la derecha que tambieacuten es convertida a bool Si el nuevo resultado es true entonces el resultado del operador es true En caso contrario el resultado es false
Nota el Estaacutendar establece que antes de ser evaluada la expresioacuten derecha han sucedido todos los posibles efectos laterales de la expresioacuten izquierda a excepcioacuten de la destruccioacuten de los posibles objetos temporales que se hubieran creado
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false blanco = true negro = false
intmain (void)
if (alto || bajo) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto || blanco) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo || negro) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos cierto
Tres falso
sect4 Operador NO loacutegico
Este operador es denominado tambieacuten negacioacuten loacutegica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el coacutedigo)
Sintaxis
expresion-cast
Comentario
El operando expresion-cast (que puede ser una expresioacuten que se evaluacutea a un
resultado 121) es convertido a tipo bool con lo que solo puede ser uno de los valores ciertofalso A continuacioacuten el operador cambia su valor Si es cierto es convertido a falso y viceversa
Resulta por tanto que el resultado de este operador es siempre un tipo bool aunque al existir una conversioacuten estaacutendar por la que un cero es convertido a false y cualquier valor
distinto de cero atrue ( 321b) coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0 En otras palabras este operador devuelve cierto (true) si la expresioacuten se evaluacutea a distinto de cero en caso contrario devuelve falso (false)
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false
intmain (void)
if (alto) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos falso
Tres cierto
Si E es una expresioacuten E es equivalente a (0 == E) Como consecuencia las expresiones que siguen son equivalentes dos a dos
if ( valid)
if (valid == 0)
if (valid)
if (valid = 0)
sect7 Representacioacuten expliacutecita
Los operadores loacutegicos entre valores loacutegicos ampamp || la relacioacuten de desigualdad = algunos de los operadores loacutegicos entre bits (amp | ^ ~) y sus expresiones compuestas (amp= |= ^=) tienen una representacioacuten realmente difiacutecil de leer con la desventaja adicional que sus siacutembolos no siempre estaacuten faacutecilmente accesibles en ordenadores con teclados distintos del estaacutendar USA Para resolver este problema el Estaacutendar C++ ha introducido nuevas formas para su representacioacuten las denominamos formas expliacutecitas o
naturales en razoacuten de que se parecen maacutes a las palabras correspondientes del lenguaje natural Las nuevas formas constituyen palabras-clave y la tabla de equivalencias es la siguiente
Palabra
clave Siacutembolo Referencia Descripcioacuten
and ampamp Operador Y loacutegico
or || Operador O loacutegico
not Operador negacioacuten loacutegica
bitand amp 493 Operador AND entre bits
xor ^ 493 Operador OR exclusivo entre bits
bitor | 493 Operador OR inclusivo entre bits
compl ~ 493 Operador complemento a uno de
bits
and_eq amp= 493 Asignacioacuten compuesta (AND entre
bits)
xor_eq ^= 493 Asignacioacuten compuesta (XOR entre
bits)
or_eq |= 493 Asignacioacuten compuesta (OR entre
bits)
not_eq = 4912 Operador relacional de desigualdad
Nota ni el compilador Borland C++ 55 ni MS VC++ 60 soportan esta caracteriacutestica del estaacutendar aunque el de Microsoft anuncia en su documentacioacuten que pueden utilizarse
defines ( 4910b) Por ejemplo
define bitandamp
define bitor |
define and_eqamp=
define or_eq |=
define not_eq =
Por su parte el compilador GNU gcc dispone de la opcioacuten de compilacioacuten -fno-operator-names que permite que las palabras-clave and bitand bitor compl not y or no sean tratadas como sinoacutenimos de los operadores correspondientes
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
El operando expresion-cast (que puede ser una expresioacuten que se evaluacutea a un
resultado 121) es convertido a tipo bool con lo que solo puede ser uno de los valores ciertofalso A continuacioacuten el operador cambia su valor Si es cierto es convertido a falso y viceversa
Resulta por tanto que el resultado de este operador es siempre un tipo bool aunque al existir una conversioacuten estaacutendar por la que un cero es convertido a false y cualquier valor
distinto de cero atrue ( 321b) coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0 En otras palabras este operador devuelve cierto (true) si la expresioacuten se evaluacutea a distinto de cero en caso contrario devuelve falso (false)
Ejemplo
includeltiostreamhgt
bool alto = true bajo = false
intmain (void)
if (alto) coutltlt Uno cierto ltltendl
elsecoutltlt Uno falso ltltendl
if (alto) coutltlt Dos cierto ltltendl
elsecoutltlt Dos falso ltltendl
if (bajo) coutltlt Tres cierto ltltendl
elsecoutltlt Tres falso ltltendl
Salida
Uno cierto
Dos falso
Tres cierto
Si E es una expresioacuten E es equivalente a (0 == E) Como consecuencia las expresiones que siguen son equivalentes dos a dos
if ( valid)
if (valid == 0)
if (valid)
if (valid = 0)
sect7 Representacioacuten expliacutecita
Los operadores loacutegicos entre valores loacutegicos ampamp || la relacioacuten de desigualdad = algunos de los operadores loacutegicos entre bits (amp | ^ ~) y sus expresiones compuestas (amp= |= ^=) tienen una representacioacuten realmente difiacutecil de leer con la desventaja adicional que sus siacutembolos no siempre estaacuten faacutecilmente accesibles en ordenadores con teclados distintos del estaacutendar USA Para resolver este problema el Estaacutendar C++ ha introducido nuevas formas para su representacioacuten las denominamos formas expliacutecitas o
naturales en razoacuten de que se parecen maacutes a las palabras correspondientes del lenguaje natural Las nuevas formas constituyen palabras-clave y la tabla de equivalencias es la siguiente
Palabra
clave Siacutembolo Referencia Descripcioacuten
and ampamp Operador Y loacutegico
or || Operador O loacutegico
not Operador negacioacuten loacutegica
bitand amp 493 Operador AND entre bits
xor ^ 493 Operador OR exclusivo entre bits
bitor | 493 Operador OR inclusivo entre bits
compl ~ 493 Operador complemento a uno de
bits
and_eq amp= 493 Asignacioacuten compuesta (AND entre
bits)
xor_eq ^= 493 Asignacioacuten compuesta (XOR entre
bits)
or_eq |= 493 Asignacioacuten compuesta (OR entre
bits)
not_eq = 4912 Operador relacional de desigualdad
Nota ni el compilador Borland C++ 55 ni MS VC++ 60 soportan esta caracteriacutestica del estaacutendar aunque el de Microsoft anuncia en su documentacioacuten que pueden utilizarse
defines ( 4910b) Por ejemplo
define bitandamp
define bitor |
define and_eqamp=
define or_eq |=
define not_eq =
Por su parte el compilador GNU gcc dispone de la opcioacuten de compilacioacuten -fno-operator-names que permite que las palabras-clave and bitand bitor compl not y or no sean tratadas como sinoacutenimos de los operadores correspondientes
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
naturales en razoacuten de que se parecen maacutes a las palabras correspondientes del lenguaje natural Las nuevas formas constituyen palabras-clave y la tabla de equivalencias es la siguiente
Palabra
clave Siacutembolo Referencia Descripcioacuten
and ampamp Operador Y loacutegico
or || Operador O loacutegico
not Operador negacioacuten loacutegica
bitand amp 493 Operador AND entre bits
xor ^ 493 Operador OR exclusivo entre bits
bitor | 493 Operador OR inclusivo entre bits
compl ~ 493 Operador complemento a uno de
bits
and_eq amp= 493 Asignacioacuten compuesta (AND entre
bits)
xor_eq ^= 493 Asignacioacuten compuesta (XOR entre
bits)
or_eq |= 493 Asignacioacuten compuesta (OR entre
bits)
not_eq = 4912 Operador relacional de desigualdad
Nota ni el compilador Borland C++ 55 ni MS VC++ 60 soportan esta caracteriacutestica del estaacutendar aunque el de Microsoft anuncia en su documentacioacuten que pueden utilizarse
defines ( 4910b) Por ejemplo
define bitandamp
define bitor |
define and_eqamp=
define or_eq |=
define not_eq =
Por su parte el compilador GNU gcc dispone de la opcioacuten de compilacioacuten -fno-operator-names que permite que las palabras-clave and bitand bitor compl not y or no sean tratadas como sinoacutenimos de los operadores correspondientes
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
Operadores aritmeacuteticos
sect1 Sinopsis
Los operadores aritmeacuteticos se usan para realizar caacutelculos de aritmeacutetica de nuacutemeros reales y de aritmeacutetica de punteros C++ dispone de los siguientes
+ Dos posibilidades Suma binaria maacutes unitario
++ Incremento unitario (dos clases )
- Dos posibilidades Resta binaria menos unitario
-- Decremento unitario (dos clases )
Multiplicacioacuten (este siacutembolo tiene tambieacuten otros usos )
Divisioacuten
Resto o moacutedulo
Nota la aritmeacutetica de nuacutemeros reales es la claacutesica de la escuela primaria La de
punteros es una aritmeacutetica un tanto especial y rudimentaria ( 422)
sect2 Observaciones
Los operadores aritmeacuteticos pertenecen a dos grupos unos aceptan operandos de tipo numeacuterico otros aceptan operandos de tipo puntero-a-tipoX [3] Ademaacutes son de dos tipos unarios (que aceptan un solo operando) y binarios (que aceptan dos) La clasificacioacuten es la siguiente
Operadores aritmeacuteticos unarios
+ maacutes unitario
++ Incremento unitario (dos clases)
- menos unitario
-- Decremento unitario (dos clases)
Operadores artimeacuteticosbinaros
+ Suma binaria
- Resta binaria
Multiplicacioacuten
Divisioacuten
Resto o moacutedulo
Estos uacuteltimos pueden combinarse con el de asignacioacuten = para dar origen a operadores
compuestos ( 492) son los siguientes
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
+= Asigna suma
-= Asigna diferencia (resta)
= Asigna producto
= Asigna divisioacuten
= Asigna resto (moacutedulo)
Tenga en cuenta que existen distintos operadores enmascarados bajo los mismos siacutembolos + y - Es un caso de sobrecarga incluida en el propio lenguaje [1] Como en el resto de los casos de sobrecarga el compilador deduce por el contexto de que versioacuten del operador se trata Como veremos inmediatamente en C++ es perfectamente vaacutelida una expresioacuten del tipo
int x = ptr+-++ptr
En el ejemplo siguiente se muestran los casos posibles
intai[] = 2 3
int ptr = ai
int r1 = +ai[0] L3 maacutes unitario sobre tipo numeacuterico
int r2 = -ai[1] L3 menos unitario sobre tipo
numeacuterico
int r3 = ai[0] + ai[1] L4 2 + 3 suma binaria (de enteros)
int r4 = ai[1] - ai[0] L5 3 - 2 resta binaria (de enteros)
int r5 = ai[0] + -ai[1] L6 2 +(-3) suma binaria seguida de
menos unitario
int r6 = ptr + -++ptr L7 Suma binaria (de enteros) a + (-
b)
En L7 coexisten tres operadores aritmeacuteticos no homogeacuteneos (de izquierda a derecha)
+ Suma binaria entre valores numeacutericos tipo int ( ) Los valores ptr y -++ptr
- Negacioacuten unitaria de un valor numeacuterico tipo int ( ) el valor (++ptr)
++ Preincremento de un puntero-a-int ( ) Equivale a suma binaria de puntero y
entero ++ptr == ptr = ptr + 1
Nota aunque vaacutelida la sentencia de L7 es un ejemplo de expresioacuten peligrosa y
desaconsejada En 490a se ha presentado una explicacioacuten del sorpresivo resultado ( 0 ) que se obtiene para L6
sect3 Suma y resta binaria
En el primer caso suma y resta binaria caben dos posibilidades sintaacutecticas
a- expresioacuten-suma + expresioacuten-de-multiplicacioacuten
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
b- expresioacuten-suma - expresioacuten-de-multiplicacioacuten
sect31 Operador Suma binaria
Las posibilidades para los operandos en la expresioacuten A + B son los siguientes
1 A y B son tipos aritmeacuteticos enteros o fraccionarios ( 221) En este caso ambos
operandos estaacuten sujetos a las posibles conversiones aritmeacuteticas estaacutendar ( 225) y el resultado es la suma aritmeacutetica de ambos Ejemplo
int x = 10 y = 20
int z = x + y z == 30
2 A es un entero y B es un puntero a objeto Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[0] Sentildeala a 1
int x = (2 + ptr) x == 3
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
int z = (ptr + 3) x == 4
sect32 Operador Resta binaria
Las posibilidades para los operandos en la expresioacuten A - B son los siguientes
1 A y B son de tipo aritmeacutetico entero o fraccionario las posibilidades son las mismas que en el caso 1 de la suma binaria expuesta anteriormente El resultado es la resta aritmeacutetica de ambos operandos Ejemplo
int x = 10 y = 20
int z = x - y z == -10
2 A y B son punteros a objetos de tipos compatibles Ejemplo
intarr[5] = 1 2 3 4 5
int pt1 = amparr[0] Sentildeala a 1
int pt2 = amparr[4] Sentildeala a 5
int x = pt2 - pt1 x == 4
3 A es un puntero a objeto y B es un entero En estos dos uacuteltimos casos se aplican
las reglas de aritmeacutetica de punteros ( 422) Ejemplo
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
intarr[5] = 1 2 3 4 5
int ptr = amparr[4] sentildeala a 5
int x = (ptr - 2) x == 3
sect4 Operadores plusmn Unitarios
Cuando los operadores + y - se utilizan como operadores unitarios las posibilidades sintaacutecticas son
+ ltexpresioacuten-castgt
- ltexpresioacuten-castgt
En ambos casos ltexpresioacuten-castgt debe ser de tipo numeacuterico Los resultados son
respectivamente
Valor del operando expresioacuten-cast despueacutes de cualquier promocioacuten interna
que sea necesaria
Valor negativo del operando expresioacuten-cast despueacutes de cualquier promocioacuten
interna que se necesite
Nota recuerde que cuando + y - se utilizan como operadores unitarios tienen mayor
precedencia que cuando se utilizan como suma y resta binarias ( 490a)
Ejemplo
int x = 7 y = 3
int r1 = - (y - x) r1 == 4
int r2 = + (y - x) r2 == -4
int r3 = - (x - y) r3 == -4
int r4 = + (x - y) r4 == 4
sect5 Operadores multiplicacioacuten y divisioacuten
Los operadores binarios (multiplicacioacuten) y (divisioacuten) realizan sus operaciones aritmeacuteticas correspondientes con todos los tipos numeacutericos (enteros y fraccionarios)
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
expresioacuten-de-multiplicacioacuten expresioacuten-cast
sect6 Operador moacutedulo
El operador binario (operador de moacutedulo) devuelve el resto de la divisioacuten de dos enteros no puede ser utilizado con nuacutemeros fraccionarios float o double [2]
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
Sintaxis
expresioacuten-de-multiplicacioacuten expresioacuten-cast
Ejemplo
int resto = (6 4)
coutltlt El resto de 64 es ltlt resto ltltendl
Salida
El resto de 64 es 2
sect7 Operadores incremento y decremento
Los operadores unitarios ++ (incremento) y -- (decremento) suman y restan respectivamente una unidad al valor de la expresioacuten Existen dos variedades Pre y Post para cada uno de ellos
Las posibilidades sintaacutecticas son
postfix-expression ++ (postincremento)
++ expresioacuten-unitaria (preincremento)
postfix-expression -- (postdecremento)
-- expresioacuten-unitaria (predecremento)
En los ejemplos que siguen suponemos que originariamente n == 5
El postincremento antildeade uno a la expresioacuten despueacutes de que se ha evaluado
x = n++ -gt x == 5 y n == 6
El preincremento antildeade uno antes de que sea evaluada la expresioacuten
x = ++n -gt x == 6 y n == 6
El postdecremento resta uno del valor de la expresioacuten despueacutes de que sea evaluada
x = n-- -gt x == 5 y n == 4
El predecremento resta uno antes de la evaluacioacuten de la expresioacuten
x = --n -gt x == 4 y n == 4
En ambos casos el operando debe ser una variable no una expresioacuten Por
ejemplo (x+y)++ es ilegal
sect71 Para evidenciar la diferencia entre preincremento y postincremento observe las
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
salidas que se obtienen con este pequentildeo programa seguacuten se van ejecutando las diversas liacuteneas Para interpretarlas correctamente debe tener en cuenta la precedencia de los operadores y recordar que en todos los casos el argumento recibido por printf es un puntero-a-caraacutecter (char) Tambieacuten deben recordarse las reglas de aacutembito de los argumentos pasados a funciones
char s = Hola mundo
printf(Letra cn s) Letra H
printf(Letra cn s+1) Letra I
printf(Letra cn (s+1)) Letra o
printf(Letra cn s++) Letra H
printf(Letra cn s) Letra o
printf(Letra cn ++s) Letra l
printf(Letra cn s) Letra l
Como notas importantes a recordar siempre
En problemas de divisioacuten entre enteros C++ trunca la parte residual es decir
ltcodegt aacuterea de declaracioacuten de variables float a aacuterea de operaciones a = 10 4
aacuterea de despliegue de resultados desplegar a rarr En pantalla sale ( 2000000 ) ltcodegt El problema no es el tipo float sino que por definicioacuten de la divisioacuten
entre enteros C++ siempre trunca la parte residual mas adelante se indica como se resolveraacute este problema El operador () devuelve el residuo entero
de una divisioacuten entre enteros ejemplo ltcodegt aacuterea de declaracioacuten int alfa
aacuterea de operaciones alfa = 23 4 aacuterea de despliegue
desplegar alfa rarr El resultado en pantalla es 3
Otro ejemplo
alfa = 108 10
desplegar alfa rarr El resultado en pantalla es 8
ltcodegt
Para resolver los problemas de potencias y raiacuteces se usan ciertas instrucciones
especiales que proporciona el lenguaje llamadas funciones matemaacuteticas en C++ existe toda una libreriacutea de instrucciones o funciones matemaacuteticas
Recordar que todas las funciones reciben uno o maacutes datos o valores y regresan
siempre un resultado una de estas funciones matemaacuteticas es
includeltmathhgt
doublepow(double base doubleexp)
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
Esta funcioacuten ocupa dos valores o datos( base y exp) ambos de tipo double y
regresa un resultado tambieacuten de tipo double ejemplo
Resolver el problema de calcular
includeltmathhgt
aacuterea de declaracioacuten de variables
double base exponente potencia
aacuterea de asignacioacuten o carga o inicializacioacuten de
variables
base=5
exponente=3
aacuterea de operaciones
potencia =pow( base exponente)
Despliegue
desplegar potencia -gt El resultado en pantalla es 125000000000
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc
Para resolver el problema de raiacuteces se aprovecha una de las mas elementales
y conocida de las leyes de exponentes que dice
Es decir una raiacutez cualquiera se puede transformar a una potencia con un exponente fraccionario
Ejemplo
problema ltmgt y = 3sqrtx ltmgt esto es equivalente a entonces
usando funcioacuten pow y= 3pow(x 05)
En este ejemplo se esta dando por supuesto que no interesa el tipo de dato que requiere la funcioacuten pow() para trabajar correctamente RESUMEN En C++ se puden resolver con la ayuda de estos operadores
toda clase de problemas ya sean financieros algebraicos de negocios contables etc