Parámetros de salida en C

2 minutos de lectura

avatar de usuario
usuario1128265

void swap(int &first, int &second){
    int temp = first;
    first = second;
    second = temp;
}
int a=3,b=2;
swap(a,b);

El compilador se queja de que void swap(int &first, int &second) tiene un error de sintaxis. ¿Por qué? ¿C no admite referencias?

  • Los intercambios XOR y similares pertenecen al IOCCC, no en código real o como consejo para principiantes.

    –Matti Virkkunen

    4 de febrero de 2012 a las 21:16

C no admite pasar por referencia; esa es una característica de C++. Tendrás que pasar punteros en su lugar.

void swap(int *first, int *second){
    int temp = *first;
    *first = *second;
    *second = temp;
}

int a=3,b=2;
swap(&a,&b);

avatar de usuario
místico

C no admite pasar por referencia. Por lo tanto, deberá usar punteros para hacer lo que está tratando de lograr:

void swap(int *first, int *second){
    int temp = *first;
    *first = *second;
    *second = temp;
}


int a=3,b=2;
swap(&a,&b);

hago NO recomienda esto: Pero lo agregaré para completar.

Puede usar una macro si sus parámetros no tienen efectos secundarios.

#define swap(a,b){   \
    int _temp = (a); \
    (a) = _b;        \
    (b) = _temp;     \
}

para el intercambio de enteros, puede usar este método sin una variable local:

int swap(int* a, int* b)
{
    *a -= *b;  
    *b += *a;  
    *a = *b - *a; 
}

  • Debiera ser void swap(int* a, int* b) para evitar el warning: control reaches end of non-void function (nunca está de más comprobar if (*a != *b) antes de cambiar…)

    –David C. Rankin

    30 de mayo de 2017 a las 5:06


  • Por favor, oh por favor, no uses esto. Aparte de tener un tipo de retorno incorrecto y de ser más difícil de leer que el tipo con una variable temporal, es más lento en casi todas las arquitecturas. Lo único que cuesta una tercera variable es un registro temporal.

    – nmichaels

    15 de marzo de 2019 a las 16:22

¿Ha sido útil esta solución?