标签:ali 显示 链接库 临时 模块 空格 exit 浮点型 分析
一、程序执行的过程
1.预编译:主要处理源代码中的预处理指令,引入头文件,去除注释,处理所有的条件编译指令,宏的替换,添加行号,保留所有的编译器指令。
gcc -E main.c -o main.i
2.编译:编译过程所进行的是对预处理后的文件进行语法分析,词法分析,语义分析,符号汇总,然后生成汇编代码。
gcc –S main.i -o main.s
3.汇编:这里的汇编所说的是一个过程,将汇编代码转成二进制文件,二进制文件就可以让机器来读取。每一条汇编语句都会产生一句机器语言。
gcc -c main.s -o main.o
4.链接:将目标文件、启动代码、库文件链接成可执行文件的过程,这个文件可被加载或拷贝到存储器执行。
连接处理可以分为两种:
①静态链接:(编译时)
链接器将函数的代码从其所在地(目标文件或静态链接库中)拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
为创建可执行文件,链接器必须要完成的主要任务:
②动态链接(加载运行时):在此种方式下,函数的定义在动态链接库或共享对象的目标文件中。在编译的链接阶段,动态链接库只提供符号表和其他少量信息用于保证所有符号引用都有定义,保证编译顺利通过。动态链接器(ld-linux.so)链接程序在运行过程中根据记录的共享对象的符号定义来动态加载共享库,然后完成重定位。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码
gcc -o main main.o
5.处理器读取并解释存储在存储器中的指令
Shell:命令行解释器,为用户提供了一只与系统打交道的方式。它等待用户的输入,当用户输入一行命令后,shell先判断它是不是一个shell内置命令,如果不是,shell会假定用户输入为一个可执行文件的名字,从而去加载并执行该文件。因此,当我们通过编译系统将源文件编译成可执行二进制文件后,在shell中输入我们得到的可执行二进制文件名,shell将其从磁盘中加载到存储器(注:我们的可执行文件是存放在磁盘上的),并通过处理器进行解释执行,得到最终的结果,输出到终端(显示器)上进行显示。自此,我们的hello, world程序完成了其生命周期。
二、代码规范
代码规范:运算符前后要加空格,不同模块之间要换行
三、变量
/*
#include 宏 导入头文件
什么情况下需要导入头文件:需要用到外部提供的一些函数或者变量
导入的方式:
< > 导入系统自带的库 头文件 告诉编译器首先从系统类库里面去查找这个头文件,如果类库里面没有那么从当前这个工程文件里面查找
" " 导入自己写的头文件 告诉编译器先从当前这个工程里面去查找 如果没有 那么再去系统类库里面去查找
*/
#include <stdio.h>
/*
argc: 执行这个程序时 编译器传递过来的参数个数
argv: 每一个参数的字符串组成的数组
IDE环境下 argc=1 argv=程序路径
int main(int argc,char *argv[]){
printf("argc = %d\n", argc);
for (int i = 0; i < argc; i++){
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
int 返回值:记录程序执行的状态
如果返回0 表示正常结束
如果返回-1 表示非正常结束 如果程序在执行过程中占有资源(内存资源 文件资源) 此时系统会没收分配的资源
关键字:int const char return float double long exit
有特殊的含义 在定义变量的时候不能用关键字来当变量名
*/
int global = 0; //全局变量
int main(int argc, const char * argv[]) {
/*
1个字节 = 8位
变量 常量:程序在执行过程中有些数据或者资源需要被长时间记录 就需要定义一个变量或者常量来保存它
整形数据 int 1 23 940
浮点型数据 float 78.5 125.4
字符数据 char ‘A‘ ‘B‘
长整型数据 long
定义一个变量:系统会立刻分配内存
声明一个变量:不会立刻分配内存 当使用这个变量的时候才去分配内存
*/
int temp = 10;
float weight;
weight = 165.3;
printf("int size = %lu\n", sizeof(int));
printf("float size = %lu\n", sizeof(float));
printf("double size = %lu\n", sizeof(double));
printf("long size = %lu\n", sizeof(long));
printf("char size = %lu\n", sizeof(char));
printf("global = %d\n", global);
//变量的作用域
int a = 20;//局部变量 临时变量
//int a = 340; 同一个变量在同一个代码块里面不能被重复定义
{
global = 39;
//...
printf("a = %d %p\n", a, &a);
int a = 10; //临时变量 局部变量
//...
//...
printf("a = %d %p\n", a, &a);
}
printf("a = %d\n", a);
//全局变量
//静态变量
printf("global = %d\n", global);
return 0;
}
四、循环控制语句
//1 2 3 4
for (int i = 1; i <= 4; i++){
for (int j = 1; j <= 4; j++) {
for (int k = 1; k <= 4; k++) {
if (i != j && i != k && j != k){
printf("%d\n", i*100+j*10+k);
}
}
}
}
//break 直接结束当前这个循环
//continue 结束这一次循环 继续下一次循环
for (int i = 0; i < 10; i++) {
if (i == 5){
//break;
continue;
}
printf("%d ", i);
}
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 4; j++) {
//判断i 和 j是否相同
if (i == j){
continue;
}
for (int k = 1; k <= 4; k++) {
if (i == k || j == k ) {
continue;
}
printf("%d\n", i*100 + j *10 + k);
}
}
}
标签:ali 显示 链接库 临时 模块 空格 exit 浮点型 分析
原文地址:https://www.cnblogs.com/jianze/p/9319754.html