void f()
表示f
不返回任何内容。如果void
没有返回任何内容,那么我们为什么要使用它? void
的主要目的是什么?
答案 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。