简体   繁体   中英

Why is my output 5 and 0 instead of 6 and 5, please help me

why my code output is 5 and 0,not the 6 and 5. I think i should get the 6 and 5. I am a newer.Please help me.

#include <stdio.h>
int swap(int a,int b);
int main()
{   int x =5;
    int y =6;
    printf("%d %d\n",x,y);
    int number[2]={swap(x,y)};
    x=number[0];
    y=number[1];
    
    printf("%d %d\n",x,y);
    return 0;
}
int swap(int a,int b)
{
    return b,a;
}

There are several things wrong here.

First, you can't return multiple values in C, like you can in Python. return b, a; uses the comma operator , which evaluates both its operands and returns the second one. So this is equivalent to just return a; .

Second, your array initializer is only initializing the first element of the array. There's only one expression in the initialization braces, so that initializes number[0] . The remaining elements of the array are initialized by default to 0 .

Combining both of these, it's equivalent to:

int number[2] = {y, 0};

I can see you are new to C programming. The problem is in your swap() function. You're using a language construct that does not exist in C, namely tuples. Check out pointers for a proper way to return multiple values from a function.

This function...

 int swap(int a,int b)

... returns one int , as its prototype says.

This statement...

 return b,a;

... involves C's comma operator , , which evaluates its left-hand operand, discards the result, then evaluates to the value of its right-hand operand. Since evaluating b has no side effects in your case, that return statement is equivalent to

return a;

In C, it is valid to initialize an array with fewer explicit elements than the length of the array. For an automatic (local, non- static ) array such as yours, as long as at least one element is initializer, all elements not explicitly initialized are implicitly initialized (to 0 in the case of int elements). Thus, for your implementation of swap() , this...

 int number[2]={swap(x,y)};

... is equivalent to

    int number[2] = { x, 0 };

, which explains the output.

Here is a way to solve your problem.

#include <stdio.h>

void swap(int *a,int *b);

int main()
{
    int x = 5;
    int y = 6;
    swap(&x, &y);
    printf("post swap x = %d, y =  %d\n", x, y);
    return 0;
}

// No need to return anything, we change the x, y values using the pointer
// This is passing by reference. Instead of passing the value, we are
// passing the reference (i.e address of the variable). swap function can
// now directly access the values and change them
void swap(int *a, int *b)
{
    int tmp;
    printf("Swap got a = %d, b = %d\n", *a, *b);   // Note: we access value of a pointer using * in front of the pointer varaible
    tmp = *a;
    *a = *b;
    *b = tmp;
}

outputs:

bhakta: /tmp$ cc x.c
bhakta: /tmp$ ./a.out
Swap got a = 5, b = 6
post swap x = 6, y =  5

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM