为啥我们需要 void 函数? [关闭]

Posted

技术标签:

【中文标题】为啥我们需要 void 函数? [关闭]【英文标题】:Why do we need void functions? [closed]为什么我们需要 void 函数? [关闭] 【发布时间】:2016-09-24 20:57:17 【问题描述】:

我们需要 void 函数有什么深奥的原因吗?

出于同样的原因int main() 是一个标准,为什么不简单地从不需要返回值的函数中返回0?我看到使用 int 类型的三个直接优势: 1.我们可以返回一个代码来表示函数状态;通常,如果出现问题,我们可以返回非零错误代码。 2.我们可以在调试的时候输出函数的返回值 3. 这是 main() 例程的标准;即int main() 。为什么不跟风?

有什么理由让我们更喜欢void 而不是int

示例:对奶酪数组进行排序并通过引用返回的函数。

#include <iostream>
#include <string.h>

int sortArrayInt(string & _cheese[])  // pun intended ;D
    int errCode = 0;
    try 
        // ..sort cheese[] array
     catch(e) 
        errCode = 1;
    
    return errCode;


void sortArrayVoid(string & _cheese[]) 
    // .. sort cheese[] array
    // no return code to work with, doesn't follow int main() standard, and nothing to output.


int main() 
    string cheese[5] = "colby","swiss","cheddar","gouda","brie";
    std::cout << "Sort Status: " << sortCheeseArrayInt(cheese) << std::endl;
    sortArrayVoid(cheese);
    // ..print cheese array


OUTPUT:
Sort Status: 0
brie, cheddar, colby, gouda, swiss

【问题讨论】:

从纯粹的技术方面来看,我认为您不必具有 void 功能。从编程的角度来看,如果函数不需要发出任何信号,为什么要返回一些东西? 所以...您建议 some 函数返回一个有意义的值,而 some 返回一个 maybe有意义的结果代码可能根本没有意义,但必须总是返回?听起来很糟糕。 我很确定大多数情况下都存在异常,因为返回错误代码很不方便。每个与我交谈过的关于异常的程序员都会接受异常而不是返回码。对于您的奶酪示例...您可以从 void 函数输出一些内容...您可以输出它排序的奶酪。无论如何,这才是它创造的真正价值。 有人能解释一下为什么这个问题会得到如此多的反对吗?不管你是否同意他的观点,这对我来说都是一个不错的问题。 @Hill,我没有投反对票,但这个问题对很多人来说并没有多大意义。 【参考方案1】:

当函数业务逻辑不需要它时,没有理由返回整数。不这样做的原因如下:

意图清晰。如果你不返回一个值,每个人都知道函数不返回一个值。调用者无需费解自己试图理解如何处理返回值 0。 编译器会为您进行检查。如果您尝试在没有预期值时(错误地)返回值(或在没有提供值时读取值)编译器会警告您 返回值不是免费的。为什么要把周期浪​​费在不需要的东西上?

【讨论】:

..那么为什么int main()是标准? @kmiklas,我已经回答过了。 main 在很多方面都是一个例外。它可以有 2 个或 0 个参数的形式(C 中没有其他函数可以这样做),它有一个 int 的返回类型,但可能会错过 return 语句(任何其他函数的错误),它不能直接从您的代码中调用,依此类推。不要将您的函数与 main 进行比较,它们不是同一类公民。【参考方案2】:

在 c/c++ 中,如果您不需要使用某些东西,则不应该为它付费。

如果需要返回int,则返回int并支付,否则不返回(无效),不支付任何费用。

另外请注意这样的功能:

int itoa(const char * str) 

实际上不能报错,因为0和-1是有效的返回值。

从函数式语言的角度来看,如果函数返回值,这是一个经典函数,如果不是,这是一个过程,其目的是产生一些副作用。这种区别在命令式语言中也很有用。

【讨论】:

我想知道为什么这会被否决... 可能来自使用“C/C++”,虽然我可能是错的。 我希望 SO 强制发表评论并投反对票。【参考方案3】:

Main 返回 int 是因为调用者(执行环境)也需要它吗?为什么你认为一个程序应该或不应该返回一个值?

没有什么可以阻止你声明你的函数返回一个值而不是使用那个值。但这对于呼叫者来说并不好。将函数显式声明为 void 会告诉调用者该函数不返回任何内容。这允许调用者做出相应的行为,而无需存储或担心返回值。在 C++ 中有一个适当的机制来捕获错误行为,它被称为“异常处理”。

【讨论】:

【参考方案4】:

C++ 的主要设计目标之一是避免让人们仅仅因为有人可能需要而为他们不需要的东西付费。如果你有一个函数返回和 int:

int foo()
    return 0;

需要放置一个return语句,并且需要将返回值复制给调用者。当然,人们可以想出一种机制来避免这种情况,哎呀,这只是 void 返回类型。

【讨论】:

【参考方案5】:

在编程逻辑函数有四种不同的类型。要点是只有一个函数只做你需要它做的事情,仅此而已。如果你有它做额外的事情,这会导致错误和安全漏洞。

    什么都不拿,什么都还。这对于获取已设置的数据很有用。

    int func() 
        return 1; 
    
    

    拿东西不还。这对于高级分配或 cout() 之类的进程非常有用,它需要一些东西但什么也不返回。

    void func( param ) 
    
    

    拿东西,还东西。这对处理很有好处,例如添加到某些东西或修剪这个字符串。

    int func ( param )  
        return 1; 
    
    

    什么都不拿,也不回报。这很适合设置标志或做视觉效果。

    void func ( )   
    
    

【讨论】:

以上是关于为啥我们需要 void 函数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们将视图和上下文对象作为函数中的参数传递,API 22 [关闭]

当一个函数无返回值时,函数的类型应定义为啥

C# void函数传入集合参数排序后没效果为啥

为啥我无法在具有 void 返回类型的异步函数中捕获异常?

为啥fadeIn() 函数不起作用? [关闭]

为啥这个 MSVC asm 块没有 ret,或者非 void 函数有返回?