相关阅读
C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482
函数定义时需要明确给出返回值的类型,比如int main();表示main函数返回一个int类型的值,而void func();则表示func函数不向调用者返回一个值(这里需要特别注意,“void函数不返回值”并不意味着函数不会结束执行。函数执行到结尾时仍然会返回到调用点,只是它不携带可供使用的返回值而已)。
void main();这种写法已经被普遍认为是不规范和不专业的,在C99标准中,已经明确规定main函数的返回值类型必须显式写成int。而在更早的C90标准中,如果函数定义时没有显式写出返回值类型,那么默认返回类型是int。这是因为在当时,很多函数确实都以int作为返回值类型。
void main(); //这是不专业的写法,即使在C90里面没有强制规定返回值类型 int main(); //这是C99强制的写法 main(); //C90中,这样写默认返回int类型对于返回值类型不是void的函数,通常需要使用return语句显式返回一个值。例如:
int add(int a, int b) { return a + b; }这里add函数的返回值类型是int,因此return语句后面也应该跟一个能够转换为int类型的表达式。而对于void函数来说,return语句可以写,也可以不写;如果写,一般写成:return;。表示函数在这里提前结束,但不返回任何表达式的值。
main函数在C标准中是一个比较特殊的函数。在C99及之后的标准中,如果main函数的结尾省略了return语句,那么当程序执行到main的右花括号}时,会被视为自动执行了:return 0;。也就是说,下面这种写法是允许的:
int main(void) { printf("hello\n"); }它等价于:
int main(void) { printf("hello\n"); return 0; }C99规定不允许在返回值类型不是void的函数中使用没有表达式的return语句,如果不写return语句,虽然也能返回,但返回值的行为是未定义的,如下所示:
int test(){ printf("This is test."); //没有return语句,也能返回 } int main(){ test();int test(){ printf("This is test."); return; //会报错,因为一个非void返回值类型的函数使用了没有表达式的返回值 } int main(){ test();反过来,如果函数的返回值类型是void,那么就不能写带表达式的return语句。例如:
void test(){ printf("This is test."); return 0; //会报错,因为一个void返回值类型的函数使用了有表达式的返回值 } int main(){ test(); }在C语言中,函数定义时应当明确给出返回值类型,而return语句的写法也必须与返回值类型匹配。
可以简单总结为:
- int main(void)是现代C中最规范的写法;
- void main()通常被认为是不规范的;
- C90中曾经允许省略返回类型并默认按int处理,但这种写法现在已经不推荐;
- 对于返回值类型不是void的普通函数,应显式返回一个值;
- main函数比较特殊,若省略retuen,在C99及之后标准中等价于return 0;;
- 对于其他非void函数,如果执行到末尾没有返回值,则属于未定义行为;
- 非void函数不能使用空的return语句;
- void函数不能使用带表达式的return语句;
- void函数虽然没有返回值,但执行结束后仍然会把控制流返回给调用者。
理解了这些规则之后,再去阅读或编写C语言函数时,就能更准确地区分“函数返回值”和“函数执行结束返回控制流”这两个概念。
下面这篇博客讨论了指向数组的指针和指向数组首元素的指针这两个易混概念,感兴趣的读者可以阅读。
C语言:指向数组的指针和指向数组首元素的指针https://chenzhang.blog.csdn.net/article/details/134976287?spm=1011.2415.3001.5331