void的含义

void的含义

背景

写一个函数,如果它首次被调用,则返回字母A,第二次被调用,则返回字母B,第三次调用,则返回字母C,以此类推。(提示:使用一个static数据类型)
函数原型为:char call_times(void)。
编写main函数测试它。

**输出格式要求:”第一次调用返回字符%c!\n” “第二次调用返回字符%c!\n” “第三次调用返回字符%c!\n”

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

char call_times(void);

int main()
{ printf("第一次调用返回字符%c!\n",call_times());
printf("第二次调用返回字符%c!\n",call_times());
printf("第三次调用返回字符%c!\n",call_times());
return 0;
}

char call_times(void){
static char ch='A';
return ch++;
}

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() 也是合法的写法,程序能跑。
  • int main() 和 int main(void)意思一样吗?

    • 不一样! 在 C 语言里,()(void) 有微妙但重要的区别。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

// 写法 1:括号留空(不安全)
char func_A() {
return 'A';
}

// 写法 2:写明 void(安全)
char func_B(void) {
return 'B';
}

int main() {
// 情况 1:
func_A(100, 200, "hello");
// ↑ 竟然编译通过了!虽然 func_A 不需要参数,但你硬塞给它,C语言也忍了。
// 这可能会掩盖你代码里的逻辑错误。

// 情况 2:
func_B(100);
// ↑ 报错!编译器说:too many arguments to function 'func_B'
// 因为 func_B 明确说了是 (void),任何参数都不准进。

return 0;
}

结论: 为了代码的安全和严谨,在 C 语言中,如果函数不需要参数,建议一定要写 (void)

2. 那为什么 int main() 可以不写?

main 函数非常特殊,它是程序的入口。关于 main,C 语言标准(C99/C11)规定了两种标准写法:

  1. int main(void) —— 不接收命令行参数。
  2. int main(int argc, char *argv[]) —— 接收命令行参数。

int main() 算什么? 虽然标准推荐写 (void),但因为历史原因(早期的 C 语言非常随意),编译器对 main 特别宽容。当你写 int main() 时,现代编译器通常默认你就是指 int main(void)

但是,如果你去看最严格的 C 语言教材或规范,它们都会建议你写成:

1
2
3
int main(void) {
// ...
}

3. 一个额外的小知识(C vs C++)

如果你以后学 **C++**,情况就变了:

  • C++ 中:call_times()call_times(void) 完全等价,都表示“没有参数”。
  • C 语言中:call_times() 表示“参数不确定”,(void) 表示“没有参数”。

我的建议: 既然你现在是在学 C 语言,养成好习惯:**如果不传参数,就老老实实写上 void**。这样别人看你的代码,就知道你是一个严谨的程序员。

其他方式

全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

// 把变量搬到函数外面,它的寿命就是整个程序的寿命
char global_ch = 'A';

char call_times(void) {
// 函数内部直接去修改外面的这个变量
return global_ch++;
}

int main() {
printf("%c\n", call_times()); // 输出 A
printf("%c\n", call_times()); // 输出 B
}

指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

// 函数改为:你给我一个字符地址,我帮你改,并返回改之前的
char call_times(char* p_ch) {
char current = *p_ch; // 记下现在的
(*p_ch)++; // 把外面的变量加1
return current; // 返回加之前的
}

int main() {
char state = 'A'; // 状态由 main 函数自己维护

printf("%c\n", call_times(&state)); // 输出 A
printf("%c\n", call_times(&state)); // 输出 B
}

void的含义
http://example.com/2025/11/30/void的含义/
作者
王柏森
发布于
2025年11月30日
许可协议