如何在C中返回两个值

时间:2013-12-30 10:38:57

标签: c

我有以下功能:

int conMS(time_in_seconds) {
  int minutes, seconds;
  minutes = time_in_seconds / 60;
  seconds = time_in_seconds % 60;
  return minutes, seconds;
}

当在另一个函数中使用时,我收到几条错误消息:

warning: left-hand operand of comma expression has no effect [-Wunused-value]
warning: left-hand operand of comma expression has no effect [-Wunused-value]
 minutes,seconds = conMS(time);
warning: ‘minutes’ is used uninitialized in this function [-Wuninitialized]
warning: left-hand operand of comma expression has no effect [-Wunused-value]
 return minutes, seconds;

无论如何,有没有办法可以从函数中返回两个值。这两个值可以是任何内容:intcharfloatint ......

我很抱歉,如果这对你来说很简单,但我是C的初学者,我能学到的唯一方法就是提问。另外,请尽量简化您的解释。

更新:这可以通过指针轻松完成,如下所示。

void conMS(int time, 
int *minutesP, /* a pointer to variable minutes */
int *secondsP) // a pointer to variable seconds //
{ 
    *minutesP = time / 60; 
    *secondsP = time % 60; 
}   

稍后您将此函数称为:

conMS( 210, &minutes, &secs)    /* Where minutes, secs are defined integers */ 

这会将时间(以秒为单位)分配给变量minutes,并为变量secs指定秒数

6 个答案:

答案 0 :(得分:18)

两种选择:

1)传递指向要修改的变量的指针。然后你的函数原型变成

int conMS(time_in_seconds, int* minutes, int* seconds)

2)使用包含structminutes成员的seconds作为会员并返回。

我更喜欢(1),因为在(2)的情况下,我总是担心不必要的价值副本,并且在依赖返回值优化时会感到紧张,因为它本质上是编译器的选择,标准C没有强制要求。此外,来电者语法comMS(time_in_seconds, &minutes, &seconds)告诉我期望 minutesseconds被修改。

一些惯例也随着选项(1)的增长而增长:零结果通常表示成功,非零表示失败。

答案 1 :(得分:9)

您可以创建结构并将其返回

struct time{
   int minutes;
   int seconds;
};

struct time conMS(time_in_seconds)
{
   struct time ret;
   ret.minutes = time_in_seconds / 60;
   ret.seconds = time_in_seconds % 60;
   return ret;
}

答案 2 :(得分:7)

你可以使用指针..

void conMS(int time_in_seconds, int * minutes, int * seconds)
{
    *minutes = time_in_seconds / 60;
    *seconds = time_in_seconds % 60;
}

你可以这样称呼它......

int time = 187;
int m, s;

conMS(time, &m, &s);

答案 3 :(得分:3)

您一次不能return来自某个函数的2个值。 您可以将这些值放在结​​构中,return结构如下所示:

typedef struct time
{
    int minutes;
    int seconds;
}Time;

Time conMS(int time_in_seconds)
{
    Time t;
    t.minutes = time_in_seconds / 60;
    t.seconds = time_in_seconds % 60;
    return t;
}

答案 4 :(得分:3)

使用结构包含分钟和秒并返回结构。

struct time{
    int hours;
    int minutes;
    int seconds;
};

struct time conMS(time_in_seconds)
{
    struct time t;
    int minutes, seconds;
    minutes = time_in_seconds / 60;
    seconds = time_in_seconds % 60;

    t.minutes = minutes;
    t.seconds = seconds;

    return t;
}

答案 5 :(得分:2)

根据您的要求声明一个包含变量的结构,并返回该结构的对象。

struct name
{
   int  minutes;    
   int  seconds;
};

struct name conMS(time_in_seconds)
{
   struct name obj;        /*structure object which contains both*/ 
   obj.minutes = time_in_seconds / 60;
   obj.seconds = time_in_seconds % 60;
   return obj;
}


main()
{
    struct name obj = canMS(60);
    printf( " %d   %d \n", obj.minutes, obj.seconds ) ;
}

obj.minutes& obj.seconds是你的变量。