1、C语言定义
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
C语言具有以下的特点
- 结构简洁:核心内容少,只有32个关键字,9种控制语句
- 表达简练、实用:一套强有力的运算符,达44种,可以构造出多种形式的表达式,用一个表达式就可以实现其它语言可能要用多条语句才能实现的功能
- 丰富的数据类型:C语言具有现代语言的各种数据类型,如:字符型、整型、实型、数组、指针、结构体和共用体等。可以实现诸如链表、堆栈、队列、树等各种复杂的数据结构。其中指针使参数的传递简单、迅速,节省内存。
- 结构化:提供了许多编程需要的基本控制语句,if~else、for、switch 等语句,实现顺序结构、条件结构和循环结构
- 适合大型项目的程序化结构设计:C程序是函数的集合,函数是构成C程序的基本单位,每个函数具有独立的功能,函数之间通过参数传递数据。
- 提供了预处理功能:预处理扩展了C语言的功能,提高了程序的可移植性,为大型程序的调试提供了方便。
- 可移植性高:尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
- 目标代码质量高:由C源程序得到的目标代码的运行效率比用汇编语言写的也不过只低10%到20%,可充分发挥机器的效率。
- 设计自由度高:C语言不做数组越界或者变量类型兼容性的检查,这样允许了开发者更多的自主性,来编写更加灵活的程序。
2、第一个程序
//主流的写法
//int - 整形
//printf - 提供的库函数
//库函数使用,需要包含特定的头文件
#include <stdio.h>
int main(){
printf("hello world!\n");
}
Linux环境下gcc的编译过程
$ gcc hello.c # 编译
$ ./a.out # 执行
hello world!
上述的过程经历了以下过程
1.预处理(Preprocessing), 2.编译(Compilation), 3.汇编(Assemble), 4.链接(Linking)。
预处理
预处理用于将所有的#include头文件以及宏定义替换成其真正的内容
编译
将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。
汇编
汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式
链接
链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。
2、数据类型
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
计算类型的大小(32位系统计算)
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char)); 1
printf("%d\n", sizeof(short)); 2
printf("%d\n", sizeof(int)); 4
printf("%d\n", sizeof(long)); 4
printf("%d\n", sizeof(long long)); 8
printf("%d\n", sizeof(float)); 4
printf("%d\n", sizeof(double)); 8
return 0;
}
计算类型的大小(64位系统计算)
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char)); 1
printf("%d\n", sizeof(short)); 2
printf("%d\n", sizeof(int)); 4
printf("%d\n", sizeof(long)); 4
printf("%d\n", sizeof(long long)); 8
printf("%d\n", sizeof(float)); 4
printf("%d\n", sizeof(double)); 8
return 0;
}
单位为字节
计算机中的单位
- bit 比特位
- byte 字节
- KB
- MB
- GB
- TB
- PB.....
1byte=8bit
1KB = 1024byte
1MB = 1024KB
1GB = 1024MB
.....
3、变量、常量
生活中的有些值是不变的(比如:圆周率,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。
变量的类型
局部变量
全局变量
#include <stdio.h>
int global = 2019;//全局变量——定义在大括号外
int main()
{
int local = 2018;//局部变量——定义在大括号内部
//下面定义的global会不会有问题?
int global = 2020;//局部变量
printf("global = %d\n", global);
return 0;
}
上面的局部变量global变量的定义其实没有什么问题的! 当局部变量和全局变量同名的时候,局部变量优先使用(同名的局部变量和全局变量定义在不同的内存空间中)
变量的使用
#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;
}
使用步骤
- 声明变量
- 赋值
- 使用
- 也可以一步到位 int num = 99;
变量的作用域和生命周期
作用域
1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个工程。
生命周期
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。
常量
字面常量
字面常量是直接写出的固定值,它包含C语言中可用的数据类型,可分为整型常量,字符常量等。如:9.9,“hello”等就属于这一类常量。
const修饰的常变量
值不能被修改,在整个作用域中都维持原值。实际上为变量,被赋予了不可写入的属性,被const修饰后,不可被修改。
#define 定义的标识符常量
C语言提供了***#define***命令定义标识符常量,该标识符常量在程序中是个定值,通常用于代表数组容量或涉及数学的常量等
枚举常量
日常生活中有一些代表实际意义的常量,有这么一个特点:数值较小且为非负整数。如一周有7天等。C语言提供了一种枚举(enum)类型,能够列出所有可能会用到的取值,并给它们取一个名字。
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
3.14;//字面常量
1000;//字面常量
//const 修饰的常变量
const float pai = 3.14f; //这里的pai是const修饰的常变量
pai = 5.14;//是不能直接修改的!
//#define的标识符常量 演示
#define MAX 100
printf("max = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量的默认是从0开始,依次向下递增1的
return 0;
}
4、字符、字符串
由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
#include <stdio.h>
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
int main()
{
char arr1[] = "bit";
char arr2[] = {'b', 'i', 't'};
char arr3[] = {'b', 'i', 't', '\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
转义字符
include <stdio.h>
int main()
{
printf("c:\code\test.c\n");
return 0;
}
以上的程序输出为
#include <stdio.h>
int main()
{
//问题1:在屏幕上打印一个单引号',怎么做?
//问题2:在屏幕上打印一个字符串,字符串的内容是一个双引号“,怎么做?
printf("%c\n", '\'');
printf("%s\n", "\"");
return 0;
}
题目:以下代码的输出是多少?
//程序输出什么?
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}
答案:14
5、注释
1. 代码中有不需要的代码可以直接删除,也可以注释掉
2. 代码中有些代码比较难懂,可以加一下注释文字
#include <stdio.h>
int Add(int x, int y)
{
return x+y;
}
/*C语言风格注释
int Sub(int x, int y)
{
return x-y;
}
*/
int main()
{
//C++注释风格
//int a = 10;
//调用Add函数,完成加法
printf("%d\n", Add(1, 2));
return 0;
}