64 votos

Intercambiar dos variables sin utilizar una variable temp

Me gustaría poder intercambiar dos variables sin el uso de una variable temp en C#. ¿Esto se puede hacer?

decimal startAngle = Convert.ToDecimal(159.9);
decimal stopAngle = Convert.ToDecimal(355.87);

//swap each:
//startAngle becomes: 355.87
//stopAngle becomes: 159.9

219voto

paxdiablo Puntos 341644

El derecho de manera de intercambiar dos variables es:

decimal tempDecimal = startAngle;
startAngle = stopAngle;
stopAngle = tempDecimal;

En otras palabras, el uso de una variable temporal.

Ahí lo tienen. No hay trucos, no hay mantenedores de su código de la maldición que, durante décadas, no hay entradas para El Diario de la WTF, y no hay que gastar mucho tiempo tratando de averiguar por qué usted necesita en una sola operación de todos modos, ya que, en el nivel más bajo, incluso las más complejas característica del lenguaje es una serie de operaciones simples.

Acaba de una forma muy sencilla, fácil de leer, fácil de entender, t = a; a = b; b = t; de la solución.

En mi opinión, los desarrolladores que tratan de utilizar los trucos para, por ejemplo, "swap variables sin usar una temp" o "Duff del dispositivo" estamos tratando de mostrar lo inteligente que son (y fallando miserablemente).

Yo comparo a los que leen culta libros únicamente para el propósito de parecer más interesante en partes (en oposición a la expansión de sus horizontes).

Las soluciones que sumar y restar, o el XOR, son menos legibles y lo más probable es más lento que el de un simple "variable temp" solución (aritmética/boolean-ops en lugar de la llanura se mueve en un nivel de la asamblea).

Hacer por sí mismo, y otros, un servicio por escrito de buena calidad código legible.

Esa es mi queja. Gracias por escuchar :-)

Como un aparte, soy muy consciente de que esto no responde a tu pregunta específica (y voy a pedir disculpas por eso), pero hay un montón de precedentes en MODO donde las personas se han preguntado cómo hacer algo y la respuesta correcta es "no lo hagas".

113voto

CommuSoft Puntos 6439

sí, utilice este código:

startAngle = startAngle+stopAngle;
stopAngle = startAngle-stopAngle;
startAngle = startAngle-stopAngle;

73voto

Paul Sonier Puntos 25528

Sí, utilice este código:

    stopAngle = Convert.ToDecimal(159.9);
    startAngle = Convert.ToDecimal(355.87);

El problema es más difícil para valores arbitrarios. :-)

44voto

this. __curious_geek Puntos 23728
int a = 4, b = 6;

a^= b^= a^= b;

11voto

Jens Alfke Puntos 1031

No en C#. En el código nativo podría ser capaz de usar el truco del intercambio de XOR triple, pero no en un lenguaje de alto nivel de seguridad de tipos. (De todos modos, he oído que el truco de la XOR en realidad termina siendo más lento que usando una variable temporal en muchas arquitecturas de CPU común.)

Sólo debe usar una variable temporal. Hay ninguna razón que usted no puede usar no es que hay una oferta limitada.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X