1. 语言的发展:
【二进制语言】
硬件 – 电:正电(1)、负电(0)
101010000101000111001 – 手册 ------> 低级语言
101011011101 – ADD – 助记符 – 【汇编语言】
【B语言】
【C语言】、【C++】 …… 高级语言 -------> 高级语言
2. C 语言国际标准
国际标准 --> ANSI C - C89 - > C90 -> C98
C99 / C11 并不流行 – 不少编译器不支持
3. 第一个C语言 程序
#include <stdio.h>
int main()
{
printf("hehe\n");
return 0;
}
4. 数据类型
- 内置类型 – int,float ……
- 自定义类型 – 结构体,枚举,共用体。
计算字符类型所占字节数 :sizeof() – 是操作符/运算符,不是函数。
C 语言标准规定:
sizeof(long) >= sizeof(int)
- Win X86和X64都为 4。
- Linux X86为4,X64为8。
计算机中的单位:
- bit
- 1 byte = 8bit;
- 1 kb = 210 byte;
- mb = 210 kb;
- gb = 210 mb;
- tb = 210 gb;
- pb = 210 tb;
数据类型 | 类型名 | 所占字节数(单位:byte) |
---|
char | 字符型 | 1 | short [int] | 短整型 | 2 | int | 整型 | 4 | long [int] | 长整型 | 4/8 | long long [int](C99中提出) | 更长的整型 | 8 | float | 单精度浮点数 | 4 | double | 双精度浮点数 | 8 |
字符格式 | 意义 |
---|
%c | 字符型格式符 | %s | 字符串型格式符 | %d | 整型 (十进制数据) | %u | 打印无符号整型 | %x | 打印16进制数字 | %f | 浮点型 - - 小数 | %lf | 双精度浮点数 | %p | 以地址的形式打印 |
#include <stdio.h>
int main()
{
char arr[5] = {0};
scanf("%s", arr);
return 0;
}
注:
输入的字符个数应比 数组长度小1 。因为,输入格式为字符串,编译器会在字符串末尾自动加'\0' 。若输入的字符个数与数组长度相等,会报数组越界的错误。
5. 常量、变量
C语言中的常量分为以下几种:
- 字面常量
const 修饰的常变量#define 定义的标识符常量- 枚举常量
#include <stdio.h>
#define MAX 10
enum Sex
{
MALE,
FEMALE,
SECRET
};
int main()
{
const int num = 4;
printf("%d\n", num);
printf("%d\n", num);
const int n = 10;
int arr[MAX] = { 0 };
printf("%d\n", MAX);
enum Sex s = FEMALE;
s = MALE;
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
变量
指定数据类型为 单精度且 小数部分不为0时,要加上后缀f,否则会有警告。float weight = 94.3f; (直接写出来的浮点数默认是double类型)。
6. 局部变量、全局变量
-
局部变量的作用域是变量的局部范围 – 不初始化 – 默认为随机值(直接用printf 函数输出未初始化的变量值,会报错); -
全局变量的作用域是整个工程 – 不初始化,默认是 0 。 -
变量前加static ,不初始化,默认值也是0; #include <stdio.h>
int i;
int main()
{
int j;
printf("%d\n", i);
return 0;
}
在一个项目的不同源文件中的代码,可以相互使用,但是得加extern 。
#include <stdio.h>
int g_val = 111;
#include <stdio.h>
int main()
{
extern int g_val;
printf("%d", g_val);
return 0;
}
7. 字符串 + 转义字符 + 注释
C语言 没有字符串类型。
7.1 字符串
"hello bit.\n"
双引号(Double Quo)引起来的一串字符称为 字符串字面值 (String Literal),或者简称 字符串。
注:
? 字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算做字符串内容。
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c'};
char arr3[] = { 'a','b','c','\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
printf("%d\n",strlen(arr1));
printf("%d\n",strlen(arr2));
printf("%d\n",strlen(arr3));
printf("%s\n", "abc0def");
printf("%s\n", "abc\0def");
return 0;
}
7.2 转义字符
转义字符 | 释义 |
---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词。 | \' | 用于表示字符常量' 。 | \" | 用于表示一个字符串内部的双引号。 | \\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。 | \a | 警告字符,蜂鸣 | \b | 退格符 | \f | 进纸符 | \n | 换行 | \r | 回车 | \t | 水平制表符 | \v | 垂直制表符 | \ddd | ddd表示1~3个八进制的数字。 如: \130 X | \xdd | dd表示2个十六进制数字。 如: \x30 0 |
举例1:
#include <stdio.h>
int main()
{
printf("c:\test\32\test.c");
printf("c:\\test\\32\\test.c");
return 0;
}
举例2:
?? + ) --> 三字母词
int main()
{
printf("(are you ok\??)\n");
return 0;
}
举例3:
#include <stdio.h>
#include <string.h>
int main()
{
printf("%s\n", "dsf\091");
printf("%d\n",strlen("c:\test\32\test.c"));
printf("%d\n",strlen("c:\test\328\test.c"));
return 0;
}
7.3 注释
- C语言注释风格 :
/* */ – 不支持嵌套的(不太好)。 - C++注释风格:
// - 快捷键:
ctrl + k + c 或 ctrl + shift + / : 进行注释;ctrl + k + u : 取消注释;
8. 常见关键字
auto(自动) break case char const continue default do double else enum
extern(声明/引入外部符号) float for goto if int long register(寄存器关键字) return short signed(有符号数)
sizeof static struct switch typedef(类型定义(或类型重命名)) union(联合体 / 共用体) unsigned void volatile(Linux系统部分) while
int main()
{
auto int a = 10;
register int b = 10;
return 0;
}
计算机存储数据: 速度: 寄存器 > 高速缓存 > 内存 > 硬盘
8.1 关键字 typedef
typedef 类型定义,可以理解为类型重命名。
#include <stdio.h>
int main()
{
typedef unsigned int u_int;
u_int num1 = 0;
unsigned int num2 = 20;
return 0;
}
8.2 关键字 static
在C语言中:
static 是用来修饰变量和函数的
- 修饰局部变量 – 静态局部变量
- 修饰全局变量 – 静态全局变量
- 修饰函数 – 静态函数
1. 修饰局部变量:
#include <stdio.h>
void test()
{
int a = 0;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
#include <stdio.h>
void test()
{
static int a = 0;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
结论:
static 修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域仍然存在,到程序结束,生命周期才结束。
2. 修饰全局变量
int g_val = 2018;
extern g_val;
int main()
{
printf("%d\n", g_val);
return 0;
}
static int g_val = 2018;
extern g_val;
int main()
{
printf("%d\n", g_val);
return 0;
}
结论:
全局变量本身是具有外部链接属性的,但是一个全局变量被static 修饰,使得这个全局变量失去外部链接属性,只能在本源文件内使用,不能在其他源文件内使用。
3. 修饰函数
int Add(int x, int y)
{
return x+y;
}
extern int Add(int x,int y);
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
static int Add(int x, int y)
{
return x+y;
}
int Add(int x,int y);
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
结论:
函数默认具有外部链接属性,但是一个函数被static 修饰,使得函数失去外部链接属性,变成内部链接属性,这个函数只能在本源文件内使用,不能在其他源文件内使用。
static 修饰函数改变了函数的链接属性。
由外部链接属性 变为 内部连接属性。
9. #define 定义常量和宏
#include <stdio.h>
#define MAX 100
int Max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
#define MAX(X, Y) (X>Y?X:Y)
#define ADD(x, y) (x+y)
int main()
{
int a = 10;
int b = 20;
int max = Max(a, b);
printf("max = %d\n", max);
max = MAX(a, b);
printf("max = %d\n", max);
return 0;
}
10. #define 和 typedef 的区别
希望可以对大家有所帮助,如果有什么不对的地方,还烦请指教,谢谢!
|