为什么以下代码可以编译?
#include <stdio.h>
int main(void) {
getchar;
}
因为函数名是指向这些函数的函数指针的别名,而这些函数指针本身就像整数一样也是值。这在语义上非常类似于
#include <stdio.h>
int main(void) {
42;
}
这是有效的,但毫无意义。
同样的道理,1;
可以编译通过,getchar
只是一个函数地址。结果被计算后就会被丢弃。在语言规范中,这被称为“表达式语句”。
C语言很奇怪,这段代码虽然能编译通过,但会产生段错误(segfault)。 记录一下,这是C语言历史上最小的段错误。
main;
getchar
是否允许作为宏定义。如果允许的话,那么这段代码可能是不正确的。 - Alexandre C.