为什么使用int函数而不是void?

时间:2014-02-22 01:15:01

标签: c++

我正在查看一些示例函数和方法(我目前在C ++类中),我注意到有一些函数,而不是无效,它们就像

int myFunction() {
   // ...;
   return 0;
}

省略号显然是其他一些陈述。为什么他们归零?每次运行函数时返回特定值有什么意义?

我知道main()必须是int(至少根据标准),因为它与退出代码相关(或者是?),因此可以与操作系统一起使用。但是,我想不出非主要功能会这样做的原因。

有没有什么特别的原因可以让某人想要这样做,而不是简单地制作一个无效函数?

7 个答案:

答案 0 :(得分:8)

如果这真的是他们正在做的事情,无论函数做什么都返回0,那么它完全没有意义,他们不应该这样做。

在C世界中,int返回类型是一种约定,因此您可以返回自己的“错误代码”,但这不仅仅是惯用的C ++,而且如果您的程序员再次总是返回0,那就完全是愚蠢的。

具体做法是:

  

我知道main()必须是int(至少根据标准),因为它与退出代码相关(或者是?),因此可以与操作系统一起使用。但是,我想不出非主要功能会这样做的原因。

我同意。

答案 1 :(得分:7)

int函数有一个共同的约定,即成功返回0,失败时返回一些非零错误代码。

如果单独查看,总是返回0的int函数也可能是void函数。但是根据上下文,可能有充分的理由使其与返回有意义结果的其他函数兼容。这可能意味着函数的返回类型如果稍后被修改则不必更改,因此它会检测错误 - 或者它的声明可能需要与其他int - 返回函数兼容,如果使用的话作为回调或模板参数。

我建议在图书馆或程序中检查其他类似的功能。

答案 2 :(得分:2)

如果函数没有遇到任何错误,并且如果出现错误则返回非零值,这是一个惯例,特别是在C程序员中,返回0。

这已经延续到了C ++中,虽然由于异常处理和其他更加面向对象的处理错误的方式,它不太常见而且不太常见,但它确实经常出现。

答案 3 :(得分:2)

其他答案未涉及的另一个问题。省略号内可能是另一个return语句:

int myFunction() {
   // ...;
   if (error)
       return code;
   // ...;
   return 0;
}

在这种情况下,myFunction 总是 返回0,而只是在没有发生错误时。这些return语句通常比更结构化但更冗长的if/else代码块更受欢迎,并且通常可以在冗长,草率的代码中伪装。

答案 4 :(得分:1)

大部分时间这样的功能都应该返回void

另一种可能性是该函数是具有相同签名的一系列封闭相关函数之一。返回int值可以表示状态,例如返回0表示成功,其中一些函数总是成功。更改签名可能会破坏一致性,或者会使函数无法用作函数对象,因为签名不匹配。

答案 5 :(得分:1)

  

有没有什么特别的原因可以让某人想要这样做,而不是简单地制作一个无效函数?

为什么你的母亲在将烤肉放入烤箱之前切断烤肉的末端?答:因为这就是她的祖母所做的。然而,她的祖母这样做的原因很简单:她的烤盘不够大,无法容纳全尺寸的烤肉。

我使用的模拟工具在其最早的版本中要求模拟引擎可调用的所有函数必须返回成功状态:0 =成功,非零=失败。永远不会失败的函数被编码为始终返回零。模拟引擎已经能够容纳长时间返回空白的功能。返回一个整数成功代码是前一个千年所需的行为,并没有阻止货运程序员承担编写函数的行为,这些函数始终向前返回零。

答案 6 :(得分:0)

在某些编程语言中,您可以找到过程函数。在C,C ++和类似语言中,你没有。相反,你只有功能。

在实践中,过程是执行特定任务的程序的一部分。另一方面,函数就像一个过程,但函数可以返回回复。

由于C ++只有函数,你如何创建一个过程?那时你要么创建一个void函数或者返回你喜欢的任何值来表明任务是完整的。它不一定是0.如果你愿意,你甚至可以返回一个角色。

cout 语句为例。它只输出一些东西但不返回任何东西。这就像一个程序。

现在考虑像tan(x)这样的数学函数。这意味着使用x 返回回复调用它的程序。在这种情况下,您无法返回任何内容。您必须返回TAN操作的值。

因此,如果您需要编写自己的函数,则必须根据您正在执行的操作返回值。如果没有什么可以返回,你可以只写一个void函数或返回一个虚拟值,如0或其他任何东西。

在实践中,通常会发现函数返回0表示“一切都很顺利”,但这不一定是规则。

这是我要编写的函数示例,它返回一个值:

float Area ( int radius) 
{
float Answer = 3.14159 * radius * radius;
return Answer;

}

这将半径作为参数并返回计算出的答案(区域)。在这种情况下,你不能只说回0。

我希望这很清楚。