C-我应该在函数中返回结果还是将其保存在参数指针指向的变量中?
我不知道哪种风格更适合用C编写函数:C-我应该在函数中返回结果还是将其保存在参数指针指向的变量中?,c,C,我不知道哪种风格更适合用C编写函数: int function() { /*code block*/ return result; } 或 就个人而言,我认为第一种更清晰(就像Java风格),但当我看到C中的一些函数被声明为第二种风格时,比如gets(),shmget(),我的算法课程老师建议我写第二种风格的声明,比如create_Queue(Queue*q),我想知道第二种是否是C样式,我应该遵循。第一种样式非常适合像int,double等小类型 第二种方法对于大于i
int function()
{
/*code block*/
return result;
}
或
就个人而言,我认为第一种更清晰(就像Java风格),但当我看到C中的一些函数被声明为第二种风格时,比如
gets()
,shmget()
,我的算法课程老师建议我写第二种风格的声明,比如create_Queue(Queue*q)
,我想知道第二种是否是C样式,我应该遵循。第一种样式非常适合像int
,double
等小类型
第二种方法对于大于int
的返回值很有意义,比如structs
这有以下优点:
- 结果结构可以存在于堆栈或堆上,由调用方自行决定
- 不存在所有权问题,因为调用方显然负责分配和释放结果结构
- 该结构甚至可以比需要的更长,或者嵌入到更大的结构中
- 这主要是一个风格问题,因此有点主观。你可以根据具体情况使用任何一种形式
但是,表单
void函数(int*result)
的优点是可以为错误代码保留返回值。编写库是一种习惯做法,这样API中的每个函数都返回相同类型的错误类型
保留错误代码的返回值也意味着如果调用方对函数结果不感兴趣,他们可以通过键入
(void)function(x)忽略它代码>对于简单的情况,例如只返回int的函数,第一种样式更清晰、更直接
第二种样式在某些情况下是首选的,例如,如果您希望从函数返回多个值。根据C标准,函数只能返回一个值,因此要返回第二个值,可以传递指向该函数的指针,该函数可以更新该指针。下面是一个假设的例子来说明这一点:
char *getline(FILE *f, int *size);
考虑一个函数getline
,它返回一个表示文件中一行的字符串,因为它正在读取一行,所以您必须知道该行的长度,要获得该长度,您需要向函数传递一个指向int的指针,该指针将在读取该行后更新。从性能的角度来看,这也是很好的,因为函数getline
,在本例中,它正在努力扫描文件中的字符,因此它还可以返回行的大小。否则,在取回字符串后,您必须自己调用strlen()
,这将重复相同的任务。这个小技巧有助于将许多CPU指令保存在性能关键型代码中。您的问题对本网站来说太多了。请注意:还有其他事情要考虑。如果queue\u create
分配了一个对象,我个人认为最好返回该对象(如图所示,不能返回带有指向该对象指针的对象)。否则,对于一个好的设计来说,还有其他的事情要考虑。如果返回值更“自然”,则应首选该值。它不适用于fgets
(永远不要使用gets
!如果你的老师告诉你使用它,他应该先学习C)它完全取决于上下文。两个都不比另一个好。第一个可以用于直接赋值,如result=function()另一个在调用函数之前需要声明和定义结果
。不要比较Java和C,它们来自两个不同的世界,有不同的优点和缺点。除非您需要执行第二个版本(可能没有有效的结果,并且您需要通过返回状态通知调用方),否则我认为这只会使您的代码(以及调用站点)复杂化没有任何理由。如果函数的结果要在表达式中使用,如sin(x)*pow(y,z)
char *getline(FILE *f, int *size);