Liunx开发工具

news2024/12/30 2:21:26

Liunx开发工具

  • 1.Linux编辑器-vim使用
    • 1.1vim的基本概念
    • 1.2vim的基本操作
    • 1.3命令模式命令集
      • 1.3.1光标定位
      • 1.3.2光标移动
      • 1.3.3文本复制
      • 1.3.4文本操作
    • 1.4插入模式命令集
    • 1.5底行模式命令集
  • 2.vim配置
  • 3.sudo配置
  • 4.Linux编辑器-gcc/g++使用
    • 4.1背景知识
    • 4.2gcc如何操作
  • 5.函数库
    • 5.1函数库的分类
  • 6.Liunx调试器-gdb使用
    • 6.1背景知识
    • 6.2gdb命令集
  • 7.Linux项目自动化构建工具-make/Makefile
    • 7.1背景
    • 7.2makefile原理
    • 7.3初步理解makefile的语法
    • 7.4两个问题
    • 7.5makefile推导规则

我们编写C/C++程序使用vs,编译,运行,调试都是一体的,而在Liunx都分开的。

1.Linux编辑器-vim使用

vi/vim 是 Linux 系统内置的不可或缺的文本编辑命令,vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。我们主要学vim。

1.1vim的基本概念

这里主要讲解vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+; 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入:

help vim-modes

1.2vim的基本操作

进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:
在这里插入图片描述
不过有一点要特别注意,就是你进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字

[正常模式]切换至[插入模式]
输入a
输入i
输入o

[插入模式]切换至[正常模式]
目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。

[正常模式]切换至[末行模式]
「shift + ;」, 其实就是输入「:」
退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:
: w (保存当前文件)
: wq (输入「wq」,存盘并退出vim)
: q! (输入q!,不存盘强制退出vim)

在这里插入图片描述

1.3命令模式命令集

1.3.1光标定位

光标移到改行最右边

shift + 4 -----> $

光标移到改行最左边

shift + 6 -----> ^

光标到结尾

shift + g -----> G

光标到开头

gg

跳转光标到指定行,n代表的是行号

n+shift+g

1.3.2光标移动

h

j

k

l

向后按照单词移动

w

支持 nw

向前按照单词移动

b

支持 nb

1.3.3文本复制

执行的是光标所在行位置

复制

yy

默认复制一行

nyy

支持光标所在行,进行多行复制 n是行数

粘贴

p

光标在哪里,就向哪里粘贴。默认一次

np

支持对内容,进行多行粘贴

撤销

u

删除

dd

删除光标所在行

ndd

支持光标所在行,进行多行删除

剪切

dd+p

在光标所在行进行剪切

ndd+p

支持多行剪切

取消u操作

ctrl+r

1.3.4文本操作

文本行大小写转换

shift+~

文本行批量化替换(当前行文本写错,不想删除,直接shift+r,换一行内容)

shift+r

shift+r其实由命令模式切换到替换模式

替换光标所在行的一个字符

r

替换光标所在行n个字符,只能换成一样的

nr

替换光标所在行的字符,随意替换

R

行内删除,向后删除一个字符

x

向后删除n个字符,包括光标所在位这个位置

nx

向前删除一个字符

shift+x ------>X

向前删除n个字符,不包括光标所在位这个位置

n+shift+x

剪切操作

nx+p

删除光标所在行的单词,并进入插入模式

cw

删除光标所在行n个单词,并进入插入模式

cnw

1.4插入模式命令集

命令模式切换到插入模式

i/a/o

1.5底行模式命令集

调出/取消行号

set nu/nonu

强制退出

q!

强制写入

w!

强制写入并退出

wq!

分屏

vs 文件名

在这里插入图片描述

无论分多少屏幕,光标只有一个!!光标的意义:选中当前行(编辑的位置)或者屏幕。

光标跨屏幕

ctrl+ww

有了这个指令,就可以尝试在不同文件里进行其他操作了

不退出vim,执行Liunx命令

!+指令

在这里插入图片描述
按q退出

替换

%s/前/后/g

把文件里属于前的内容全部用后的内容替换

在这里插入图片描述在这里插入图片描述

2.vim配置

1.vim配置是一人一份的,一个用户配置的是自己的,不影响别人。
2.每个人虽然用的都是同一个vim程序,但是大家用的是不同的vim配置,这是因为每个用户,在自己家目录下配置,这样就是独属于自己的配置了。

vim的基本配置
在自己家目录下创建一个.vimrc文件,在里面配置
在这里插入图片描述
在这里插入图片描述
打开文件,会自动显示行号
在这里插入图片描述
感兴趣可以到网上搜索一下vim配置,配置属于你自己的那一份。

这里有一份别人配置好的,分享给大家。
vim配置

往下翻,找到这个,复制这条命令,在自己家目录下执行这条命令
在这里插入图片描述
输入root密码,然后等待安装
在这里插入图片描述
在这里插入图片描述
这样就配置就完成了。自己上手看一下效果,
在这里插入图片描述
这里就是我们配置好的文件,不要删除,保留即可
在这里插入图片描述
这里配置Tab有一点点问题,打开.vimrc文件
在这里插入图片描述
找到这里把2,都修改成4,保存退出,这样完整的一份vim就好了。
在这里插入图片描述
在这里插入图片描述

3.sudo配置

1.先把自己切换成root
在这里插入图片描述
2.编辑sudoers文件
在这里插入图片描述
找到这里,复制粘贴一下,然后强制保存退出,
在这里插入图片描述
在sudo提权的时候,输入一下自己的密码就可以正常使用了。

4.Linux编辑器-gcc/g++使用

4.1背景知识

我们知道程序编辑完,ctrl+F5就会把编译和链接都完成了。但是编译到链接又分了几个步骤:
1.预处理(头文件展开,去注释,宏的替换,条件编译)
2.编译(把c语言变成汇编语言)
3.汇编(把汇编语言生成二进制指令)
4.链接(将目标文件和链接库进行链接生成可执行文件)

4.2gcc如何操作

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

以下面这段代码为例

在这里插入图片描述

1.直接完成编译和链接过程生成可执行程序

gcc test.c

在这里插入图片描述
a.out就是可执行程序

./a.out

执行可执行程序
在这里插入图片描述

2.依次处理编译和链接过程

预处理
预处理功能主要包括头文件展开,去注释,宏的替换,条件编译等。
预处理指令是以#号开头的代码行。
实例:

gcc –E test.c –o test.i

选项“-E”,该选项的作用是从现在开始,进行程序的翻译,当预处理完成之后,就停下来
选项“-o”是指形成的临时文件,“.i”文件为已经过预处理的C原始程序

编译
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
实例:

gcc -S test.i -o test.s

选项“-S”,该选项的作用是从现在开始,进行程序的翻译,做完编译工作,变成汇编语言后就停下来。

汇编
汇编阶段是把编译阶段生成的“.s”文件转成目标文件(该目标文件不是可执行文件,只是二进制目标文件)
实例:

gcc -c test.s -o test.o

选项“-c”,该选项的作用是从现在开始,进行程序的翻译,做完汇编工作,编程二进制目标文件就停下来

下面指令,可以查看二进制指令

od test.o

做完上面的工作,一定不能忘记链接的过程,因为上面的只是在编译你的代码,就比如说printf是一个库函数,我们直接就使用了,头文件展开只是告诉这个函数怎么用,有这个函数。并没有定义它,必须要去库里面找。

链接
把自己写的代码与C标准库的代码合起来形成可执行程序
实例:

gcc test.o -o mytest

指定可执行程序名称

gcc test.o 

形成可执行程序默认名称为a.out

如果想执行C++代码,把gcc换成g++

5.函数库

就如上面所说,printf我们并没有去定义实现它,头文件包含了对该函数的声明,而没有定义函数的实现,那么是在哪里实现printf函数的呢?

答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

5.1函数库的分类

链接的本质:就是我们调用库函数的时候,和标准库如何关联的问题。

函数库分为动态库和静态库。
在这里插入图片描述
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。

动态库和静态库优缺点:
优点:
动态库:形成的可执行程序小,节省资源(内存,磁盘,网络)。
静态库:不受库升级或者被删除等影响。

缺点:
动态库:受到库升级或被删除等影响
静态库:形成可执行程序太大

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

file mytest

在这里插入图片描述

查看可执行程序依赖的动态库列表

ldd mytest

在这里插入图片描述

动态库
libxxx.so
lib前缀
.so后缀
去掉前缀和后缀,剩下的就是库名称

静态库
libxxx.a
lib前缀
.a后缀

Liunx下默认形成可执行程序使用“动态库”

动态

gcc test.c -o mytest

静态(需要指定)

gcc test.c -o mytest -static

注意

如果系统中只提供.so文件,只能用动态链接,或者只提供.a文件,即使不指定static也是静态链接。如果动静态库都有,默认使用动态库。

一般而言,系统会自动携带动态库的,这是因为系统的运行就需要动态库。静态库如果不存在需要自己手动安装。

安装C静态库

sudo yun install -y glibc-static

安装C++静态库

sudo yum install -y libstdc++-static

关于Liunx的动静态库的问题,在windows下原理是一样的。
默认形成可执行程序:动态链接

windows下动态库后缀.dll,静态库后缀.lib

注意:系统本身为了支持我们编程,除了提供标准库.h,还提供了标准库的实现.so/.a

6.Liunx调试器-gdb使用

Liunx和windows调试方式不一样,但调试思路是一样的。
Liunx是使用gdb命令行调试

6.1背景知识

1.程序的发布方式有两种,debug模式和release模式。
2.Linux gcc/g++出来的二进制程序,默认是release模式。gdb不能直接对release模式下发行的程序进行调试,需要改成debug模式下发行的程序。
3.生成debug模式下的程序,必须在源代码生成二进制程序的时候, 加上 -g 选项

总结:

gcc默认行为
1.默认动态链接
2.默认release模式

vim默认行为
1.默认打开就是命令模式

开始调试

gcc test.c -g -o mytest
gcc mytest

退出调试

q

6.2gdb命令集

下面命令都是简写,也可以使用完整的命令

显示代码
list

l

从0行开始显示代码

l 0

这里显示代码并不会完全显示出来,再按回车键继续显示

在n行设置断点
break

b n

查看断点

info b

删除断点
delete

d 编号

在这里插入图片描述

调试运行,跑到断点处
run

r

逐过程
next

n

逐语句
step

s

跳转到下一个断点处
contiue

c

查看函数调用堆栈

bt

执行当前函数返回,然后停下来等待命令

finish

在这里插入图片描述

查看变量/地址
p,只显示一次

p 变量/地址

常显示

display 变量/地址

取消常显示

undisplay 编号

跳转到指定行

until n

修改变量的值
i是变量

set var i=100

显示当前栈帧局部变量的值

info locals

禁用断点

disable breakpoint 编号

启用断点

enable 编号

7.Linux项目自动化构建工具-make/Makefile

7.1背景

1.会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
2.一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
3.makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
4.make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
5.make是一条命令makefile是一个文件,两个搭配使用,完成项目自动化构建。

7.2makefile原理

makefile存在的意义:是为了构建项目(做一件事情)。
构建项目需要:1.依赖关系 2.依赖方法

比如,要做一件事情,找你爸要钱。
a.表明依赖关系(我是你的儿子/女儿)
b.表面依赖方法(你得给我转钱)

7.3初步理解makefile的语法

在代码路径下创建一个makefile文件
在这里插入图片描述
在这里插入图片描述

第一行依赖关系,:左边目标文件/可执行程序:右边依赖文件列表
第二行依赖方法,必须以Tab键开头

依赖关系:目标文件/可执行程序与源文件互相依赖关系
依赖方法:根据依赖关系,从依赖文件列表生成目标文件/可执行程序

有了可执行程序,还需要一个删除可执行程序指令。

在这里插入图片描述
clean不需要依赖

.PHONY被该关键字修饰的对象是一个伪目标,该目标总是可以被执行

在这里插入图片描述

再看下面图片,对比一下两张图片
在这里插入图片描述

发现只能make一次,make clean可以执行多次,gcc是如何得知,我不需要编译了呢?

stat 文件名(查看文件属性)  

在这里插入图片描述

Access:文件被访问的时间
Modify:文件内容被修改的时间
Change:文件属性被修改的时间

在这里插入图片描述
在这里插入图片描述

修改文件内容的时候,发现文件属性也变了,这是为什么?
因为文件大小变量,属性也就变了。文件属性包括:文件名,类型,大小。。。

至于大家看到Access也变了,下面就解释。

在看下面一张图片
在这里插入图片描述

当我们读取内容的时候,发现有的时候Access时间不变,这是为什么呢?
首先回答,文件操作时,改文件内容多,还是访问多?
肯定时访问多。如果一访问就修改Access的时间,需要进行多次IO操作,其次没人会关心访问文件多少次。

因此,一段时间访问次数够了,Access才会变。

gcc是根据对比源文件和可执行程序的Modify时间的新旧来判断,来判断可执行程序是否重新编译。
源文件比可执行程序时间旧,就不用重新编译,如果新就重新编译。

因此凡是被.PHONY修饰的,不再根据对比modify时间新旧的策略,而是总是执行一次。

7.4两个问题

问:
为什么make,就可以执行makefile第一条规则,执行第二条规则必须make clean?
答:
make默认从上到下扫描文本,默认第一个被扫描的目标文件,可以省略名称。

问:
make为什么走完第一条规则就不往下走了?
答:
默认情况下makefile只形成一个目标文件,后续的依赖关系和依赖方法不再执行,默认从上到下扫描只执行第一个。默认不指定就执行第一个。

7.5makefile推导规则

mytest:test.c

其实mytest并不直接依赖test.c

真实情况是这样

mytest:test.o
	gcc test.o -o mytest
test.o:test.s
	gcc -c test.s -o test.o
test.s:test.i
	gcc -S test.i -o test.s
test.i:test.c
	gcc -E test.c -o test.i

mytest依赖test.o,test.o不存在因此不执行依赖方法,然后去找test.o。。。。最后test.i依赖test.c,test.c存在执行依赖方法,然后层层返依次执行。

但是不推荐这样写,直接mytest:test.c,下面跟着依赖方法就行了。

自此关于Liunx编辑器vim,编译器gcc/g++,调试器gdb,vim配置,sudo配置,以及简单了解Liunx项目自动化构建工具make/makefile到这里暂时告一段落。

觉得有帮助的,点赞,评论,收藏,谢谢!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6 - generator和async函数

一、前言 ES6 诞生以前,异步编程的方法,大概有下面四种。 回调函数事件监听发布/订阅Promise 对象 回调函数本身并没有问题,它的问题出现在多个回调函数嵌套会造成回调地狱,非常不利于代码的维护和逻辑混乱等问题; …

数论分块学习笔记

准备开始复习莫比乌斯反演,杜教筛这一部分,先复习一下数论分块 0.随便说说 数论分块可以计算如下形式的式子 ∑ i 1 n f ( i ) g ( ⌊ n i ⌋ ) \sum_{i1}^{n}f(i)g(\lfloor\frac{n}{i}\rfloor) ∑i1n​f(i)g(⌊in​⌋)。 利用的原理是 ⌊ n i ⌋ \lf…

StarRocks数据库部署全记录(保姆式帮助你初次体验StarRocks)

因业务需要,特此了解StarRocks产品和部署。 接触过程中发现指导资料很稀少,本人将结合官方的手册其他开源博主指导,将第一次接触到的概念和部署流程梳理,得出本文。 已有的资源中对细节介绍欠缺,导致我本人整个过程中花…

fifo读写的数据个数

fifo IP核设置读写个数 如果不勾选精确值,则统计的当前写入和待读出的数据为估计值,可能会相差2个左右。且fifo设计的wr_data_count. wr_data_count:当前的fifo中剩余已经写入的数据。 rd_data_count:当前的fifo中剩余可以读出…

Codeforces Round 855 (Div. 3) E题题解

文章目录 [ Unforgivable Curse (hard version)](https://codeforces.com/contest/1800/problem/E2)问题建模问题分析方法1分析性质1.分析操作对元素位置的影响2.分析可以使用操作的元素可以与相邻元素交换位置的作用代码 方法2通过DFS得到相互可以交换位置的字符集合代码 方法…

vue3和typescript_组件

1 components下新建myComponent.vue 2 页面中引入组件,传入值,并且绑定事件函数。 3

原型链污染,nodejs逃逸例子

文章目录 原型链污染原型链污染原理原型链污染小例子 原型链污染题目解析第一题第二题 Nodejs沙箱逃逸方法一方法二 原型链污染 原型链污染原理 原型链 function test(){this.a test; } b new test;可以看到b在实例化为test对象以后,就可以输出test类中的属性a…

关于Linux启动后eth0网卡起不来的问题

1./etc/udev/rules.d/70-persistent-net.rules 先到这个文件中 将eth0注掉 ## 同时记录ADDR 2.mv /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth2 注意这个eth2, 要和第一步的号码对应 同时进入文件,将设备和ADDR修改 3.重启网络 servi…

FTP文件传输协议

FTP文件传输协议 介绍 将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中,是一项基本的网络应用,即文件传送文件传输协议(File Transfer Protocol)是因特网上使用得最广泛的文件传输协议 FTP提供交互式访问,允许客户指明文件…

flask中写一个基础的sqlHelper类

写一个SQLHelper类: from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class SQLHelper:staticmethoddef add(record):db.session.add(record)return SQLHelper.session_commit()staticmethoddef add_all(records):db.session.add_all(records)return SQLH…

FFmepg视频解码

1 前言 上一篇文章<FFmpeg下载安装及Windows开发环境设置>介绍了FFmpeg的下载安装及环境配置&#xff0c;本文介绍最简单的FFmpeg视频解码示例。 2 视频解码过程 本文只讨论视频解码。 FFmpeg视频解码的过程比较简单&#xff0c;实际就4步&#xff1a; 打开媒体流获取…

Meta-Transformer:基于Transformer的多模态感知,融合Token化与共享编码

论文标题&#xff1a;Meta-Transformer: A Unified Framework for Multimodal Learning 论文地址&#xff1a;https://arxiv.org/pdf/2307.10802.pdf 这里写目录标题 引言基于Transformer的多模态发展Meta-Transformer框架预备知识数据到序列如何分词&#xff08;Data-to-Seq…

Clion一个项目内多个main

创建单个main文件时 这样的文件不属于任何项目&#xff0c;每个文件都有自己的exe

全网最强,Jmeter接口测试-SHA256加密接口测试(详细实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口文档如下&…

【福建事业单位-语言理解】04 逻辑填空-病句-歧义

【福建事业单位-语言理解】04 逻辑填空-病句-歧义 一、逻辑填空1.1 词的辨析1.1.1词义侧重1.1.2固定搭配1.1.3程度轻重1.1.4 感情色彩总结 1.2语境分析&#xff08;关联关系&#xff09;1.2.1 转折1.2.2递进1.2.3并列1.2.4因果关系 1.3语境分析&#xff08;对应关系&#xff09…

中国工商银行长春分行 聚焦融合互促 让机关党建更有活力

党的十八大以来&#xff0c;中国工商银行长春分行党委认真落实中央部署&#xff0c;立足金融工作政治性、人民性的基本原则&#xff0c;深刻把握机关党建的要点、着力破解难点、大力打造亮点&#xff0c;围绕“党建”模式&#xff0c;将党建融入经营管理各个方面&#xff0c;使…

SSD 之乱七八糟的概念

1. 性能指标有哪些&#xff1f;分别是什么意思&#xff1f; 硬盘性能指标一般包括 IOPS&#xff08;反映的是随机读写性能&#xff09;、吞吐量&#xff08;也称为带宽&#xff0c;反映的是顺序读写性能&#xff09;、Response Time / Latency&#xff08;响应时间 / 时延&…

dev控件gridControl,gridview中添加合计

需求&#xff1a;在合并结账查询中&#xff0c;双击每一条结账出现这次结账对应的结算明细&#xff1a; 弹出的页面包括&#xff1a;结算日期&#xff0c;ID&#xff0c;姓名&#xff0c;费别&#xff0c;预交金收入&#xff0c;结算金额&#xff0c;收据号&#xff0c;合计&a…

什么是线程?为什么需要线程?和进程的区别?

目录 前言 一.线程是什么&#xff1f; 1.1.为什么需要线程 1.2线程的概念 1.3线程和进程的区别 二.线程的生命周期 三.认识多线程 总结 &#x1f381;个人主页&#xff1a;tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主 &#x1f3a5; 本文由 tq02 原创&#xf…

振动试验台使用过程中经常用到的计算公式,推荐收藏!

以下为正文&#xff1a; 1、求推力(F)的公式 式中&#xff1a; F — 推力(激振力)(N) m0 — 振动台运动部分有效质量(kg) m1 — 辅助台面质量(kg) m2 — 试件(包括夹具、安装螺钉)质量(kg) A — 试验加速度(m/s) 2、加速度(A)、速度(V)、位移(D)三个振动参数的互换运算…