fork download
  1. // Safe swap integer. (1.00)
  2.  
  3. #include <limits.h>
  4. #include <stdio.h>
  5.  
  6. void swapint(int *a, int *b)
  7. {
  8. int t = *a; *a = *b; *b = t; // preferred
  9. }
  10.  
  11. void swapint_xor(int *a, int *b)
  12. {
  13. if (a != b)
  14. {
  15. *a ^= *b; *b ^= *a; *a ^= *b;
  16. }
  17. }
  18.  
  19. void swapint_add(int *a, int *b)
  20. {
  21. if (a != b)
  22. {
  23. __builtin_add_overflow(*a, *b, a);
  24. __builtin_sub_overflow(*a, *b, b);
  25. __builtin_sub_overflow(*a, *b, a);
  26. }
  27. }
  28.  
  29. int main(void)
  30. {
  31. typedef void (*swap_type)(int *, int *);
  32.  
  33. swap_type fs[] = {
  34. swapint,
  35. swapint_xor,
  36. swapint_add,
  37. 0
  38. };
  39.  
  40. for (swap_type *f = fs; *f; f++)
  41. {
  42. int a = 1;
  43. int b = INT_MAX;
  44. (*f)(&a, &b);
  45. printf("f(a,b): a = %d, b = %d; ", a, b);
  46. (*f)(&a, &a);
  47. printf("f(a,a): a = %d\n", a);
  48. }
  49. return 0;
  50. }
Success #stdin #stdout 0s 5304KB
stdin
Standard input is empty
stdout
f(a,b): a = 2147483647, b = 1; f(a,a): a = 2147483647
f(a,b): a = 2147483647, b = 1; f(a,a): a = 2147483647
f(a,b): a = 2147483647, b = 1; f(a,a): a = 2147483647