void f()
意味着f
什么都不返回。如果void
什么都不返回,那我们为什么要使用它呢?的主要目的是void
什么?
11 回答
发明 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; }
在诸如 C、C++、Java 等命令式编程语言中,函数和类型void
的方法用于它们的副作用。它们不会产生有意义的返回值,但它们会以多种可能的方式之一影响程序状态。例如,exit
C 中的函数不返回任何值,但它具有中止应用程序的副作用。另一个例子,一个 C++ 类可能有一个 void 方法来改变它的实例变量的值。
void() 表示什么都不返回。
void
并不意味着什么。void
是一种不代表什么的类型。这是一个微妙的区别:仍然需要表示,即使它不代表任何内容。
此类型 用作函数的返回类型,不返回任何内容。这也用于表示通用数据,当它用作void*
. 所以这听起来很有趣,虽然void
代表什么,但void*
代表一切!
这个问题与语言的历史有关:C++ 从 C 中借用,而 C 曾经隐式地将所有未类型化的内容键入为int
(事实证明,这是一个可怕的想法)。这包括旨在作为过程的函数(回想一下,函数和过程之间的区别在于函数调用是表达式,而过程调用是语句)。如果我从阅读早期的 C 书籍中没记错的话,程序员过去常常用一个来修补这个缺点#define
:
#define void int
这个约定后来在 C 标准中被采用,并且void
引入了关键字来表示打算作为过程的函数。这非常有帮助,因为编译器现在可以检查您的代码是否使用了一个不打算返回任何内容的函数的返回值,并警告您应该返回但让控件运行结束的函数。
因为有时您不需要返回值。这就是我们使用它的原因。
如果你没有void
,你将如何告诉编译器一个函数没有返回值?
原因考虑某些情况,您可能必须对全局变量进行一些计算并将结果放入全局变量中,或者您想根据参数打印一些东西等。在这些情况下,您可以使用不返回值的方法..即。空白
这是一个示例函数:
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 = ...
}
第二个函数更快,它不必复制整个结构。
可能是告诉编译器“您不需要推送和弹出所有 cpu 寄存器!”
有时它可以用来打印某些东西,而不是返回它。有关示例,请参见http://en.wikipedia.org/wiki/Mutator_method#C_example
函数不需要返回值。为了告诉编译器函数不返回值,返回类型为 void。