C语言中所有表达式都有值吗?void返回函数调用及void类型该如何理解
问题解答
- C语言中不是所有表达式都有对应的值,void类型的表达式就是典型的无值表达式。
- 对于返回值类型为
void的函数调用:它本身属于void类型的表达式,不存在任何可被读取、使用的值,也不能将该表达式的结果赋值给任何变量,尝试写int res = foo();这类代码会直接触发编译错误。 void不是C语言的值类型:它属于C标准中定义的「不完全类型」,且是无法被补全为完整类型的不完全类型,你甚至无法声明一个void类型的变量,void val;属于完全非法的语法。
正确的规则理解可以参考C标准的明确定义:
void类型的作用就是用来标记「无值」的场景:
- 作为函数返回值类型时,说明这个函数执行完成后不会返回任何可被使用的值
void类型的表达式仅会执行自身的副作用(比如void函数调用就是执行函数内的逻辑),你不能对这类表达式做任何取值相关的操作,包括但不限于赋值、算术运算、取sizeof、取地址等,所有这类操作都会被编译器拒绝。
举个实际的编译报错例子:
void foo() {} int main(void) { int a = foo(); // 编译错误:试图将void类型的值赋值给int变量 sizeof(foo()); // 编译错误:不能对void类型取大小 return 0; }
内容的提问来源于stack exchange,提问作者Jason Yu
相关产品推荐
相关产品推荐

