"知道做不到就是不知道"
一、函数原型
一般情况下,main()函数都放在编辑页面的最后,因为C的编译器是自上而下的分析代码。
cs
#include<stdio.h>
int sum(int a,int b){
int c;
c=a+b;
return c;
}
int main(){
int a = 1;
int b = 2;
int result;
result = sum(a,b);
printf("%d",result);
return 0;
}
但是如果想要在排布上让main()函数放在最前面,而所用到的功能函数的具体复杂实现都放在后面,则需要把函数的头放在main()函数的前面,记得加分号,这叫做函数的声明(区别与函数的定义)。
cs
#include<stdio.h>
//函数声明
int sum(int, int);
int main(){
int a = 1;
int b = 2;
int result;
result = sum(a,b);
printf("%d",result);
return 0;
}
//函数定义
int sum(int a,int b){
int c;
c=a+b;
return c;
}
函数原型------函数头,以分号结尾 ;其目的就是告诉编译器这个函数长什么样子:名称、参数(数量及类型)、返回类型。
函数原型里面可以没有参数名称:比如 void sum(int ,int )
二、局部变量
函数每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行独有的,称作局部变量。定义在函数内部的就是局部变量,参数也是局部变量。
-
变量的生存期和作用域:"大括号";
-
在不同的函数里面就有不同的变量作用空间,彼此之间的变量访问是不存在交叉的;
cs
#include <stdio.h>
int main() {
int outer_var = 10; // 函数级局部变量
printf("outer_var (函数级): %d\n", outer_var);
{ // 开始代码块
int inner_var = 20; // 块级局部变量
printf("inner_var (块内): %d\n", inner_var);
printf("outer_var (块内访问): %d\n", outer_var); // 可以访问外部变量
{ // 嵌套代码块
int nested_var = 30; // 嵌套块级变量
printf("nested_var (嵌套块内): %d\n", nested_var);
} // nested_var 在此被销毁
// printf("nested_var: %d\n", nested_var); // 错误:nested_var 已不可访问
} // inner_var 在此被销毁
// printf("inner_var: %d\n", inner_var); // 错误:inner_var 已不可访问
printf("outer_var (函数级): %d\n", outer_var);
return 0;
}
1. 作用域层次
outer_var:函数级局部变量,在整个 main函数内可见
inner_var:块级局部变量,仅在第一个 {}代码块内可见
nested_var:嵌套块级变量,仅在嵌套的 {}代码块内可见
2. 作用域规则
内层代码块可以访问外层变量(如块内可访问 outer_var)
外层代码块不能访问内层变量(尝试在块外访问 inner_var会导致编译错误)
同名变量在内层会屏蔽外层变量
//预期输出
outer_var (函数级): 10
inner_var (块内): 20
outer_var (块内访问): 10
nested_var (嵌套块内): 30
outer_var (函数级): 10
3. 规则
a) 本地变量是定义在块内的(可以是函数的,也可以是语句的,甚至可以是随便拉一对大括号来定义变量);
b) 程序运行进入到这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了;
c) 在块的外面定义的变量,在块里面仍然有效;
d) 在块里面定义的变量和外面的变量同名,则在块内部使用该变量的时候就掩盖外面的变量,即就近原则(同时,如果在块外面使用该同名变量,只能使用块外变量);
e) 在同一个块里面就不能定义同一个变量;
f) 本地变量不会被默认的初始化。
三、参数传递
- C语言在调用函数的时候 ,永远只能把值传给函数。
如果想要实现参数的同步修改,后面会讲到指针(c++中是引用)。
- 调用函数时给的值与参数类型不匹配,是C语言传统上最大的漏洞。编译器总是悄悄把类型转好,但这种转换往往和期望的不一样。
四、其他补充知识点
- 逗号运算符,取括号中最后一个变量的值作为运算结果。
cs
#include <stdio.h>
int main() {
int a, b, c;
// 逗号运算符的简单使用
c = (a = 5, b = a + 3, a + b);
printf("a = %d, b = %d, c = %d\n", a, b, c);
// 输出:a = 5, b = 8, c = 13(5+8)
return 0;
}
*在函数的参数列表中的逗号仅是标点符号,不产生运算结果,如f(a, b)。
但是 **f((a, b))**指的是先做括号里面的运算,在作为参数传递给 f() 函数,即f(b)。
-
可以在函数里面定义或者使用其它函数,但是不允许在函数中存在其他函数的声明!
-
int main(){} 中 return 0来保证运行无错;本质上是一个函数。
写在最后:
更新C语言学习笔记
如有错误,烦请多多批评指正!