C学习笔记
——导言
这一章主要在于介绍一些基本知识,内容跨度较大、较乱。
一、程序组成
一个C语言程序,无论其大小如何,均由 函数和 变量组成。函数中包含 语句,用于指定要执行的计算操作。变量用于存储计算过程中使用的值。函数与函数之间进行数据交换的一种方法是调用函数向被调用函数提供一个值表——即: 参数。
二、printf简介
printf是一个宏定义函数。若不通过添加转义字符“\n”,其输出内容永远不会自动换行。(回车"\r"与换行“\n”之间有区别,前者是文本光标 返回到本行开头,后者是文本光标 移动到下一行而不返回行首, 这与操作系统有关)
ANSI标准定义了printf函数的行为,对每个符合该标准的编译器和库,使用均相同。
printf("%d\n",var)默认是左对齐格式。如果其第一个参数的%d中指明了打印宽度,则右对齐格式。如%3d为打印至少占3个字符宽的整形量,超出3个字符宽度不会截取!(但此时为左对齐格式,这也是为什么默认%d输出为左对齐格式)例:以"%3d\n"格式打印:1,10,100,1000;输出如图![]()
对于浮点型打印来说,以小数点为界,小数点前为打印字符宽度(至少,可省略),小数点后为打印有效小数位(四舍五入)。![]()
另外,
字符 输出形式 d,i 十进制数 o 无符号八进制数(不会自带前缀0) x,X 无符号十六进制数(同上) u 无符号十进制数 c 单字符 s 字符串,遇‘\0’则打印结束 f 十进制小数(默认小数有效位为6) e,E 科学计数法,e/E表示10(默认小数有效位为6)(输入格式须为double型) g,G 如果指数小于-4或大于等于精度,则用%e或%E格式输出,否则用%f格式输出(小数点及其后0不打印) p 指针 % 打印一个百分号(利用“\%”号似乎也可实现)
![]()
三、变量
所有变量必须 先声明后使用。声明分为 定义性声明和 引用性声明。区别在于声明时是否分配存储空间给该变量。如"int a"属于前者,在声明时即分配了地址给它;“extern int a”属于后则,仅用于说明该变量已在别处定义过。
变量类型(摘自http://c.biancheng.net/cpp/html/437.html)
四、字符输入输出
标准库提供的输入/输出模型是按照 字符流的方式。文本流是由多行字符构成的字符序列。每行字符则由0个或多个字符组成,行末是一个换行符('\n')。文件末尾有EOF(End Of File),值为-1.
一次性只读入/输出一个字符。
getchar(void)putchar(char c)
五、函数
函数一般形式为:
返回值类型函数名(0个或多个参数声明)
{
声明部分;语句序列;
}
出现在main函数之前的声明,称为 函数原型 。
函数原型与函数声明中的参数名不要求相同,甚至原型中的参数名也是可有可无的。
如:int FUN(int, int);
六、传值调用
但必要时,也可以让被调函数修改主调函数中的变量。
此时,调用者需要向被调用者提供参数的地址(可以简单看作是指针),此时虽然指针是个“临时变量”,但指针指向的值是“原变量”。
同时,数组参数的传递也是地址。其传递过程是主调函数将数组的首地址传递给被调函数,而不是数组元素本身
七、return 与 exit
return 表达式;
表达式可有可无。
区别:
return是将控制权返回给上一级调用函数;
exit是将控制权返回给操作系统。
八、外部变量及作用域
局部变量——自动变量
函数中的每个局部变量只在函数被调用时存在,在函数执行完毕退出时消失。(故此被称为自动变量)
外部变量——全局变量
定义必须在所有函数之外,且只能定义一次。(传值调用规则同样适用,如下图)
九、extern
函数在使用外部变量之前,必须要知道外部变量的名字。
要达到这一目的:
- extern
- 外部变量与调用该变量的函数在同一个文件中,且外部变量的定义在函数定义之前。
使用书籍:C程序设计语言(第二版) BRAIN W. KERNIGHAN 机械工业出版社