熟悉linux环境
1.预处理
@(gcc -E test.c -o tist.i)
(1)去注释
(2)宏替换
(3)头文件展开
(4)条件编译
2.编译
@(gcc -S test.c)
将c语言翻译成汇编语言
3.汇编
@(gcc -c test.c)
将汇编语言翻译成c语言
4.链接
操作命令
1、**ls //list 列出当前文件夹的所有文件 **
2、**cd //change directory 更改(切换)目录 **
3、**mkdir //make directory 创建目录(文件夹) **
4、**rm //remove 删除文件(-f) **
5、**mv //move 移动文件 **
6、**touch //创建文件 **
7、**pwd //print work directory打印当前工作目录 **
8、ls 显示文件或目录
-l 列出文件详细信息(list)
-a 列出当前目录下所有文件及目录,包括隐藏的a(all)
9、mkdir 创建目录
-p 创建目录,若无父目录,则创建p(parent)
10、cd 切换目录
11、touch 创建新文件
12、echo 创建带有内容的文件
13、cat 查看文件内容
14、cp 拷贝
15、mv 移动或重命名
16、rm 删除文件
-r 递归删除,可删除子目录及文件
-f 强制删除
17、find 在文件系统中搜索某文件
18、wc 统计文本中行数、字数、字符数
19、grep 在文本文件中查找某个字符串
20、rmdir 删除空目录
21、tree 树形结构显示目录,需要安装tree包
22、pwd 显示当前目录
23、ln 创建链接文件
24、more、less 分页显示文本文件内容
25、head 、tail 显示文件头、尾内容
26、ctrl+alt+F1 命令行全屏模式
预处理标识符
FILE //进行编译的源文件
LINE //文件当前的行号
DATE //文件被编译的日期
TIME //文件被编译的时间
STDC //如果编译器遵循ANSI C,其值为1,否则未定义
# 和
使用#把一个宏参数变成对应的字符串
##作用
##可以把位于它两边的符号合成一个符号。
它允许宏定义从分离的文本片段创建标识符。
宏和函数区别
1、用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。
2、更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型符合的表达式上使用。反之这个宏怎可以适用于整形、长整型、浮点型等可以用于>来比较的类型。宏是类型无关的。
宏与函数相比,劣势表现在:
1、每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。
2、宏是没法调试的。
3、宏由于类型无关,也就不够严谨。
4、宏可能会带来运算符优先级的问题,导致程序容易出错。
宏有时候可以做函数找不到的事情。比如,宏的参数可以出现类型 ,但函数做不到。
使用宏实现两个数中求较大值。
``` python
#include <stdio.h>
#include <stdio.h>
#define Max(a,b) ((a)>(b)?(a):(b))
int main()
{
int a=0;
int b=0;
scanf("%d%d",&a,&b);
printf("%d",Max(a,b));
return 0;
}
```
写一个宏可以将一个数字的奇数位和偶数位交换。
``` python
#include <stdio.h>
#include <windows.h>
#define N 32
int main()
{
int a=0;
int arr[N]={0};
int temp=0;
int i=0;
scanf("%d",&a);
for(i=0;i<N;i++)
{
arr[i]=((a>>(31-i))&1);
printf("%d ",arr[i]);
}
printf("
");
for(i=0;i<N;i+=2)
{
temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
for(i=0;i<N;i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}
```