2010-07-27 12 views
9

Estos operandos pueden ser simples pero la dificultad de encontrar explicaciones que sean definitivas y completas me llevó a preguntar. ¿Cuáles son las combinaciones de caracteres que contienen un operando seguido de un signo igual (como * =, - =, + =, etc.), qué hacen y cómo son útiles (especialmente en campos no numéricos)?Cómo usar los símbolos + =, * =, - =

Los ejemplos y las definiciones serán muy apreciados.

Gracias

+3

Y Wikipedia no ayuda? http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B –

+0

Estos operadores aparecen en varios idiomas, pero elija uno solo para preguntar para poder dar mejores respuestas y evitar el spam de etiquetas. – danben

+0

Cualquier y toda esta información se puede encontrar fácilmente en wikipedia u otros sitios de referencia. – James

Respuesta

2

La gran ventaja es que se puede decir:

x += y; 

En lugar de la más prolija:

x = x + y; 

A veces esto es agradable cuando se trabaja con cadenas, como pueda use += para agregar texto a una cadena existente.

+3

Solo una nota, que usar '+ =' en cadenas debe evitarse si hay múltiples cadenas para concatenar , ya que el comportamiento de asignación es muy ineficiente. – Dathan

+1

Absolutamente. En el caso de C#, un StringBuilder sería más apropiado. –

1

Digamos que tiene x = 5. Si desea agregar 1 ax, lo puede hacer de muchas maneras:

x = x + 1; x += 1; x++; ++x;

Todos son equivalentes, y de elegir cualquiera de los deben dejar x con 6.

Básicamente, si quiere multiplicar, dividir o restar de x, simplemente cambie el operador + a lo que desee.


Disculpa, no he visto que hayas mencionado campos no numéricos. En C# y en C++, puede hacer algo llamado "sobrecarga del operador" para dar a un objeto no numérico la capacidad de utilizar estos operadores compuestos con una función y/o comparación definida por el usuario. Por ejemplo, las cadenas se tratan generalmente como objetos y no como tipos de datos primitivos, pero si ejecuta String s = "hello"; s += "!";, verá que s contendrá hello!. Eso es porque el objeto String tiene un operador sobrecargado para + = que aplica una anexar con el rvalue ("!" --right del operador + =) a la lvalue ("hello" --left del operador + =) .

Una pregunta relacionada en C sobrecarga # operador: Simple way to overload compound assignment operator in C#?

+3

Es importante tener en cuenta que x ++ y ++ x son diferentes, especialmente en el contexto de los bucles. – TreDubZedd

+0

x ++ y ++ x no son equivalentes, aunque finalmente terminará teniendo el mismo efecto. –

11

Son generalmente interpretarse en sentido amplio como:

x += y === x = x + y 

(etc para su elección del operador)

embargo; algunos idiomas le permiten tener un operador + = personalizado, o pueden interpretarlo de manera diferente en algunos escenarios; por ejemplo, en eventos C#, + = y - = significa "suscribirse a través del complemento para agregar" y "cancelar suscripción a través del acceso para eliminar", respectivamente.

lo general no son más que para ahorrar espacio, pero hay puede haber diferencias semánticas en algunos casos.


* = donde quiero decir: muy diferente a sólo el operador + y asignación

+0

+1 por mencionar usos alternativos. –

1

Estos son operadores de asignación compuestos. Para los campos numéricos, están definidos para agregar (+=), multiplicar (*=) y restar (-=) el valor a la derecha de la variable de la izquierda y asignar el resultado a la variable de la izquierda.

Sin embargo,, C++ admite "sobrecarga del operador". Es decir, para cualquier objeto dado, el programador puede definir qué sucede si escribe x += 12 y x pasa a ser un objeto de tipo Foo en lugar de int. Esto se hace comúnmente para las clases de cadena, por lo que si s1 = "All this" puede escribir s1 += " and more" y el resultado será "All this and more".

0

Con respecto a los campos no numéricos: lo que hacen los operadores es completamente arbitrario. En C/++/#, puede anular lo que hace un operador, que le permite escribir algo como:

MyObj += MyOtherObj; 
// MyObj is now null 

Cuando la sobrecarga de los operadores, que puede hacer realmente lo que quiera.

2

x += expression es más o menos lo mismo que x = x + (expression). En otras palabras, calcula el lado derecho, luego aplica el operador + al lado izquierdo y el resultado, y luego asigna ese resultado nuevamente al lado izquierdo.

Personalmente, no soy un gran admirador de ellos. El operador /= encuentro una amenaza particular, ya que hay muchos lenguajes relacionados con Pascal que usan eso para indicar la desigualdad booleana. Alguien familiarizado con quien se mezcla y trata de usarlo en C termina compilando código que produce algunos de los errores más extraños imaginables.

Sin embargo, son muy útiles cuando el lado izquierdo es algo grande, por lo que repetirlo arrojaría más ruido que iluminación.

1

Si quiere una explicación intente leer http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Compound-assignment_operators como alguien ya lo sugirió, básicamente a += b; es equivalente a a = a + b;. Es taquigrafía para hacer que su código sea más fácil de escribir y leer.

Éstos son algunos ejemplos:

/* Print all evens from 0 through 20 */ 
for(i = 0; i <= 20; i += 2){ 
    printf("%d\n", i); 
} 

/* Slow down at a linear pace */ 
/* Stop after speed is 0.1 or less */ 
while(speed > 0.1){ 
    speed /= 1.2; 
} 
speed = 0; 

Estos deberían explicarlo. Se aplica a las operaciones de bit a bit así como a la aritmética, pero no puedo pensar en ningún uso simple de la parte superior de mi cabeza y no quiero confundirte. Existe el viejo truco de intercambio sin temp. - a ^= b ^= a ^= b; - que intercambiará los valores de ayb sin tener que crear una variable temporal, pero no estoy seguro de saber cuál es la operación de XOR a nivel de bit en este momento, así que don ya lo leí.

11

Casi todas las respuestas afirman que x + = y; es "equivalente" a "x = x + y;"

Esto no es realmente cierto.No son exactamente equivalentes por varias razones.

En primer lugar, los efectos secundarios solo se realizan una vez. Supongamos que tiene

class C { public string S { get; set; } } 
class D 
{ 
    private static C c = new C(); 
    static C M() 
    { 
     Console.WriteLine("hello!"); 
     return c; 
    } 
} 

La primera línea a continuación imprime "hola" una vez, como era de esperar. El segundo lo imprime dos veces.

D.M().S += "abc"; 
D.M().S = D.M().S + "abc"; 

En segundo lugar, el sistema de tipos funciona de manera diferente para la asignación compuesta que para la asignación normal.

short b = 1; 
short c = 2; 
b += c; 
b = b + c; 

La tercera línea es legal. La cuarta línea no es; un corto más un corto es un int en C#, entonces b = b + c es una asignación ilegal de un int a un corto. En este caso, la asignación compuesta es en realidad equivalente a b = (corto) (b + c);

Si este tema le interesa, lo invito a leer las secciones 7.17.2 y 7.17.3 de la especificación C#.

+0

"los efectos secundarios solo se realizan una vez". ¿Por qué es esto así (además de que está escrito en la especificación)? ¿No es esto un defecto de diseño? Debido a esto, las clases que sobrecargan '+' pueden, bajo ciertas circunstancias, no ser usadas junto con '+ ='? Pero el autor de la clase no tiene forma de evitar que el usuario lo haga de todos modos ... Entonces, si + = no es "idéntico" a +, al menos deberíamos tener la oportunidad de sobrecargarlo (parcialmente). – user492238

+0

@ user492238: No, no es un defecto de diseño. Creo que la mayoría de los usuarios esperarían que GetDatabaseRecord(). TotalPrice + = newTaxes; solo llama a GetDatabaseRecord * una vez *. Sería un error de diseño llamarlo dos veces. –

+0

@ user492238: En cuanto a su segunda pregunta, no la entiendo. ¿Puedes dar un ejemplo de donde x = x + y y x + = y deberían tener una semántica diferente? Yo diría que un tipo que tiene una diferencia entre adición regular y asignación de asignación compuesta tiene algunos problemas de diseño. Sería muy sorprendente para mí. –

Cuestiones relacionadas