C语言学习笔记 初识函数
1. 函数定义:
2. 函数返回:
从函数中返回return停止函数的执行,并返回一个值。 return;或return 表达式 ; 没有返回值的函数 void 函数名(参数表)
3. 函数原型:
#include <stdio.h> void sum(int begen, int end);//声明 int main() { sum(1, 10); return 0; } void sum(int begen, int end)//定义 { //函数体; }
4. 参数传递
类型不匹配。调用函数时给的值与参数的类型不匹配时,C语言编译器总是偷偷地替你把类型转换好,但是这可能不是你所期望的,
后续的语言,C++和Java在这方面很严格。
void cheer(int i) { printf("cheer %d", i); } int main() { cheer(2.4); return 0; } //warning C4244: “函数”: 从“double”转换到“int”,可能丢失数据 //cheer 2
传值:
void swap(int a, int b); int main() { int a = 1, b = 2; swap(a, b); printf("a=%d, b=%d", a, b); return 0; } void swap(int a, int b) { int t = a; a = b; b = t; }
//a=1, b=2
这样的代码无法交换a和b的值,C语言在调用函数时,永远只能传值给函数。
5. 本地变量
定义:定义在函数内部的变量就叫本地变量,又称局部变量。参数也是本地变量。
变量的生存期:什么时候变量开始出现了,到什么时候变量又消亡了。
变量的作用域:在代码的什么范围内可以访问这个变量(这个变量可以起作用)。
对于本地变量这两个问题的答案是统一的:大括号内-------块
本地变量的规则:
- 本地变量是定义在块内的,它可以定义在函数的块内、语句的块内,甚至可以随便拉一个大括号来定义变量。
- 程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。
- 块外面定义的变量在块里面仍然有效。
- 块里面定义了了外面同名的变量则掩盖了外面的。
- 不能在一个块内定义同名的变量。
- 本地变量不会被默认初始化。
- 参数在进入函数的时候被初始化了。
6. 一些细节
没有参数时
void f(),在传统C中,它表示f函数的参数表未知,并不表示没有参数。
void f(void)
在函数原型中有参数时,最好标明。
逗号运算符?
调用函数时的圆括号里的逗号是标点符号,不是运算符。
f(a,b)与f((a,b))的区别是传入的参数是一个还是两个。
C语言不允许函数嵌套定义
优美胜于丑陋(Python 以编写优美的代码为目标)//
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)//
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)//
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)//
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)//
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)//
可读性很重要(优美的代码是可读的)//
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)//
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)//
当存在多种可能,不要尝试去猜测‘而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)。虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )//
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)//
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)//
命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)//