1963 年ALGOL 60 作为C语言最早的模型,剑桥大学将其发展成为 CPL(Combined Programing Language)。1967 年,剑桥大学的 Matin Richards 对 CPL 语言进行了简化,产生了 BCPL 语言。
1970 年,美国贝尔实验室(Bell Labs)的 Ken Thompson 将 BCPL 进行了修改,并取名叫做 B 语言,意思是提取 CPL 的精华(Boiling CPL down to its basic good features)。并用 B 语言写了第一个 UNIX 系统。
1973 年,AT&T 贝尔实验室的 Dennis Ritchie(D.M.RITCHIE) 在 BCPL 和 B 语言的基础上设计出了一种新的语言,取 BCPL 中的第二个字母为名,这就是大名鼎鼎的 C 语言。
1978 年K&R C作为当时C语言事实上的标准,. 1983年到1989年C89(ANSI C), 从起草到草案被ANSI正式通过称为美国国家标准, 被称为C89标准. 1990年C90(ISO C)在C89基础上做了印刷排版上的修改, 技术上完全一样. 1995年在C90基础上做了技术补充, 经过扩充后的C90被称为C95。
1999 年,ANSI 和 ISO 又通过了最新版本的 C 语言标准和技术勘误文档,该标准被称为 C99 。这基本上是目前关于 C 语言的最新、最权威的定义了。
1. 为什么需要数据类型?
编程是为了解决生活中的问题, 解决问题就需要有描述问题的能力. 例如去超市买东西就需要设计到金额的大小以及运算, 代码中就需要有对应的数据类型去描述生活中的问题, 然后进行模拟问题的过程再解决问题.
2. C语言中的数据类型(注意点1: "/": 表示需要依据定义的情况来决定. 注意点2: 在C语言标准中 long >= int 即可并不一定是8, 由编译器决定. folat和double同理)
基本数据类型 | 名称 | 数据类型大小 |
---|---|---|
char | 字符型 | 1 |
short | 短整型 | 2 |
int | 整形 | 4 |
long | 长整型 | 4 |
float | 单精度浮点型 | 4 |
double | 双精度浮点型 | 8 |
构造数据类型 | 名称 | 数据类型大小 |
arr[] | 数组 | / |
struct | 结构体 | / |
union | 共同体 | / |
enum | 枚举类型 | / |
指针类型 | 名称 | 数据类型大小 |
int * | 指针 | 4 |
空类型 | 名称 | 数据类型大小 |
void | 空类型 | 无 |
/* 数据类型大小测试代码 */ #include <stdio.h> int main() { printf("%d\n", sizeof(char)); printf("%d\n", sizeof(short)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof(long)); printf("%d\n", sizeof(float)); printf("%d\n", sizeof(double)); printf("%d\n", sizeof(int*)); return 0; }
1. 常量概念
值不能改变的量称为常量. 例如: 圆周率, 身份证号码, 性别, 血型....
2. 常量定义方式
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
/* 常量定义方式测试代码 */ #include <stdio.h> //MALE,FEMALE,SECRET是枚举常量 enum Sex { MALE, FEMALE, SECRET }; int main() { //字面常量演示, 这样写代码是能正常运行的 3.14;//字面常量 1000;//字面常量 //const 修饰的常变量 注: 这里的pai是const修饰的常变量 const float pai = 3.14f; pai = 5.14;//是不能直接修改的! //#define的标识符常量 演示 #define MAX 100 printf("max = %d\n", MAX); //枚举常量演示 注:枚举常量的默认是从0开始,依次向下递增1的 printf("%d\n", MALE); printf("%d\n", FEMALE); printf("%d\n", SECRET); return 0; }
3. 知识拓展
上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了
变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。
/* 代码验证 */ #include <stdio.h> int main() { int num = 0; const int a = 3; //case后面必须跟一个常量表达式, 当使用a作为表达式的时候, 会报语法错误提示a为局部变量 switch (num) { case a: break; default: break; } }
1. 字符串 注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。
"hello bit.\n" : 这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
/* 示例代码, 验证C语言中字符串由'\0'结尾 */ #include <stdio.h> int main() { char arr1[] = "bit"; char arr2[] = {'b', 'i', 't'}; char arr3[] = {'b', 'i', 't', '\0'}; printf("%s\n", arr1); //bit printf("%s\n", arr2); //bit烫烫烫烫墙it printf("%s\n", arr3); //bit return 0; }
2. 转义字符
\是C语言中的转义字符, 搭配其他字符可以构成不同的特殊效果. 例如\n意思是换行, \t 表示制表符.
/* 示例代码, 展示转义字符\的效果. */ #include <stdio.h> int main() { //打印c:\code\test.c printf("c:\code\test.c"); // c:code est.c printf("c:\\code\\test.c"); //c:\code\test.c //打印(are you ok??) printf("(are you ok??)"); //(are you ok] ---- 这里是因为??)会被解析成] printf("(are you ok\?\?)"); //(are you ok??) }
3. 常见转义字符搭配
转义字符 | 释意 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' | 用于表示字符常量' |
\“ | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。 如: \130 X |
\xdd | dd表示两个十六进制数字. 如: \x30 0 |
/* \ddd示例代码, 需要注意的点. */ #include <stdio.h> int main() { printf("%d\n", strlen("abcdef")); printf("%d\n", strlen("c:\test\628\test.c")); //14 \62被解析成一个转义字符, 8不能和62一起看 return 0; }
4. 注释: 主要有两种注释风格
- C语言风格的注释 /xxxxxx/
缺陷:不能嵌套注释- C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行
1. if else 语句
#include <stdio.h> int main() { int coding = 0; printf("你会去敲代码吗?(选择1 or 0):>"); scanf("%d", &coding); if(coding == 1) { prinf("坚持,你会有好offer\n"); } else { printf("放弃,回家卖红薯\n"); } return 0; }
2. switch 语句
/* 注意点: 在visual studio中scanf()被视为不安全的, 会发生运行时错误, 导致程序无法正常运行需要使用 scanf_s(). 但是在啊哈C中是可以正常使用的. */ #include <stdio.h> #include <stdlib.h> int main() { int num = 0; scanf_s("%d", &num); // 保存 scanf 函数的返回值 switch (num) { case 1: printf("The number is 1\n"); break; case 2: printf("The number is 2\n"); break; default: printf("Error: the number must be 1 or 2\n"); break; } return 0; }
1. while 循环
#include <stdio.h> int main() { printf("加入比特\n"); int line = 0; while(line<=20000) { line++; printf("我要继续努力敲代码\n"); } if(line>20000) printf("好offer\n"); return 0; }
2. for 语句循环
#include <stdio.h> int main() { for (int i = 0; i <= 3; i++) { printf("%d\n", i); } }
3. do while 循环
#include <stdio.h> int main() { int i = 3; do { printf("%d\n", i); } while (i--); }
1. 函数特点
简化代码, 实现代码复用.
#include <stdio.h> int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = num1 + num2; printf("sum = %d\n", sum); return 0; } 上述代码,写成函数如下: #include <stdio.h> int Add(int x, int y) { int z = x+y; return z; } int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = Add(num1, num2); printf("sum = %d\n", sum); return 0; }