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,[...]) */

存储期

  1. 对于非static定义出来的变量,程序执行到对象声明的时候就创建出了相应的对象,而执行到包含该声明的最小程序块的结尾,也就是大括号的时候,该对象就会消失。
  2. 使用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);}

字符串

  1. 字符串末尾被加上了’\0’,即null字符,作为字符串结束的标志。因此‘ABC’ 长度为4,循环时刻利用null判断字符串结束;字符串是以字符数组的形式实现的,其末尾是首次出现的null字符。
  2. 字符串具有静态生命周期;
char str[] = "ABC";char str_1[] = {'A','B'};char str_2[1] = {'A'}; // 会出错;

后续如指针、结构体等书本涉及较浅,后续从其他资料进行备忘;

0 0
原创粉丝点击