Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

590
Views
¿Por qué "A = A + B - (B = A)" intercambia valores en C?

Para cambiar a números enteros, A y B, esto parece funcionar en C,

 A = A + B - ( B = A);

¿Por qué funciona esto? Y si esto funciona en todas las condiciones, ¿se puede usar para acortar cualquier otro algoritmo comúnmente implementado?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

En realidad, invoca un comportamiento indefinido de acuerdo con los estándares.

C99 §6.5: “2. Entre el punto de secuencia anterior y el siguiente, el valor almacenado de un objeto se modificará como máximo una vez mediante la evaluación de una expresión. Además, el valor anterior se leerá solo para determinar el valor que se almacenará.”

over 4 years ago · Santiago Trujillo Report

0

No debe confiar en que un código como ese funcione porque se basa en el hecho de que se procesa de izquierda a derecha.

Cualquier implementación que no lo haga así va a hacer que falle.

Debe evitar escribir código que no funcione en todos los casos en todas las plataformas y que no sea independiente del compilador, o que se base en cosas que no estén documentadas o bien definidas.

Entonces, ¿por qué funciona si vas de izquierda a derecha? Supongamos que A = 1 y B = 3
A = A + B - ( B = A);
A = 1 + 3 - (1) = 3
La asignación de B ocurre donde dejé el (). La conclusión es que solo cuando se procesa de izquierda a derecha, la asignación de B a A ocurre más tarde.

Al procesar de derecha a izquierda el mismo ejemplo: A = A + B - ( B = A);
A = 1 + 1 - (1) = 1
Ahora la asignación de B está ocurriendo primero.

Nuevamente, no debe confiar en el código que no está claro para el lector sobre lo que está sucediendo y que depende del compilador, como es el caso aquí.

over 4 years ago · Santiago Trujillo Report

0

Esto es solo "más corto" que la forma estándar/obvia de hacerlo, en la cantidad de líneas/puntos y comas utilizados.

  • Introduce operaciones adicionales que podrían impedir la optimización por parte del compilador.
  • Empeora la legibilidad (como lo menciona DR)
  • Utiliza (ab) un comportamiento no estándar (como lo menciona Marion), lo que podría hacer que falle con algunos compiladores

Nunca debes usarlo.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!