在C语言中从一个函数返回多个值

3
int getPositionsH(int r, int ans, int size){
    int x=0;
    int y=0;
        if (ans==9){
            x =0;
        } else
            x=(rand()%size);

        y=(rand()%10);  
    return x;
    return y;
}

基本上,这是一个在c语言中返回两个随机生成的位置x和y的函数。然而,在调试时我注意到执行后x和y仍然为空。不知道为什么,因为我已经编写了return和所有内容。有任何想法吗?任何帮助都将不胜感激。


现在它没有返回任何东西吗? - Jibin Balachandran
2
你应该看看如何传递两个指针,一个用于x,一个用于y。正如其他人所指出的,函数只能返回单个值。在C语言中,我发现返回的值通常用于错误检查。要返回你想要的值,可以把内存地址传递到函数中,然后应用你的函数代码并将结果存储在内存地址中。当函数完成时,在内存地址中存储的值保持不变,并且不受范围变化的影响。 - NathanielJPerkins
4个回答

4

在C语言中,一个函数只能返回一个值。目前,该函数只返回x,而return y;语句没有作用--它是无法到达的代码。

如果你想返回多个值,可以通过传递指针并在它们的内容中返回这些值,或者创建结构体来返回值。

typedef struct position {
   int x;
   int y;
}pos_type;

pos_type getPositionsH(int r, int ans, int size){
    pos_type p;
    int x=0;
    int y=0;
        if (ans==9){
            x =0;
        } else
            x=(rand()%size);

        y=(rand()%10);  

    p.x = x;
    p.y = y;
    reutrn p;
 }

在调用者中:

pos_type t = getPositionsH(...);

int x = t.x;
int y = t.y;
.....

只有在最新的C标准中才允许返回结构体,更好的方法是传递结构体指针以返回多个值,并使用正确的数据填充结构体。 - Luis Colorado
@LuisColorado 通常在返回数据时,使用指针(而不是复制),这是一个好的习惯,但是对于小的结构体也可以。你是说在C11中不能通过值返回结构体吗?你能引用一些链接/参考资料来支持这个说法吗? - P.P
我之前参考的是C11之前的标准。如果需要引用,请阅读K&R。并非所有编译器都符合C11标准。在我的评论中,C11是我提到的最后一个C标准之一,因此它只是一条评论。你只知道/使用C11这个C标准吗? - Luis Colorado
@LuisColorado 不是的。你说“只允许在最新标准中使用”。所以我认为它是C11。如果你要谈论一个特定的标准,为什么不明确说明是哪个标准呢?如果不是C11,请指出哪个标准是无效的。除非你能引用正确的参考资料,否则你的说法是毫无根据和错误的。 - P.P
Kernighan&Ritchie的书《C程序设计语言》第一版禁止将结构体作为返回值或按值传递作为参数。更早的ANSI标准也禁止这样做,我不记得第一个ANSI C标准是否明确允许或禁止这样做。但是我对这个问题的第一个兴趣是澄清一些事情给原始提问者,他可能使用与您不同的编译器。而不是在这里与您讨论。 - Luis Colorado
@LuisColorado K&R第一版即使在80年代中期也已经过时了(但你想在2015年与它兼容)。自C89以来,没有任何C标准禁止这样做。因此,我不认为有任何理由提到某个代码结构仅在K&R1中无效。自1978年以来,C发生了很大变化。我怀疑是否有人使用40年前的编译器,更不用说在2015年学习C的新手了。 - P.P

1
你不能用这种方式返回两个值。
int getPositionsH(int r, int ans, int size)

声明为int返回值将只返回一个int。
 return x;
 return y;

在返回 x 后,程序执行将从函数中返回,因此 return y 将无法到达。


然而它甚至没有返回x...我不确定那是否是问题。 - chris
1
@chris:这确实是一个问题。但这并不意味着你没有其他问题。 - Lightness Races in Orbit

0

使用指针来处理xy。函数不再返回值,而是设置这些值:

void getPositionsH(int r, int ans, int size, int *x, int *y) {
    *x = ans == 9 ? 0 : rand() % size;
    *y = rand() % 10;
}

被称为

int x,y;
getPositionsH(r, ans, size, &x, &y);
// use x and y as you wish...
int total = x + 7 * y;

getPositionsH 接受两个指针(地址)x 和 y。使用 *x = 设置在函数调用之前声明的 x 的值。


注意

内容与编程有关。

    *x = ans == 9 ? 0 : rand() % size;

语句等同于

    if (ans == 9) *x = 0;
    else *x = rand() % size;

0

return x; return y;

你使用了 return x。这个函数将会返回值给调用它的函数,现在它不会再回来执行 return y。每当你使用 return 语句时,你需要明确它实际上是做什么。

return 语句终止了函数的执行并将控制权返回到调用函数

因此,你可以参考 this SO Q&A 来解决你的问题。其他答案也很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接