#include<stdio.h> voidsum(int a, int b) { int ans = 0, i; for(i=a; i<=b; i++) { ans += i; } printf("%d\n", ans); } intmain() { sum(1, 10); sum(11, 20); sum(21, 30); return0; }
函数的返回值
返回类型
写法
无
void function();
int
int function();
double
double function();
…
…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include<stdio.h> intsum(int a, int b) { int ans = 0, i; for(i=a; i<=b; i++) { ans += i; } return ans; //注意:非void类型函数结尾必须写return语句 } intmain() { printf("%d\n", sum(1, 10)); return0; }
return是函数的出口
return <变量>;是非void函数的出口,并返回一个值
void函数中的return;仅作为函数的出口
函数原型(声名)
在 main 函数之前声名,在main函数后定义一定程度上可以避免头重脚轻,但通常不会这么写
C/C++/Java 语言对于声名,定义等概念有严格要求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include<stdio.h> intsum(int a, int b); //告诉编译器这个函数的样子 intmain() { printf("%d\n", sum(1, 10)); return0; } intsum(int a, int b) { int ans = 0, i; for(i=a; i<=b; i++) { ans += i; } return ans; }
参数的传递
本质上是用传入的参数初始化函数参数表的变量
注意:
传递的参数要与参数表对应类型相匹配
传递参数的个数要与对应函数参数表的变量个数相匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include<stdio.h> voidsum(int a, int b) { int ans = 0, i; for(i=a; i<=b; i++) { ans += i; } printf("%d\n", ans); } intmain() { sum(1.1, 9.9); //不匹配的参数类型会被强制类型转换,然后以其结果初始化参数 sum(11, 20, 30); //传入的参数个数不匹配会导致编译错误 sum(21, 30); return0; }
参数在函数内是本地变量
变量的值作为参数初始化参数表的变量时,参变量值的改变不会改变被传入参数的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include<stdio.h> voidsum(int a, int b) { n = 1; int ans = 0, i; for(i=a; i<=b; i++) { ans += i; } printf("%d\n", ans); } intmain() { int m = 1, n = 10; sum(m, n); return0; }
与全局变量同名的参数表变量会将该全局变量屏蔽
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include<stdio.h> int a, b; voidsum(int a, int b) { int ans = 0, i; for(i=a; i<=b; i++) { ans += i; } printf("%d\n", ans); } intmain() { sum(1, 10); return0; }
不与参变量同名的全局非常量变量可以在函数内直接被修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include<stdio.h> int n; voidsum(int a, int b) { n = 1; int ans = 0, i; for(i=a; i<=b; i++) { ans += i; } printf("%d\n", ans); } intmain() { sum(1, 10); return0; }
代码块内部的变量也是本地变量,与函数内的本地变量类似
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include<stdio.h> intmain() { int a, b; a = 1; b = 2; printf("%d %d\n", a, b); { int a; a = 3; printf("%d %d\n", a, b); } return0; }
#include<stdio.h> voidf(); intmain() { int a = 1, b = 2; f(a, b); return0; } voidf(double a, double b) { printf("%d %d", a, b); }
这类写法是编译器的作者没想到的,因此在编写函数原型时一定要写全参数,在没有参数时可写void
逗号预算符,在参数传递中可能导致的错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<stdio.h> int a, b; voidsum(int a, int b) { int ans = 0, i; for(i=a; i<=b; i++) { ans += i; } printf("%d\n", ans); } intmain() { int a = 1, b = 10; sum(a, b); sum((a, b)); //比较这两行的区别 return0; }