如果void()没有返回值,我们为什么要使用它?

时间:2012-07-19 11:39:59

标签: c++ types void

void f()表示f不返回任何内容。如果void没有返回任何内容,那么我们为什么要使用它? void的主要目的是什么?

11 个答案:

答案 0 :(得分:33)

当C被发明时,惯例是,如果你没有指定返回类型,编译器会自动推断你想要返回一个int(和参数一样)。

但是你经常编写做东西但不需要返回任何内容的函数(例如,想想一个只是在屏幕上打印一些东西的函数);出于这个原因,我们决定,要指定您根本不想返回任何内容,您必须使用void关键字作为“返回类型”。


请注意void还有其他用途;特别是:

  • 如果将其指定为函数的参数列表,则表示该函数不带参数;这在C中是必需的,因为没有参数的函数声明意味着编译器只是未指定参数列表。在C ++中不再需要这个,因为空参数列表意味着该函数不允许参数;

  • void在指针中也有重要作用; void *(及其变体)的意思是“指向未指定的内容”。如果你必须编写必须存储/传递指针而不实际使用它们的函数,这是很有用的(仅在最后,实际使用指针,需要强制转换为适当类型)。

  • 此外,对(void)的强制转换通常用于将值标记为故意未使用,从而抑制编译器警告。

    int somefunction(int a, int b, int c)
    {
        (void)c; // c is reserved for future usage, kill the "unused parameter" warning
        return a+b;
    }
    

答案 1 :(得分:7)

这个问题与语言的历史有关:C ++是从C语言中借用的,C语言用于隐式键入所有类型为int的类型(事实证明,这是一个可怕的想法)。这包括用作过程的函数(回想一下,函数和过程之间的区别在于函数调用是表达式,而过程调用是语句)。如果我从阅读早期的C书中正确地回忆起它,程序员过去常常用#define修补这个缺点:

#define void int

此约定后来在C标准中采用,并引入了void关键字来表示作为过程的函数。这非常有用,因为编译器现在可以检查您的代码是否使用了一个函数的返回值,该函数不是为了返回任何东西,并警告您应该返回的函数,而是让控件在最后运行。

答案 2 :(得分:6)

  

void()表示什么都不返回。

void并不意味着没有void类型代表没有。这是一个微妙的区别:表示仍然是必需的,即使它什么都不代表。

类型用作函数的返回类型,不返回任何内容。当它用作void*时,这也用于表示通用数据。因此,虽然void代表 nothing ,但void*代表所有内容,这听起来很有趣!

答案 3 :(得分:5)

在诸如C,C ++,Java等命令式编程语言中,类型void的函数和方法用于它们的副作用。它们不会产生有意义的返回值,但它们会以多种可能的方式之一影响程序状态。例如,C中的exit函数不返回任何值,但它具有中止应用程序的副作用。另一个例子,C ++类可能有一个void方法来改变其实例变量的值。

答案 4 :(得分:3)

因为有时你不需要返回值。这就是我们使用它的原因。

答案 5 :(得分:1)

如果你没有void,你怎么告诉编译器函数没有返回值?

答案 6 :(得分:1)

因为在某些情况下,您可能需要对全局变量进行一些计算并将结果放在全局变量中,或者您希望根据参数等打印一些内容。在这些情况下,您可以使用不返回值的方法。即。无效

答案 7 :(得分:1)

这是一个示例函数:

struct SVeryBigStruct
{
    // a lot of data here
};

SVeryBigStruct foo()
{
    SVeryBigStruct bar;
    // calculate something here

    return bar;
}

现在又来了另一个功能:

void foo2(SVeryBigStruct& bar) // or SVeryBigStruct* pBar
{
    bar.member1 = ...
    bar.member2 = ...
}

第二个功能更快,它不必复制整个结构。

答案 8 :(得分:0)

可能告诉编译器“你不需要推送和弹出所有cpu寄存器!”

答案 9 :(得分:0)

有时它可以用来打印东西,而不是返回它。有关示例,请参阅http://en.wikipedia.org/wiki/Mutator_method#C_example

答案 10 :(得分:0)

返回值不需要函数。为了告诉编译器函数没有返回值,使用返回类型的void。