我有以下功能:
int conMS(time_in_seconds) {
int minutes, seconds;
minutes = time_in_seconds / 60;
seconds = time_in_seconds % 60;
return minutes, seconds;
}
Run Code Online (Sandbox Code Playgroud)
当在另一个函数中使用时,我收到几条错误消息:
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;
Run Code Online (Sandbox Code Playgroud)
无论如何,有没有办法可以从函数返回两个值.这两个值可以是任何东西:a int和a char,a float和a int......
我很抱歉,如果这对你来说很简单,但我是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;
}
Run Code Online (Sandbox Code Playgroud)
稍后您将此函数称为:
conMS( 210, &minutes, &secs) /* Where minutes, secs are defined integers */
Run Code Online (Sandbox Code Playgroud)
这将为变量分配时间(以秒为单位)并为变量minutes分配秒数secs
Bat*_*eba 18
两种选择:
1)传递指向要修改的变量的指针.然后你的函数原型变成了
int conMS(time_in_seconds, int* minutes, int* seconds)
Run Code Online (Sandbox Code Playgroud)
2)使用struct包含minutes和seconds作为成员并返回.
我更喜欢(1),因为在(2)的情况下,我总是担心不必要的价值副本,并且我依赖于返回值优化时会感到紧张,因为它本质上是一个编译器选择而不是标准C的强制要求.此外,调用者语法comMS(time_in_seconds, &minutes, &seconds)告诉我期望 minutes和seconds被修改.
一些约定也随着选项(1)增长:零结果通常表示成功,非零表示失败.
小智 9
您可以创建struct并返回它
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;
}
Run Code Online (Sandbox Code Playgroud)
你可以使用指针..
void conMS(int time_in_seconds, int * minutes, int * seconds)
{
*minutes = time_in_seconds / 60;
*seconds = time_in_seconds % 60;
}
Run Code Online (Sandbox Code Playgroud)
你可以这样称呼它......
int time = 187;
int m, s;
conMS(time, &m, &s);
Run Code Online (Sandbox Code Playgroud)