C 语言学习 —— 《明解C语言》
来源:互联网 发布:北京赛车pk10数据分析 编辑:程序博客网 时间:2024/05/21 20:04
从2015年12月开始学习C语言,此前有部分python编程基础,学习C希望能够从更基础的层面理解编程。
Step 1: 《明解C语言》 柴田望洋 (201512 - 201512)
此书最大的特点是清晰,由于书中不厌其烦地使用图标和加亮文字,因此几乎不存在会产生困惑的点,但是很多介绍浅尝辙止,对于入门较好。对照课本学习后可参照下文复习。
基础结构
#include <stdio.h>int main(void){ blocks; return (0);}
格式化输出
printf("%d",int1)
d 有符号10进制整数
i 有符号10进制整数
o 有符号8进制整数
u 无符号10进制整数
x 无符号的16进制数字,并以小写abcdef表示
X 无符号的16进制数字,并以大写ABCDEF表示
F/f 浮点数
E/e 用科学表示格式的浮点数
g 使用%f和%e表示中的总的位数表示最短的来表示浮点数 G 同g格式,但表示为指数
c 单个字符
s 字符串
% 显示百分号本身
p 显示一个指针,near指针表示为:XXXX
far 指针表示为:XXXX:YYYY
n 相连参量应是一个指针,其中存放已写字符的个数
格式化输入
scanf("%d",&int1)
将输入按照变量地址塞进变量代表的盒子。关于变量说明如下:
int num = 100;printf("input an int:");scanf("%d",&int1)
变量名 | 变量地址 | 值
———-+——————————-+——-
num | 10xo02301, 即&num | 100
———-+——————————-+——–
类型转换
运算过程自动隐式向上类型转换,如int 和double运算,自动int转为double再运算。强制转换如下;
(double)int2;
分支结构 - if
if(condition1){block1;block2;} // 若只一句,可不用大括号;else if (condition2){block1;block2;}else{block1;block2;}condition ? block1 : block2; // 三目运算符:执行val = condition ? block1 : block2; // 三目运算符:赋值
分支结构 - switch
switch(condition){case val1 : block1;break;case val2 : block2;break;case val3 : block3;break;default : block4;break;}
循环控制 - do / while
do{blocks;}while(condition)while(conditon){blocks;}# 两者区别为先执行还是先判断;
循环控制 - for
for(block1,conditon1,block2){blocks;} /* block1 -> condition1判定为真 ->blocks ->block2 ^_______________________| */
C语言中32个关键字详解
由ANSI标准定义的C语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。
1.数据类型关键字
A基本数据类型(5个)
void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
char:字符型类型数据,属于整型数据的一种
int:整型数据,通常为编译器指定的机器字长
float:单精度浮点型数据,属于浮点数据的一种
double:双精度浮点型数据,属于浮点数据的一种
B类型修饰关键字(4个)
short:修饰int,短整型数据,可省略被修饰的int。
long:修饰int,长整形数据,可省略被修饰的int。
signed:修饰整型数据,有符号数据类型
unsigned:修饰整型数据,无符号数据类型
C复杂类型关键字(5个)
struct:结构体声明
union:共用体声明
enum:枚举声明
typedef:声明类型别名
sizeof:得到特定类型或特定类型变量的大小
D存储级别关键字(6个)
auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的变量
const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
2流程控制关键字
A跳转结构(4个)
return:用在函数体中,返回特定值(或者是void值,即不返回值)
continue:结束当前循环,开始下一轮循环
break:跳出当前循环或switch结构
goto:无条件跳转语句
B分支结构(5个)
if:条件语句
else:条件语句否定分支(与if连用)
switch:开关语句(多重分支语句)
case:开关语句中的分支标记
default:开关语句中的“其他”分治,可选。
C循环结构(3个)
for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2…循环,其中2为循环条件
do:do循环结构,do 1 while(2);的执行顺序是1->2->1…循环,2为循环条件
while:while循环结构,while(1) 2;的执行顺序是1->2->1…循环,1为循环条件 以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。
数组
int num[5]; // []中必须为常量,也可通过define方式来定义,如下:#define N 5; // 对象式宏;int num[N] = {1,2,3,4}/* 数组实现了相同类型对象的集合,结构体实现了不同类型对象的集合;C不支持数组的相互赋值,只能通过分别操作数组元素的方式赋值;*/int num[2][3] = {{1,2,3},{4,5,6}}; // 多维数组;单、多维数组有空值会自动补0;
函数
(return type) fuc_name (val1_type val1, val2_type val2,[...]) // 也可以不含形参;{ blocks; return(...);} // 输入若为参数,则为值传递,对函数调用的实参产生影响,输入若为数组,则为值引用,会对调用的实参产生影响(除非在形参前奸商const,例如 int max(const vc[]){blocks;});/* 函数A调用函数B,若B在A后,则要在调用时需在A处进行函数B的原型声明,即(return type) B (val1_type val1, val2_type val2,[...]) */
存储期
- 对于非static定义出来的变量,程序执行到对象声明的时候就创建出了相应的对象,而执行到包含该声明的最小程序块的结尾,也就是大括号的时候,该对象就会消失。
- 使用static定义的对象,或者是在函数外声明定义出的对象,在main函数执行前的准备阶段被创建出来,在程序结束时消失。
函数式宏
#define sqrt(x) ((x)*(x)) //由于知识单纯展开,所以括号非常重要;#define alert() (putchar('\a')) // 不含参#define alert(str) (putchar('\a'),puts(str)) // 需执行多个语句时使用逗号运算符;
枚举类型
枚举类型更像是一个define集合,能用枚举类型的数据类型应该尽量用枚举型;类似词典;
#include <stdio.h>enum month{ Jan = 1, Feb, Mar, Apirl, May, June, July, Aug, Sep, Oct, Nov, Dec, invalid }this_month;/*定义十二个月与1-12数字的对应;this_month为month类型的变量;invalid作为惯用法控制输入范围(循环时作为最后一个元素)*/int main(void){ int a = 3; this_month = (enum month)a; enum month month; switch (month = this_month) { case Jan:puts("Jan"); break; case Feb:puts("Feb"); break; case Mar:puts("Mar"); break; } return(0);}
字符串
- 字符串末尾被加上了’\0’,即null字符,作为字符串结束的标志。因此‘ABC’ 长度为4,循环时刻利用null判断字符串结束;字符串是以字符数组的形式实现的,其末尾是首次出现的null字符。
- 字符串具有静态生命周期;
char str[] = "ABC";char str_1[] = {'A','B'};char str_2[1] = {'A'}; // 会出错;
后续如指针、结构体等书本涉及较浅,后续从其他资料进行备忘;
- C 语言学习 —— 《明解C语言》
- C语言学习—数组
- C语言学习—函数
- C语言学习笔记——C语言编程
- C语言入门——C语言学习日志1
- C语言入门——C语言学习日志2
- C语言入门——C语言学习日志3
- C语言入门——C语言学习日志4
- C语言入门——C语言学习日志5
- C语言入门——C语言学习日志6
- C语言入门——C语言学习日志7
- C语言入门——C语言学习日志8
- C语言学习笔记——C语言简介
- C语言学习笔记——指针
- 学习一点——C语言
- 学习一点——C语言
- 学习一点——C语言
- 学习一点——C语言
- Objective-c编码规范
- 《swift2.0 官方教程中文版》 第2章-24访问控制
- static和extern与变量
- Android 内存管理 &Memory Leak & OOM 分析
- PHP反射ReflectionClass、ReflectionMethod
- C 语言学习 —— 《明解C语言》
- 在JAVA中如何连接SQL Server数据库
- 遇到的问题----js获取java的数组
- ceph安装命令罗列
- HighCharts中PieChart的实现
- mark
- socket的发送与接收缓冲区
- [jQuery] Introduction
- 1.Two Sum