C语言日常练习(简单的Lunix命令)-2.0

1.linux环境实践,熟悉使用(网络搜索)

ls //list 列出当前文件夹的所有文件
cd //change directory 更改(切换)目录
mkdir //make directory 创建目录(文件夹)
rm //remove 删除文件(-f)
mv //move 移动文件
touch //创建文件
pwd //print work directory打印当前工作目录
2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。 并熟悉相关指令。
一步完成:

(1)touch tets.c -->创建一个test.c文件
(2)vim test.c -->进入vim编辑器
(3)此时按键盘小写‘i’键进入插入模式,开始写代码,例如写一个“ hello world !“. 

(4)按键盘(Esc)进入普通模式
(5)按键盘‘:’键进入命令模式,后按‘wq’保存并退出。


(6)输入 gcc test.c --> 编译,
输入 ls --> test.c 和 a.out,
输入 ./a.out --> 链接,就会出现“hello world !”了 

分步完成:

编译

分为三个预处理(也叫预编译),编译,汇编

预处理test.c

gcc -E test.c
作用:1头文件包含(以#开头的为预处理指令)
2注释删除
3#define定义符号的替换

编译

gcc -S test.i
作用:1把源代码编程汇编代码
2进行语法检测(分析),词法分析,语义分析,符号汇总

汇编

gcc -o test.o
作用:把汇编代码转换成二进制指令,形成符号表

链接

生成最终文件

3.熟悉预处理标识符:

__LINE__
__FILE__
__DATE__
__TIMRE__
#
##

详情:

__LINE__      :  文件当前的行号
__FILE__      :  进行编辑的源文件
__DATE__     :  文件被编辑的日期
__TIME__     : 文件被编辑的时间
#                     :    把宏参数变成相应的字符串
##                   : 把俩边的符号合成一个符号

4.了解宏和函数的区别。

其区别主要表现在:代码长度、执行速度、操作符优先级、参数求值、参数类型这几方面。

 代码长度:

    #define 宏:每次使用时,宏代码都被插入到程序中。除了非常小的宏之外,程序的长度将大幅度增长。

    函数:函数代码只出现于一个地方;每次使用这个函数时,都调用那个地方的同一份代码。

 执行速度:

    #define 宏:更快。

    函数:存在函数调用/返回的额外开销。

 操作符优先级:

    #define 宏:宏参数的求值是在所有周围表达式的上下文环境中,除非他们加上括号,否则邻近操作符的优先级可能会产生不可预料的结果。

    函数:函数参数只在函数调用时求值一次,他的结果值传递给函数。表达式的求值结果更容易预测。

 参数求值:

    #define 宏:参数每次用于宏定义时,他们都将重新求值。由于多次求值,具有副作用的参数可能会产生不可预料的结果。

    函数:参数在函数被调用时求值一次,在函数中多次使用参数并不会导致多种求值过程。参数的副作用并不会导致任何特殊的问题。

 参数类型:

    #define 宏:宏与类型无关。

    函数:函数的参数与类型有关。如果参数的类型不同,就需要使用不同的函数,即使他们执行的任务是相同的。

5.写一个宏可以将一个数字的奇数位和偶数位交换。

首先我们要清楚宏函数的用法,其次要有用宏函数实现该功能的整体思路,下面我带着大家分析一下:

:将数字5(0101)交换二进制奇偶位为(1010)即数字10。

就是将数字的二进制的第0位和第1位交换,第2位和第3位交换,后面以此类推。

首先我们需要将奇数位和偶数位提取出来,通过位操作运算符将两个合并成交换后的数字。

解析:设需要变换的数字为x,

将(x&(0x55555555))<<1; x按位与0x55555555后得到的二进制奇数位与x相同但偶数位均为0,然后再向左移一位,变成偶数位为原来的奇数位,且移动后奇数位全为0;

将(x&(0xAAAAAAAA))>>1; x按位与0xAAAAAAAA后得到的二进制偶数位与x相同但奇数位均为0,然后再向右移一位,变成奇数位为原来的偶数位,且移动后偶数位全为0;

最后将两个二进制按位或((x&(0x55555555))<<1) | ((x&(0xAAAAAAAA))>>1),便最终得到了交换后的数。

#include <stdio.h>
#include <windows.h>

#define SWAP(x)\
 (((x&(0x55555555)) << 1) | ((x&(0xAAAAAAAA))>>1))//十六进制
//提取x的奇数位并左移一位,偶数位并右移一位
int main()
{
	int x = 5;//0101-->1010
	printf("%d\n", SWAP(x));
	system("pause");
	return 0;
}

6.使用宏实现两个数中求较大值。                
#include <stdio.h>
#define MAX(a,b)\
((a) > (b) ? (a) : (b))
int main()
{
	int a = 11;
	int b = 23;
	printf("%d\n", MAX(a, b));
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39026129/article/details/80291903