单片机工程师笔试题目归纳汇总

基础知识

波特率
1)定义:

波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。??

在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。波特率是传输通道频宽的指标。

2)计算:

波特率115200 = 115200 (位/秒)

以最普通的串口(起始位+8位数据+停止位)为例:

除以 10,得到的是每秒字节数:
波特率115200 = 115200 (位/秒) = 11520 (字节/秒) 

再除以 1024,就是每秒 KB 数:
波特率115200 = 115200 (位/秒) = 11.25 (KB/秒) 

如果有一位奇偶校验位,就应该除以 11,得到的是每秒字节数。

最后:

          波特率115200 = 115200 (位/秒) = 10.27 (KB/秒)

备注:

          二进制环境下,波特率 = 比特率。

哈佛结构

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问,目的是为了减轻程序运行时的访存瓶颈。

程序指令储存和数据储存分开,数据和指令的储存可以同时进行,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。 

其中,51单片机和stm32都为哈佛结构。

冯诺依曼结构

冯·诺依曼结构,又称为普林斯顿体系结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。取指令和取操作数都在同一总线上,通过分时复用的方式进行;缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。由于程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。 

其中,msp430、ARM7、freescale等单片机为冯诺依曼结构。

常用输出格式类型:
%hd,十进制有符号短整型

%d,十进制有符号整型

%ld,十进制有符号长整型

%hu,十进制无符号短整型

%u,十进制无符号整型

%lu,十进制无符号长整型

%c,字符型

%s,字符串型

%f,十进制浮点型

%lf,十进制双精度浮点型

%e,科学计数法格式

%x,十六进制

%o,八进制

%p,十六进制形式指针

%%,输出’%’字符

选择题

1:设float a=2, b=4, c=3;,以下C语言表达式与代数式 (a+b)+c计算结果不一致的是

  A.(a+b)*c/2

  B.(1/2)*(a+b)*c

  C.(a+b)*c*1/2

  D.c/2*(a+b)

  参考答案:B,因为a,b,c三个变量都是浮点数,B答案(1/2)为整形除以整形,得到的结果也是整形,结果为0;如果改成1/2.0就正确了。代数式中1/2为0.5,其余都是先进行浮点型数据运算或浮点型与整数型运算,得到的结果为浮点型。

2:为了向二进制文件尾部增加数据,打开文件的方式应采用

  A.″ab″

  B.″rb+″

  C.″wb″

  D.″wb+″

  参考答案:D

3:下述程序执行后的输出结果是

  #include

  main()

  {

  int x=’f’;

  printf(“%cn”,’a’+(x-‘a’+1));

  }

  A.g

  B.h

  C.i

  D.j

  参考答案:A

4:C语言中,下列运算符优先级最高的是

  A.!

  B.%

  C.>>

  D.= =

  参考答案:A

5:数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。

  A.*a

  B.a [ 0 ]

  C.a

  D.a++

  参考答案:D

6:执行语句“ k=7>>1; ”后,变量 k 的当前值是

  A.15

  B.31

  C.3

  D.1

  参考答案:C

7:定义函数时,缺省函数的类型声明,则函数类型取缺省类型

  A.void

  B.char

  C.float

  D.int

  参考答案:D

8:若main()函数带参数,参数个数最多是

  A.0

  B.1

  C.2

  D.3

  参考答案:C 只知道有定义形式main(int argc,char* argv[]))

9:若有宏定义:#define MOD(x,y) x%y

  则执行以下语句后的输出结果是

  int a=13,b=94;

  printf(″%dn″,MOD(b,a+4));

  A.5

  B.7

  C.9

  D.11

  参考答案:B

10:下列各个错误中,哪一个不属于编译错误

  A.改变 x 原值 3 为 5 ,写作“ x==5 ;”

  B.花括号不配对

  C.复合语句中的最后一条语句后未加分号

  D.变量有引用、无定义

  参考答案:A

11:下列程序段运行后, x 的值是( )

  a=1;b=2;x=0;

  if(!( — a))x — ;

  if(!b)x=7;else ++x;

  A.0

  B.3

  C.6

  D.7

  参考答案:A

12:设

  #define N 3

  #define Y(n) ((N+1)*n)

  则表达式2*(N+Y(5+1))的值是

  A.42

  B.48

  C.54

  D.出错

  参考答案:B Y(5+1) 传递过去的应该是6,而不是简单的把5+1给替换掉

13:若定义了char ch[]={″abc def″},*p=ch;则执行printf(″%c″,*p+4);语句的输出结果是

  A.def

  B.d

  C.e

  D.0

  参考答案:C

14:下列转义字符中错误的是

  A.′ 00′

  B.′14′

  C.′x111′

  D.′2′

  参考答案:C error C2022: ‘273’ : too big for character

15:算术运算符,赋值运算符和关系运算符的`运算优先级按从高到低依次为

  A.算术运算、赋值运算、关系运算

  B.算术运算、关系运算、赋值运算

  C.关系运算、赋值运算、算术运算

  D.关系运算、算术运算、赋值运算

  参考答案:B

16:设#define N 3

  #define Y(n) ((N+1)*n)

  则表达式2*(N+Y(5+1))的值是

  A.42

  B.48

  C.54

  D.出错

  参考答案:B

17:表达式 strcmp( “ 3.14 ”,“ 3.278 ” ) 的值是一个

  A.非零整数

  B.浮点数

  C.0

  D.字符

  参考答案: A

18:设struct

  { short a;

  char b;

  float c;

  }cs;

  则sizeof(cs)的值是

  A.4

  B.5

  C.6

  D.7

  参考答案: D 字节对齐的话应该是8

19:若变量已正确定义,表达式( j=3 , j++ )的值是

  A.3

  B.4

  C.5

  D.0

  参考答案:A

20:C 语言中运算对象必须是整型的运算符是

  A.%

  B./

  C.!

  D.**

  参考答案:A

  简答题

21、在多任务实时系统中,任务间或者中断服务与任务间常需要交换信息,这种信息交换分别为以下哪两个途径()

A、开/关中断和信息邮箱
B、共享存储区和消息传递
C、邮箱机制和数据共享机制
D、非占先式内核和占先式内核机制

22、(多选)有声明

void fun5(int *); 
void fun4(int &a);  
int a;
int *p = &a;

在下列选项中,正确的调用是(  )。
1
2
3
4
5
6
A、fun5(&a);
B、fun5(p);
C、fun4(&a);
D、fun4(p);

答案:A、B
解析:
fun5()的参数是指针,fun4()的参数是普通int
 

23、μC/OS-II操作系统通过事件控制块ECB支持任务间通信。下列说法中错误的是( )。

A、中断服务程序不能等待信号
B、任务可以通过ECB向其他任务发信号
C、多个任务可以同时等待同一事件发生。当该事件发生后,所有等待该事件的任务都能得到该事件并进入运行状态
D、中断服务程序可以通过ECB发信号

答案:C
解析:
μC/OS-II信号量管理的工作原理
μC/OS-II中信号量主要数据结构由两部分组成:(1)信号量的计数值Cnt。当数值为正时用于记录可使用的资源数,当数值为负,其绝对值表示等待当前信号量的任务个数;(2)等待该信号量的任务列表。信号量的基本数据结构需要申请一个ECB来存储。一个任务或ISR可以通过ECB向另外的任务发信号,一个任务可以等待另一个任务或中断服务子程序给它发送信号(中断服务只能发送信号),多个任务可同时等待同一个事件的发生。当事件发生后,等待该事件的优先级最高的任务进入就绪状态,触发一次任务调度。任务或者中断服务子程序都可以给ECB发信号,对ECB进行操作。
 

24、ARM指令完成的功能是如果清除R7中的bit0,1,5位,正确的指令是( )

A、ORR R7,R7,#0x00000023
B、AND R7,R7,#0xFFFFFFDC
C、BIC R7,R7,#0xFFFFFFDC
D、XOR R7,R7,#0xFFFFFFDC

答案:B;
解析
and,按位与,0XDC二进制是1110 1100可见bit0,bit1,bit5位是零。 选择B。

25、8段共阴极LED数码管示意如下图所示,为显示英文字母b,其编码(按dp g f e d c b a的顺序排列)是( )。

单片机工程师笔试题目归纳汇总

A、01111101
B、01110111
C、01111100
D、01111001

答案:C

26、下面关于UART的叙述中,正确的是( )。

A、UART不能实现全双工通信
B、UART即为通用异步收发器
C、UART通信波特率固定为115200bps,不能调节
D、UART发送字符的长度固定为8位

答案:B

27、一主一从式SPI连接示意如下图所示。从机SPI的4根信号线的名称已在图中标出,为保证主机与从机之间的正确连接及系统正常工作,图中主机的①、②、③、④的信号名称分别应该是什么/strong>

单片机工程师笔试题目归纳汇总
A 、MOSI、MISO、SCK、SSEL
B、SCK、MOSI、MISO、SSEL
C、MISO、MOSI、SCK、SSEL
D、SSEL、MOSI、SCK、MISO

答案:C
解析:
(1)MOSI:主出从入;
(2)MISO:主入从出;

28. int i =1;const int j =2;以下说法不正确的是

A const int *p1 = &i;

B const int *p2 = &j;

C int *const p3 = &i;

D int *const p4 = &j;

D
int *const p4 ,p4为指针常量,p4指向的内存位置不能改变,但是,p4所指内存存放的值是可以改变的。j表示常量,其数值不能被改变。
将j的地址赋给p4后, p4可以执行其他操作( 如*p4=4;),将j的值改变,因此,int *const p4 = &j;是错误的。

29. 32位系统中,该程序的输出为

A 5 5 4 4

B 6 5 4 4

C 6 5 6 4

D 5 5 5 100

B 6 5 4 4
使用函数**strlen() 求某个字符串的长度时是不包括结尾标志符’ ’ 的,但当你用sizeof()**求某个字符串占用的内存空间时, 结尾字符’ ’是被包括在里面的
strlen用来计算字符串的长度(在C/C++中,字符串是 以” ”作为结束符的),它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描直到碰到第一个字符串结束符 为止,然后返回计数器值。
sizeof是C语言的关键字,它以 字节的形式给出了其操作数的 存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。

30. 有以下程序,求输出结果

8
&是按位与,对应位都为1时该位得1,否则得0。所以 i&(i-1) 的作用:将i的二进制表示中的最右边的1置为0。
在本题中即数出2021转换成二进制有几个1就会走几次循环(不断除2)。2021对应的二进制是:10100111111,一共8个1,故走8次。
扩展:(n > 0 && ((n & (n – 1)) == 0)是判断n是不是2的次幂

31. 若 int x = 5&6,那么x的值为()

A 3

B 4

C 5

D 6

32. 以下错误的表达式为

A Q.a

B (*p).b

C p->a

D *p.b

D
*p=&Q ,把Q的地址赋值给了指针p,对p解引用其实就是Q。
A 选项肯定是对的,结构体的正常访问方法。
B 选项 (*p).b 等价于 Q.b
C p->a p为指针访问结构体用->没问题。
D *p.b 优先级问题,.的优先级高于 *,所以 *p.b == *(p.b),p为指针,访问结构体成员要用->。

单片机工程师笔试题目归纳汇总

扩展:结构体中.和->两种访问区别
定义结构体指针,访问成员时就用->
定义结构体变量,访问成员时就用.
struct A {
int a;
char b;
};
struct A q; //访问成员就用:q.a;
struct A *p; //访问成员就用:p->a;

33.以下程序的输出结果为

1
3和2是整形常量,所以3/2=1;前面(double) 1 = 1.000000;1.000000+0.5 = 1.500000;double转int会直接去掉小数部分。所以答案为1。
下面简单分析下double转int为什么会舍去小数部分
根据国际标准 IEEE 754,任意一个二进制浮点数 V 可以表示成下面的形式:
V = (-1) ^ s × M × 2 ^ E
(1)(-1)^s 表示符号位,当 s=0,V 为正数;当 s=1,V 为负数。
(2)M 表示有效数字,大于等于 1,小于 2,但整数部分的 1 不变,因此可以省略。M由frac编码。
(3)2^E 表示指数位。E由exp编码。

单片机工程师笔试题目归纳汇总

对于 64 位的双精度数来说,从低位到高位,尾数 M 用 52 位来表示,阶码用 11 位来表示,而符号位用最高位 1 位来表示,0 表示正,1 表示负。
将1.5转换为双精度浮点数的过程如下:

  1. 将十进制数1.5转换成二进制为1.1。
  2. 1.1用二进制的科学计数法表示为1.1 * 2^0
  3. 按照上面浮点数的存储结构, 得出符号位为: 0,表示正数;阶码(指数) E 为1023; 小数部分 M 为1。
  4. 双 精 度 的 二 进 制 位 : 0_01111111111_0000000000000000000000000000000000000000000000000001

int类型为32位,double转换为int只能截取低32位为00000000000000000000000000000001。
所以最终的输出结果为1。

34.下面这段代码的输出结果为:(A)

#include
void change(int*a, int&b, int c)
{
c=*a;
b=30;
*a=20;
}
int main ( )
{
int a=10, b=20, c=30;
change(&a,b,c);
printf(“%d,%d,%d,”,a,b,c);
return 0;
}

A 20,30,30
B 10,20,30
C 20,30,10
D 10,30,30

解析:
该题考察函数传参问题。
1,指针传参 -> 将变量的地址直接传入函数,函数中可以对其值进行修改。
2,引用传参 -> 将变量的引用传入函数,效果和指针相同。
3,值传参 -> 在传参过程中,首先将c的值复制给函数c变量,然后在函数中修改的即是函数的c变量,然后函数返回时,系统自动释放变量c。而对main函数的c没有影响。
a为指针传递,b为引用传递,c为值传递。
*a = 20; b = 30; a和b的值确实发生了修改。而c只是将值复制到形参,在函数内的操作并不会影响c的实际值,因此c还是为原来的30.

35.有一个如下的结构体:
struct A{
long a1;
short a2;
int a3;
int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少A)

A 24
B 28
C 16
D 18
解析:
32位编译器:32位系统下指针占用4字节
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器:64位系统下指针占用8字节
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
Win64下:long 8字节、short 2字节、int 4字节、int* 8字节,C++中内存对齐,按最大长度对齐:8+(2+4+2(补齐2字节))+8 = 24字节

36: 考查对volatile关键字的认识
#include
static jmp_buf buf;
main() 
{
volatile int b;
b =3;
if(setjmp(buf)!=0)
{
printf(“%d “, b); 
exit(0);
}
b=5;
longjmp(buf , 1);

请问, 这段程序的输出是
(a) 3
(b) 5
(c) 0
(d) 以上均不是

答案解析: (b)

volatile字面意思是易于挥发的。这个关键字来描述一个变量时, 意味着 给该变量赋值(写入)之后, 马上再读取,
写入的值与读取的值可能不一样,所以说它”容易挥发”的。 这是因为这个变量可能一个寄存器, 直接与外部设备相连, 你写入之后,
该寄存器也有可能被外部设备的写操作所改变;或者, 该变量被一个中断程序, 或另一个进程 改变了.

volatile 不会被编译器优化影响, 在longjump 后,它的值 是后面假定的变量值,b最后的值是5,所以5被打印出来.
setjmp : 设置非局部跳转 /* setjmp.h*/

Stores context information such as register values so that the lomgjmp
function can return control to the statement following the one calling
setjmp.Returns 0 when it is initially called.

Lonjjmp: 执行一个非局部跳转 /* setjmp.h*/

Transfers control to the statement where the call to setjmp (which
initialized buf) was made. Execution continues at this point as if
longjmp cannot return the value 0.A nonvolatile automatic variable
might be changed by a call to longjmp.When you use setjmp and longjmp,
the only automatic variables guaranteed to remain valid are those
declared volatile. Note: Test program without volatile qualifier
(result may very)

更详细介绍, 请参阅 C语言的setjmp和longjmp

37:考查类型转换

main()
{
struct node 
{
int a;
int b;
int c; 
};
struct node s= { 3, 5,6 };
struct node *pt = &s;
printf(“%d” , *(int*)pt);
}

这段程序的输出是:
(a) 3
(b) 5
? 6
(d) 7

答案解析: (a)

结构题的成员在内存中的地址是按照他们定义的位置顺序依次增长的。如果一个结构体的指针被看成 它的第一个成员的指针,那么该指针的确指向第一个成员

38:考查递归调用

int foo ( int x , int n) 
{
int val;
val =1;
if (n>0) 
{
if (n%2 == 1) val = val *x;
val = val * foo(x*x , n/2);
}
return val;
}

这段代码对x和n完成什么样的功能(操作)br> (a) x^n (x的n次幂)
(b) x*n(x与n的乘积)
? n^x(n的x次幂)
(d) 以上均不是

答案解析: (a)
此题目较难.
这个程序的非递归版本

int what ( int x , int n)
{
int val;
int product;
product =1;
val =x;
while(n>0)
{
if (n%2 == 1) 
product = product*val; 

/如果是奇数次幂, x(val)要先乘上一次,;
偶数次幂, 最后返回时才会到这里乘以1/

val = val* val; 
n = n/2; 
}
return product;
}
/* 用二元复乘策略 */
算法描述
(while n>0) 
{
if next most significant binary digit of n( power) is one
then multiply accumulated product by current val, 
reduce n(power) sequence by a factor of two using integer division.
get next val by multiply current value of itself 
}

39:考查指针,这道题只适合于那些特别细心且对指针和数组有深入理解的人

main() 
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);
printf(“%d %d” , *(a+1), *(ptr-1));
}

这段程序的输出是:
(a) 2 2
(b) 2 1
? 2 5
(d) 以上均不是

答案解析: ?

a的类型是一个整型数组,它有5个成员。&a的类型是一个整型数组的指针, 所以&a + 1指向的地方等同于a[6], 所以*(a+1)
等同于a[1] ptr等同a[6], ptr-1就等同与a[5]

40:考查多维数组与指针

void foo(int [][3]); 
main()
{
int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}};
foo(a);
printf(“%d” , a[2][1]);
}
void foo(int b[][3]) 
{
++ b;
b[1][1] =9;
}

这段程序的输出是:
(a) 8
(b) 9
? 7
(d)以上均不对

答案解析: (b)
题目自身就给了足够的提示

b[0][0] = 4
b[1][0] = 7

41:考查逗号表达式

main()
{
int a, b,c, d;
a=3;
b=5;
c=a,b;
d=(a,b);
printf(“c=%d” ,c);
printf(“d=%d” ,d);
}

这段程序的输出是:
(a) c=3 d=3
(b) c=5 d=3
? c=3 d=5
(d) c=5 d=5

答案解析: ?

考查逗号表达式,逗号表达式的优先级是很低的, 比 赋值(=)的优先级 低. 逗号表达式的值就是最后一个元素的值
逗号表达式的还有一个作用就是分割函数的参数列表… E1, E2, …, En 上面这个表示式的左右是,E1, E2,…
En的值被分别计算出来, En计算出来的结构赋给整个逗号表达式

c=a,b; / *yields c=a* /
d=(a,b); /* d =b */

42:考查指针数组

main()
{
int a[][3] = { 1,2,3 ,4,5,6};
int (*ptr)[3] = a;
printf(“%d %d “, (*ptr)[1], (*ptr)[2]);
++ptr;
printf(“%d %d” , (*ptr)[1], (*ptr)[2]);
}

这段程序的输出是:
(a) 2 3 5 6
(b) 2 3 4 5
? 4 5 0 0
(d) 以上均不对

答案解析: (a)

ptr是一个数组的指针, 该数组有3个int成员

43:考查函数指针

int *f1(void)
{
int x =10;
return(&x);
}
int *f2(void)
{
int*ptr;
*ptr =10;
return ptr;
}
int *f3(void)
{
int *ptr;
ptr=(int*) malloc(sizeof(int));
return ptr;
}

上面这3个函数哪一个最可能引起指针方面的问题
(a) 只有 f3
(b) 只有f1 and f3
? 只有f1 and f2
(d) f1 , f2 ,f3

答案解析: ?

f1显然有问题, 它返回一个局部变量的指针, 局部变量是保存在stack中的,退出函数后, 局部变量就销毁了, 保留其指针没有意义,
因为其指向的stack空间可能被其他变量覆盖了 f2也有问题, ptr是局部变量, 未初始化, 它的值是未知的, ptr不知道指向哪里了,
直接给ptr赋值可能会覆盖重要的系统变量, 这就是通常说的野指针的一种

44:考查自加操作(++)

main()
{
int i=3;
int j;
j = sizeof(++i+ ++i);
printf(“i=%d j=%d”, i ,j);
}

这段程序的输出是:
(a) i=4 j=2
(b) i=3 j=2
? i=3 j=4
(d) i=3 j=6

答案解析: (b)

sizeof 操作符给出其操作数需要占用的空间大小, 它是在编译时就可确定的, 所以其操作数即使是一个表达式, 也不需要在运行时进行计算.(
++i + ++ i )是不会执行的, 所以i的值还是3

45:考查形式参数, 实际参数, 指针和数组

void f1(int *, int); 
void f2(int *, int); 
void(*p[2]) (int *, int);
main()
{
int a;
int b;
p[0] = f1;
p[1] = f2;
a=3;
b=5;
p[0](&a, b);
printf(“%dt %dt”, a, b);
p[1](&a, b);
printf(“%dt %dt”, a, b);
}
void f1(int* p , int q)
{
int tmp;
tmp =*p;
*p = q;
q= tmp;
}
void f2(int* p , int q)
{
int tmp;
tmp =*p;
*p = q;
q= tmp;

这段程序的输出是:
(a) 5 5 5 5
(b) 3 5 3 5
? 5 3 5 3
(d) 3 3 3 3

答案解析: (a)
很显然选a.

f1交换*p 和 q的值, f1执行完后, *p 和 q的值的确交换了, 但q的改变不会影响到b的改变, *p 实际上就是a
所以执行f1后, a=b=5
这道题考查的知识范围很广,包括typedef自定义类型,函数指针,指针数组void(*p[ 2 ]) ( int *, int);
定义了一个函数指针的数组p,p有两个指针元素. 元素是函数的指针, 函数指针指向的函数是一个带2个参数,返回void的函数, 所带的两个参数是指向整型的指针, 和整型

p[ 0 ] = f1; p[ 1 ] = f2 contain address of function .function name without parenthesis represent address of function Value and address of variable is passed to function only argument that is effected is a (address is passed). Because of call by value f1, f2 can not effect b

46:考查自减操作(–)

void e(int ); 
main()
{
int a;
a=3;
e(a);
}
void e(int n)
{
if(n>0)
{
e(–n);
printf(“%d”, n);
e(–n);
}
}

这段程序的输出是:
(a) 0 1 2 0
(b) 0 1 2 1
? 1 2 0 1
(d) 0 2 1 1

答案解析: (a)

考查–操作和递归调用,仔细分析一下就可以了

47:考查typedef类型定义,函数指针
typedef int (test) ( float * , float)
test tmp;
tmp 的类型是
(a)

来源:*fzfw

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月1日
下一篇 2022年7月1日

相关推荐