上一节主要写了一些关于编码和编程语言的相关知识,这一节主要来写一点基础知识点。下一节是C语言的最后一部分数据类型和文件。
1.预处理
程序编译过程:
首先进行预处理,将文件包含或者宏定义进行替换,成为比较完整的代码,与此同时检查语法问题,但此时仍然是C语言。经过编译器处理变为汇编语言,生成后缀为-i的文件。再次经过汇编器变为只有机器可以识别的机器语言,生成后缀为-o的文件,这时编译完成。
预处理部分通常在源码首部,这样看起来比较清晰。但是根据编译过程来讲,也可以在main里面。
1>文件包含
这是一个经常会用到的一个知识点,因为后面随着要写的代码越来越多,同时为了方面阅读和检查,会使用模块化的编程架构(当然还有其他很好用的编程架构,诸如:状态机架构,层次化架构,面向对象架构等等),随着这些架构的使用,一些函数会被写在别的.c和.h文件里面(.c文件里面是具体定义,.h文件里面只是对其里面函数的声明)。要用到这些被声明在别的文件里的函数的话,则必须引入这个.h文件。具体用法如下:
#include"你要引入的文件名.h",双引号也可以用<>来代替。
2>宏定义
这个用法的本质是替换。大体用法如下:
#define 宏名
作用域
#undef 宏名(如果没有这一条,代表着作用域是从源码开始到源码结束)
具体用法是这样的:
a.无参数宏定义
#define 宏名标识符 宏体【常量,表达式(加括号,避免意义出错),格式化字符串】
标识符:
由字母,数字,下划线组成
第一个字符必须是下划线或者字母,不可与关键字相同
b.带参数宏定义(注意与函数的差别,会略略提到)
#define 宏名(形参列表)形参表达式也可以是多条语句,多条语句时使用{}括起来
与函数差别:表示式不会被计算,就像上面说的,只是替换,把宏名的位置上用后面的表达式替换了。而函数会把值计算出来,再把计算后的值传递给函数调用的地方。
个人觉得不太经常用,所以后期返回看的时候可能会不太理解,所以举例如下:
#include<stdio.h>
#define SWAP(a,b,mind) {mind=a;a=b;b=mind;}
int main(void){
int x,y,temp;
printf("Input two numbers x,y: ");
scanf("%d%d",&x,&y);
SWAP(x,y,temp)
printf("x=%d,y=%d",x,y) ;
return 0;
}
运行结果:
Input two numbers x,y: 2 3
x=3,y=2
--------------------------------
Process exited after 30.85 seconds with return value 0
请按任意键继续. . .
3>条件编译
目的是进行选择性编译。
一般形式为:
a.#if 常量表达式1
程序1
#elif 常量表达式2
程序2
#else
程序3
#endif
b.#ifndef 宏名
程序1
#else
程序2
#endif
注:#ifdef和#ifndef的用法相同,不做列举。这种在后面自己模块化分工时定义.h文件经常用到。
4>宏操作符和其他预处理指令
操作符#和##:
#:字符串操作符,将后面的字符串变成双引号包围的串。
##:连接操作符,标识符##标识符->标识符标识符,将两个标识符连接在一起。
预定义宏:_DATE_ 会显示源文件编译日期
_TIME_ 显示源文件编译时间
_FILE_ 正在编译的源文件名
_LINE_ 正在编译的行在源文件中的行号
_func_ 正在编译的行所在函数的名称
这些用法用来调试
2.程序结构
这里就不细讲逻辑和关系运算符,特别注意的是优先级问题,故这里只列出优先级(比较重要,可以收藏方便查找):
1>选择结构
if语句:根据条件的从属关系分为两种:平行的,从属的(即嵌套,后面可以通过别的编程架构来替代,毕竟看起来不太直观)
平行的:根据条件多寡分为有一,二,三种及三种以上的三种类型:
有一种:if(表达式)
语句;
两种:if(表达式)
语句1;
else 语句2;
三种及以上:if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
从属的:
if(表达式1){
if(表达式1.1)
语句1;
else
语句2;
}
else{
if(表达式)
巴拉巴拉(不想打了总之道理是这么个道理,和if里面一样的)
}
注意,在使用嵌套时最好像我一样加{},如果没加呢,每个else总是与之最近的相匹配。
switch语句:
这个语句就像点名一样,点到谁就是谁执行。这种条件会很清晰。比较推荐:
switch(表达式){
case 常量表达式1: 语句1;
case 常量表达式2:语句2;
default: 语句3;
}
条件运算符:当满足或不满足条件,都至执行单个的赋值语句时,使用条件运算符。
表达式1?表达式2:表达式3
意思是:表达式1为真,则条件表达式的值为表达式2,否则是表达式3。
2>循环结构
一种是先判断再循环的while语句,另一种是先循环再判断的do while 的语句。由于比较简单,就不举例子了,while(1)值得一提,这样可以一直执行,在后期小车啥的用的较多。
for语句:
for( 表达式1,表达式2,表达式3)
表达式1:初值,数值的起点
表达式2:终值,数值终点
表达式3: 数值从初值到终值的方式,比如说i++
break 和continue语句:
break,只能用在循环语句和Switch语句,在多层循环里只跳出一层循环
continue,只能用在循环语句里面,直接跳出。
3.函数
1>函数定义
函数返回值类型 函数名(形参){
局部变量说明
语句,如有返回值,return 返回值;
}
2>函数调用
直接作为一个语句
作为表达式的一部分,只适合有返回值的函数
作为一个参数
其实对函数而言这些知识点已经够了,更详细的下一篇会补充的。有点困,终于写完了。