Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-我应该在函数中返回结果还是将其保存在参数指针指向的变量中?_C - Fatal编程技术网

C-我应该在函数中返回结果还是将其保存在参数指针指向的变量中?

C-我应该在函数中返回结果还是将其保存在参数指针指向的变量中?,c,C,我不知道哪种风格更适合用C编写函数: int function() { /*code block*/ return result; } 或 就个人而言,我认为第一种更清晰(就像Java风格),但当我看到C中的一些函数被声明为第二种风格时,比如gets(),shmget(),我的算法课程老师建议我写第二种风格的声明,比如create_Queue(Queue*q),我想知道第二种是否是C样式,我应该遵循。第一种样式非常适合像int,double等小类型 第二种方法对于大于i

我不知道哪种风格更适合用C编写函数:

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);