C、C++中void的含义
C/C++中void的含义
背景
写一个函数,如果它首次被调用,则返回字母A,第二次被调用,则返回字母B,第三次调用,则返回字母C,以此类推。(提示:使用一个static数据类型)
函数原型为:char call_times(void)。
编写main函数测试它。
**输出格式要求:”第一次调用返回字符%c!\n” “第二次调用返回字符%c!\n” “第三次调用返回字符%c!\n”
代码实现:
1 |
|
函数的括号里面放的是参数列表(Parameters),也就是你需要传给这个函数什么东西,它才能开始工作。
call_times(void): 这里的 void 表示“空”。意思是:调用这个函数不需要给我任何数据。它就像一个自动报时器,只要拍它一下(调用它),它自己内部就有逻辑生成 ‘A’, ‘B’, ‘C’,不需要告诉它任何信息。
如果写成 call_times(int n): 这意味着调用它时必须给它一个整数,比如 call_times(5)。但在这个题目里,我们需要函数自动从 ‘A’ 变到 ‘B’,不需要外部传入数字,所以不需要 int。
在 C 语言中,void 的字面意思是“无”或“空”。它主要出现在两个位置,含义略有不同:
A. 放在函数名后面的括号里:int main(void)
含义: 表示该函数不接受任何参数。
例子: char call_times(void) —— “我是个自给自足的函数,干活不需要你给我提供原料。”
B. 放在函数名最前面:void selection_sort(…)
含义: 表示该函数没有返回值(不返回任何结果)。
例子: 你之前的排序函数 void selection_sort(int a[], int n)。它只负责在内存里把数组排好序,不需要带回一个具体的数字给 main 函数,所以它是 void 类型。
对比: 题目中的 char call_times(...) 前面是 char,因为它算完之后,必须交回一个字符(’A’ 或 ‘B’ 等)给调用者打印。
void能省略吗?
char call_times(void)中的void能省略吗?
能。在 C 语言中,char call_times() 也是合法的写法,程序能跑。
int main() 和 int main(void)意思一样吗?
不一样! 在 C 语言里,() 和 (void) 有微妙但重要的区别。
- () 和 (void) 的区别(C 语言特有)
在 C 语言中:
1 | char call_times(void) |
1 | - 发生生成错误。是否继续并运行上次的成功生成? |
char call_times()
含义: “这个函数可能有参数,也可能没有,我不告诉你(参数未定)。”后果: 这是一个历史遗留的“后门”。如果你写 call_times(123);,编译器不会报错,它会允许你传参数进去(虽然函数内部根本不会去用这个参数)。
1 |
|
看个代码例子:
1 |
|
结论: 为了代码的安全和严谨,在 C 语言中,如果函数不需要参数,建议一定要写 (void)。
2. 那为什么 int main() 可以不写?
main 函数非常特殊,它是程序的入口。关于 main,C 语言标准(C99/C11)规定了两种标准写法:
int main(void) —— 不接收命令行参数。
int main(int argc, char *argv[]) —— 接收命令行参数。
那 int main() 算什么? 虽然标准推荐写 (void),但因为历史原因(早期的 C 语言非常随意),编译器对 main 特别宽容。当你写 int main() 时,现代编译器通常默认你就是指 int main(void)。
但是,如果你去看最严格的 C 语言教材或规范,它们都会建议你写成:
1 | int main(void) { |
- 一个额外的小知识(C vs C++)
如果你以后学 **C++**,情况就变了:
在 C++ 中:call_times() 和 call_times(void) 完全等价,都表示“没有参数”。
在 C 语言中:call_times() 表示“参数不确定”,(void) 表示“没有参数”。
我的建议: 既然你现在是在学 C 语言,养成好习惯:如果不传参数,就老老实实写上 void。这样别人看你的代码,就知道你是一个严谨的程序员。
其他方式
全局变量
1 |
|
指针
1 |
|