1 程序编译的过程: 2 预处理 生成.i文件 3 编译 将预处理后的文件转换成汇编语言,生成.s文件 4 汇编 将汇编语言变为目标代码(机器代码)生成.o 文件 5 链接 连接目标代码,生成可执行程序 6 7 预处理是C语言程序从源代码变成可执行程序的第一步,主要是C语言编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、 8 条件编译的选择等。打印出预处理之后的结果:gcc -E hello.c 或者 cpp hello.c这样我们就可以看到源代码中的各种预处理命令是如何 9 被解释的,从而方便理解和查错。 10 11 编译之前,C语言编译器会进行词法分析、语法分析(-fsyntax-only),接着会把源代码翻译成中间语言,即汇编语言。如果想看到这个中间 12 结果,可以用-S选项。 13 14 15 1、值常量:整型值常量、浮点型值常量(例如:0.5f)、字符型值常量('a'、' '、' ')、字符串值常量("hello")、符号常量、常型常量 16 2、变量声明:存储类型、数据类型、变量名 17 3、合法的标识符,只能以字母和下划线开头,后面可以是数字、下划线、字母,不能是关键字(例如:char、short、int、long) 18 4、数据的存储形式: 1、在内存中的形式:小端字节序,地址低位存数据低位,地址高位存数据高位 19 2、在网络中形式,大端字节序,地址高位存低位,地址低位存数据高位 20 21 5、三种常见的布尔分析 22 1、整型数的布尔判断(直接判断) 23 2、浮点数的判断 (用范围比较方式) 24 3、指针的判断 25 26 6、a++和++a的区别: 27 a++先返回a的值,再加a = a + 1; (表达式结束才会自增) 28 ++a先a=a + 1,再返回原来a + 1的值(表达式完成前自增) 29 30 运算符优先级: 31 优先级 运算符 名称或含义 使用形式 32 [] 数组下标 数组名[整型表达式] 33 () 圆括号 (表达式)/函数名(形参表) 34 1 . 成员选择(对象) 对象.成员名 35 -> 成员选择(指针) 对象指针->成员名 36 ------------------------------------------------------------- 37 - 负号运算符 算数类型表达式 38 (type) 强制类型转换 (纯量数据类型)纯量表达式 39 ++ 自增运算符 ++纯量类型可修改左值表达式 40 -- 自减运算符 --纯量类型可修改左值表达式 41 2 * 取值运算符 *指针类型表达式 42 & 取地址运算符 &表达式 43 ! 逻辑非运算符 纯量类型表达式 44 ~ 按位取反 ~整型表达式 45 sizeof 长度运算符 sizeof表达式 46 ------------------------------------------------------------- 47 具体祥看:https://blog.csdn.net/u014100559/article/details/90764534?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159358726719724848309940%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159358726719724848309940&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-5-90764534.first_rank_ecpm_v3_pc_rank_v3&utm_term=c%E8%AF%AD%E8%A8%80%E4%BC%98%E5%85%88%E7%BA%A7%E6%8E%92%E5%BA%8F 48 49 50 51 所占字节数 数据表示范围 52 char 1 -128~127 53 unsigned char 1 0~255 54 short 2 -2^15~2^15-1 55 int 4 -21亿~21亿 56 long 8(32位机上为4位) 57 long long 8 58 unsigned short 2 0~65535 59 unsigned int 0~42亿 60 61 62 防止数据溢出(上溢:溢出到范围的底部,下溢:溢出到数据的底部) 63 整数除整数得整数,整数除浮点数(其中有一个为浮点数,则结果为浮点数) 64 65 sizeof:计算某类型或某表达式所占的字节数 66 67 非格式化字符 68 输入:getchar() 可使用其使程序暂停(一次只提取一个字符) 69 输出:putchat() 70 71 72 /**************************************************************************/ 73 #include <stdio.h> 74 #define MAX(n1 , n2)((n1) > (n2) ? (n1) : (n2)) 75 76 int max_fun(int num1 , int num2) 77 { 78 return num1 > num2 ? num1 : num2; 79 } 80 81 int main() 82 { 83 int num1 , num2 , num3 84 printf("input three number "); 85 scanf("%d,%d,%d",&num1 , &num2 , &num3); 86 int max; 87 max = max_fun(max_fun(num1 , num2) , num3); 88 printf("max = %d ",max); 89 } 90 /**************************************************************************/ 91 92 while()//先判断再执行,有可能一次都不会执行 93 94 do...while()//先执行再判断,至少会执行一次 95 96 for(初始化表达式 ; 判断表达式 ; 迭代表达式) 97 { 98 循环体 99 } 100 //for循环执行顺序: 初始化表达式->判断表达式->循环体->迭代表达式->判断表达式 101 102 coutinue()语句 103 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次循环体的判断(一般结合if使用) 104 105 106 数组:有一个首地址,后面有连续内存。 107 大批量存储指定类型的数据,有统一访问的入口(数组名 + 下标),方便对批量数据的访问。 108 特点:1、类型统一 2、大小固定 109 (数组名代表了数组的首地址)(数组的维数必须是常量) 110 111 数组初始化 112 1、静态初始化(在声明时初始化,用{}初始化) 113 2、多态初始化(声明之后的赋值) 114 115 中括号[]的本质:*(数组名 + 偏移量) 116 例:P[1]就是*(p + 1) , 1[p]就是 *(1 + p) 117 118 bzero(目标,0,位数) //将目标清为0 119 memset(首地址,0,字节数)//将目标设置为0 120 memcpy(数组1,数组2,sizeof(数组2)) 121 122 void* : void*指针可以接收任意类型指针,提高函数通用性。 123 const void*是常量指针,只能改变指向,不能改变值。 124 125 126 /*********************************************************************************/ 127 二维数组: 128 #include <stdio.h> 129 130 int main(int argc, char const *argv[]) 131 { 132 int arr[3][2]; 133 printf("arr = %p , arr[0] = %p , &arr[0][0] = %p " , arr , arr[0] ,&arr[0][0]); //值相等,但意义不一样&arr[0][0],arr[0]的类型都为int* 134 printf("&arr[0][0] = %p,arr[0][1] = %p,&arr[1][0] = %p ",arr[0][0],arr[0][1],&arr[1][0]); //二维数组与一维数组的存储形式都一样,都是连续内存 135 printf("arr[0] = %p,arr[1] = %p,arr[2] = %p ",arr[0],arr[1],arr[2]); //二维数组的第一维表示的是每行的首地址 136 printf("arr[0][1] = %p,arr[1][0] = %d ",arr[0][1],arr[1][0]); //声明时如果未初始化,产生的也是随机值。 137 printf("sizeof(arr) = %ld ",sizeof(arr[0])); //总字节数 138 printf("sizeof(arr[0]) = %ld ",sizeof(arr[0])); //sizeof(每行首地址) = 一行所占字节数 139 printf("sizeof(arr)/sizeof(arr[0]) = %ld ",sizeof(arr)/sizeof(arr[0])); //行数 140 printf("sizeof(arr[0])/sizeof(arr[0][0]) = %ld ",sizeof(arr[0])/sizeof(arr[0][0])); //列数 141 printf("sizeof(arr)/sizeof(arr[0][0]) = %ld ",sizeof(arr)/sizeof(arr[0][0])); //总的成员个数 142 return 0; 143 } 144 /*********************************************************************************/ 145 146 字符串与数组 147 字符串的本质:是一种以'