void的含义
void的含义
背景
写一个函数,如果它首次被调用,则返回字母A,第二次被调用,则返回字母B,第三次调用,则返回字母C,以此类推。(提示:使用一个static数据类型)
函数原型为:char call_times(void)。
编写main函数测试它。
**输出格式要求:”第一次调用返回字符%c!\n” “第二次调用返回字符%c!\n” “第三次调用返回字符%c!\n”
代码实现:
1 | |
void在这里的含义:
函数的括号里面放的是参数列表(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()也是合法的写法,程序能跑。
- 能。在 C 语言中,
int main() 和 int main(void)意思一样吗?
- 不一样! 在 C 语言里,
()和(void)有微妙但重要的区别。
- 不一样! 在 C 语言里,
1. () 和 (void) 的区别(C 语言特有)
在 C 语言中:
char call_times(void)含义: “我发誓,这个函数绝对没有参数。”
后果: 如果你在 main 函数里手滑写了
call_times(123);(传了个参数进去),编译器会直接报错,阻止你编译。这是一种安全保护。#include <stdio.h> char call_times(void); int main() { printf("第一次调用返回字符%c!\n", call_times(123)); printf("第二次调用返回字符%c!\n", call_times(321)); printf("第三次调用返回字符%c!\n", call_times(10086)); return 0; } char call_times(void) { static char ch = 'A'; return ch++; }1
2
3
4
5
- ```tex
发生生成错误。是否继续并运行上次的成功生成?
“char call_times(void)”: 用于调用的参数太多
char call_times()含义: “这个函数可能有参数,也可能没有,我不告诉你(参数未定)。”
后果: 这是一个历史遗留的“后门”。如果你写
call_times(123);,编译器不会报错,它会允许你传参数进去(虽然函数内部根本不会去用这个参数)。#include <stdio.h> char call_times();//我不告诉你 int main() { printf("第一次调用返回字符%c!\n", call_times(123)); printf("第二次调用返回字符%c!\n", call_times(321)); printf("第三次调用返回字符%c!\n", call_times(10086));//给你中国移动 return 0; } char call_times() { static char ch = 'A'; return ch++; }1
2
3
4
5
- ```tex
第一次调用返回字符A!
第二次调用返回字符B!
第三次调用返回字符C!
看个代码例子:
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 | |
3. 一个额外的小知识(C vs C++)
如果你以后学 **C++**,情况就变了:
- 在 C++ 中:
call_times()和call_times(void)完全等价,都表示“没有参数”。 - 在 C 语言中:
call_times()表示“参数不确定”,(void)表示“没有参数”。
我的建议: 既然你现在是在学 C 语言,养成好习惯:**如果不传参数,就老老实实写上 void**。这样别人看你的代码,就知道你是一个严谨的程序员。
其他方式
全局变量
1 | |
指针
1 | |