Operadores de asignación

Existen varios operadores de asignación, el más evidente y el más usado es el "=", pero en C++ este no es el único que existe.

Aquí hay una lista: "=", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", " ^=" y "|=". Y la sintaxis es:

<variable> <operador de asignación> <expresión> 

En general, para todos los operadores mixtos la expresión:

E1 op= E2

Tiene el mismo efecto que la expresión:

E1 = E1 op E2

El funcionamiento es siempre el mismo, primero se evalúa la expresión de la derecha, se aplica el operador mixto, si existe y se asigna el valor obtenido a la variable de la izquierda.

Los operadores del segundo al sexto son combinaciones del operador de asignación "=" y de los operadores aritméticos que hemos visto en el punto anterior. Tienen las mismas limitaciones que ellos, es decir, el operador "%=" sólo se puede aplicar a expresiones enteras.

El resto de los operadores son operadores de bits, y los veremos más adelante, en otro de los capítulos dedicado a operadores.

Operador coma

La coma tiene una doble función, por una parte separa elementos de una lista de argumentos de una función. Por otra, puede ser usado como separador en expresiones "de coma". Ambas funciones pueden ser mezcladas, pero hay que añadir paréntesis para resolver las ambigüedades. Sintaxis:

E1, E2, ..., En 

En una "expresión de coma", cada operando es evaluado como una expresión, pero los resultados obtenidos anteriormente se tienen en cuenta en las subsiguientes evaluaciones. Por ejemplo:

func(x, (y = 1, y + 2), 7);

Llamará a la función con tres argumentos: (x, 3, 7). La expresión de coma (y = 1, y+2), se evalúa de izquierda a derecha, y el resultado de la última evaluación se pasará como argumento a la función.

Es muy frecuente usar estas expresiones dentro de bucles "for", (que veremos en el próximo capítulo). Por ejemplo:

for(i = 0, j = 1; i < 10; i++) ...

Aquí vemos una expresión de coma que usamos para inicializar dos variables en la zona de inicialización del bucle.

No es aconsejable abusar de las expresiones de coma, aunque sólo sea porque apenas se usan, y suelen despistar a los que interpretan el código.

Por ejemplo, intenta predecir el valor de los parámetros de esta llamada a función:

func(19, (x=0, x+=3, x++), 12);

Si has dicho: 19, 4 y 12, te has equivocado :).

Nota: recuerda que el operador de postincremento se evalúa después de evaluar la sentencia, en este caso, después de la llamada a la función.

Operadores de comparación

Estos operadores comparan dos operandos, dando como resultado valores booleanos, true (verdadero) o false (falso), dependiendo de si los operandos cumplen o no la operación indicada.

Son "==" (dos signos = seguidos), "!=", "<", ">", "<=" y ">=", que comprueban relaciones de igualdad, desigualdad y comparaciones entre dos valores aritméticos. Sintaxis:

<expresión1> == <expresión2>
<expresión1> != <expresión2>
<expresión1> > <expresión2>
<expresión1> < <expresión2>
<expresión1> <= <expresión2>
<expresión1> >= <expresión2>

Si el resultado de la comparación resulta ser verdadero, se retorna true, en caso contrario false. El significado de cada operador es evidente:

== igualdad

!= desigualdad

> mayor que

< menor que

>= mayor o igual que

<= menor o igual que

En la expresión "E1 <operador> E2", los operandos tienen algunas restricciones, pero de momento nos conformaremos con que E1 y E2 sean de tipo aritmético. El resto de las restricciones las veremos cuando conozcamos los punteros y los objetos.

Expresiones con operadores de igualdad

Cuando se hacen comparaciones entre una constante y una variable, es recomendable poner en primer lugar la constante, por ejemplo:

if(123 == a) ...
if(a == 123) ...

Si nos equivocamos al escribir estas expresiones, y ponemos sólo un signo '=', en el primer caso obtendremos un error del compilador, ya que estaremos intentando cambiar el valor de una constante, lo cual no es posible. En el segundo caso, el valor de la variable cambia, y además el resultado de evaluar la expresión no dependerá de una comparación, sino de una asignación, y siempre será true, salvo que el valor asignado sea 0.

Por ejemplo:

if(a = 0) ... // siempre será false
if(a = 123)... 
  // siempre será <b>true</b>, ya que 123 es distinto de 0

El resultado de evaluar la expresión no depende de "a" en ninguno de los dos casos, como puedes ver.

En estos casos, el compilador, en el mejor de los casos, nos dará un "warning", o sea un aviso, pero compilará el programa.

Nota: los compiladores clasifican los errores en dos tipos, dependiendo de lo serios que sean:

"Errores": son errores que impiden que el programa pueda ejecutarse, los programas con "errores" no pueden pasar de la fase de compilación a la de enlazado, que es la fase en que se obtiene el programa ejecutable.

"Warnings": son errores de poca entidad, (según el compilador que, por supuesto, no tiene ni idea de lo que intentamos hacer). Estos errores no impiden pasar a la fase de enlazado, y por lo tanto es posible ejecutarlos. Debes tener cuidado si tu compilador de da una lista de "warnings", eso significa que has cometido algún error, en cualquier caso repasa esta lista e intenta corregir los "warnings".

Comentarios de los usuarios (18)

JuDelCo
2011-01-04 17:47:42

Me hubiera gustado un ejemplo más del operador de Coma. Me he quedado a cuadros cuando lo he visto. No sabía que se podía xD

Pau
2011-06-26 10:46:40

No sabía que existiera un "operador coma". Cada día se aprende algo.

Adri
2014-12-21 17:57:16

Información extra:

-Es importante tener en cuenta el orden en el que se

asignan valores a las variables. Por ejemplo, si empiezas

diciendo que a=b y despues que b=1, a no vale 1, sino lo

que tenia asignado antes b. Si antes a no tenia asignado

ningun valor, producirá un error, pero el compilador lo

dejará pasar.

Adri
2014-12-21 17:58:40

¿Que significa <b> </b>?

Steven R. Davidson
2014-12-31 15:37:33

Hola Adri,

Una aclaración: no se producirá un error, pero es posible que el compilador lance un aviso, porque en el caso que mencionas 'a' no contendrá un valor conocido, sino "basura".

Steven

Steven R. Davidson
2014-12-31 15:38:13

Hola Adri,

Tiene que ver con HTML, para poner el contenido en negrita; o sea, no tiene nada que ver con C++.

Steven

Luis
2015-03-19 21:02:55

en el ejemplo donde pide resolver la funcion con ejemplo de "comas" cual seria el resultado y si alguien puede tambien que me de una explicacion del porque.

Luis
2015-03-19 21:04:17

me referia a este ejemplo func(19, (x=0, x+=3, x++), 12);

Steven R. Davidson
2015-03-19 23:41:08

Hola Luis,

El operador de la coma en una expresión representa la operación de secuencia; es decir, realiza las (sub)expresiones separadas en secuencia de izquierda a derecha. Mirando el ejemplo, evaluamos las subexpresiones en el siguiente orden:

x=0
x+=3
x++

y el valor evaluado es 3, aunque 'x' contendrá posteriormente el valor de 4. Al final, se realizará esta invocación:

func( 19, x, 12 );  // donde 'x' contiene 3

La parte que seguramente confunde es que evaluamos 'x++' y por tanto, se incrementa de 3 á 4. Sin embargo, hay que tener en cuenta que se trata de un incremento póstumo. Esto significa que el operador ++ es evaluado, pero su efecto es demorado hasta después de evaluar la expresión.

Espero haber aclarado la duda.

Steven

Luis
2015-03-19 23:53:56

Gracias por la pronta respuesta, sin embargo aun no me queda del todo claro; la parte que no entiendo muy bien es en que momento x valdra 4 en la ejecucion de la funcion.

Steven R. Davidsons
2015-03-20 02:56:29

Hola Luis,

En este ejemplo, al terminar de evaluar: (x=0, x+=3, x++), 'x' contendrá 4.

Steven

Brandon
2015-10-21 19:09:24

Hola, tengo una duda en el ejemplo;

for(i = 0, j = 1; i < 10; i++)

Por que i=0 tiene "," y en j=1 tiene ";" podrian explicarme la diferencia, gracias.

Steven R. Davidson
2015-10-25 18:25:54

Hola Brandon,

No son términos comparables. El punto y coma existe porque forma parte de la sintaxis del bucle 'for'; esto es,

for ( <expr1> ; <expr2> ; <expr3> )  <sentencia>

La coma es un operador que sirve para formar una secuencia de expresiones, las cuales se ejecutan en orden de izquierda a derecha. El comportamiento del ejemplo sería el siguiente:

i = 0
j = 1
¿ i < 10 ?  No => Terminamos el bucle
Sí => seguimos,
<sentencias>
i++
¿ i < 10 ?  No => Terminamos el bucle
Sí => seguimos,
<sentencias>
i++
...

El código del ejemplo se podría reescribir de una forma equivalente:

i = 0;
for( j = 1; i < 10; i++ ) ...

Espero que esto te oriente.

Steven

luis
2015-11-19 16:36:38

buenos días amigos. aunque siempre he tenido el interés en la programación, nunca lo había intentado así que soy nuevo en esto. así que quisiera que me explicaran como usar el compilador mingw

silvia martinez
2016-07-10 17:32:17

Hola necesito ayuda en esta linea de codigo:

x = ++ y*w <= ++ && !z >=12 || z/2;

quisiera saber por que me da este error

[Error] expected identifier before '!' token

SILVIA MARTINEZ
2016-07-10 17:35:54

hola me podrian revisar este programa y decirme por que me da como resultado 43? siempre me da 43... Ayuda por favor!!!

int leerNum()

{

int a;

cout <<"Ingrese numero \n";

cin >> a;

return a;

}

char leerSigno()

{

char signo;

cout <<"Ingrese un signo aritmetico \n";

cin >> signo;

return signo;

}

int operacion (int a, int b, char signo)

{

return signo == '-' ? a-b : signo == '+' ? a+b : signo == '*' ? a*b : signo == '/' ? a/b : 0;

}

main(void)

{

int a, b, operacion;

char signo;

a = leerNum();

b = leerNum();

signo = leerSigno();

operacion = (a, b, signo);

cout <<"EL RESULTADO DE LA OPERACION ES: %d" <<operacion;

getch();

system("pause");

}

Steven R. Davidson
2016-07-10 20:33:04

Hola Silvia,

El error está en el uso del segundo operador ++, el cual no tiene un operando.

El compilador intentaría validar la sub-expresión: <= ++ al igual que, ++ &&. Ninguna de estas subexpresiones es válida, por lo que se provoca un error sintáctico.

Espero que esto aclare la duda.

Steven

Steven R. Davidson
2016-07-10 20:44:18

Hola Silvia,

El error está en la asignación de la variable, 'operacion', la cual se basa una expresión y no en la invocación de la función, 'operacion()'. Escribes,

operacion = (a, b, signo);

La asignación siempre va a ser el valor de 'signo', que es el código ASCII del operador: '+', '-', etc..

Lo que te interesa es invocar la función 'operacion()'. Sin embargo, entrarás en un conflicto de nombre, porque la variable también se llama 'operacion'. Aconsejo cambiar el nombre; por ejemplo,

int a, b, res;
...
res = operacion(a, b, signo);

cout <<"EL RESULTADO DE LA OPERACION ES: " << res;

También date cuenta que no necesitas "%d" si usas 'cout'.

Espero que esto aclare la duda.

Steven