Блог пользователя Madiyar

Автор Madiyar, история, 9 лет назад, По-английски

Small brainteaser. Do you know that function below doesn't work in some cases.
Try to attack it.

#include <iostream>

using namespace std;

void swap(int &a, int &b){ 
	a = a + b; 
	b = a - b; 
	a = a - b;
}
  • Проголосовать: нравится
  • +55
  • Проголосовать: не нравится

»
9 лет назад, # |
Rev. 2   Проголосовать: нравится +42 Проголосовать: не нравится

attempt in edit.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +37 Проголосовать: не нравится

    Yeap, it is true. But more interesting example is swap(a[i], a[j]), and accidentally i == j.

»
9 лет назад, # |
  Проголосовать: нравится +37 Проголосовать: не нравится

do you mean the overflow, when a + b > 2^31 — 1

»
9 лет назад, # |
Rev. 2   Проголосовать: нравится +16 Проголосовать: не нравится

do not work if *a == *b

even it occurs overflow, it works well

»
9 лет назад, # |
  Проголосовать: нравится +23 Проголосовать: не нравится

int a=12; swap(a,a);

»
9 лет назад, # |
Rev. 13   Проголосовать: нравится +1 Проголосовать: не нравится

best swap function without overflows :)

void swap (int &a, int &b){ 
  if (&a != &b ) { 
	a ^= b; 
	b ^= a; 
	a ^= b;
      }
}
why downvotes ? :D epic 
  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится -26 Проголосовать: не нравится

    Does not work if value of a is equal to value of b. In this case after XOR operation a and b will be equal to zero.

»
9 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

that's why Mozilla created Rust. In this language any attempt to call swap(a, a) will lead to compile-time error. Prooflink: http://is.gd/m65CVw