笔试—经纬恒润嵌入式软件笔试
选择题
1、下面总线采用异步时序协议的是(14)
给的参考答案是1,实际这个有两个选项
1、USB
2、I2C
3、SPI
4、PCI
-
USB (Universal Serial Bus):
- USB 使用一个复杂的协议,涉及数据包、错误检查和许多其他功能。它不完全基于简单的同步或异步概念,但它确实有一个时钟线,但这个时钟并不总是用于每一个操作,所以它有时可以被视为异步的。
-
I2C (Inter-Integrated Circuit):
- I2C 使用一个明确的时钟线(SCL)和一个数据线(SDA)。由于它有一个专用的时钟线,数据传输是同步的。
-
SPI (Serial Peripheral Interface):
- SPI 至少有三条线:一个时钟线(SCLK),一个主设备到从设备的数据线(MOSI),以及一个从设备到主设备的数据线(MISO)。与 I2C 类似,由于 SPI 有一个专用的时钟线,它是同步的。
-
PCI (Peripheral Component Interconnect):
- PCI 是一个并行接口,它也有一个时钟信号。但是,与其他同步协议不同,PCI 采用异步时序,在某些操作中不需要时钟。
考察知识点:对各种总线的认识,同步,异步的外设都有哪些
以下为整理内容:
同步外设/协议:
- RAM (随机存取存储器): 数据传输与特定的时钟信号同步。
- SPI (Serial Peripheral Interface): 通过一个明确的时钟线(SCLK)与数据线同步。
- I2C (Inter-Integrated Circuit): 与 SPI 类似,它也使用一个明确的时钟线(SCL)进行同步。
- SATA (Serial AT Attachment): 用于磁盘驱动器和计算机间的数据传输,它是同步的。
- PCIe (Peripheral Component Interconnect Express): 用于连接各种设备到主板的高速接口,操作在一个同步的时钟下。
异步外设/协议:
- UART (Universal Asynchronous Receiver-Transmitter): 用于异步串行通信。
- USB (Universal Serial Bus): 尽管 USB 使用一个复杂的协议并包含时钟线,但数据传输是在异步模式下进行的。
- ATA (Advanced Technology Attachment, 通常称为 PATA, Parallel ATA): 这是一个并行接口,用于早期的硬盘驱动器和计算机间的数据传输,它是异步的。
- Ethernet (在某些模式下): 尽管 Ethernet 可能会有时钟同步,但数据包的发送是异步的。
- PS/2 (Personal System/2): 用于连接键盘和鼠标到计算机,它是异步的。
这些只是示例列表,实际上还有许多其他的同步和异步设备或协议。同步和异步的选择取决于特定应用的需求和设计约束。
2、设有int x=11;则表达式(X++*1/3)的值是? 3
(X++*1/3)
解答:
X++
是后置自增操作。这意味着它首先返回X
的当前值,并随后将X
的值增加 1。
在解析表达式之前,X
的值是 11
。当使用后置自增操作时,它首先返回 11
,然后 X
的值变成 12
。
- 然后,我们有乘法和除法操作。
在 C 语言中,乘法和除法具有相同的优先级,因此它们从左到右进行评估。
因此,先进行乘法运算,然后进行除法运算。
11 * 1 = 11
然后进行除法:
11 / 3 = 3
(因为我们用的是整数除法,结果也是整数)
所以,表达式 (X++*1/3)
的值是 3
。
注意:虽然表达式的值是 3
,但 X
的值在表达式评估后是 12
。
考察点: 前自增与后自增, 算术运算符优先级,整数除法
- 前自增 (
++variable
):- 该操作首先增加变量的值,然后返回新的值。
- 例如,假设我们有
int x = 5;
,执行int y = ++x;
之后,x
的值变为 6,y
的值也是 6。
- 后自增 (
variable++
):- 该操作首先返回变量的当前值,然后将变量的值增加 1。
- 例如,假设我们有
int x = 5;
,执行int y = x++;
之后,x
的值变为 6,但y
的值是 5(因为它接收了x
的原始值)。
为了更好地理解,考虑以下代码片段:
int a = 5, b, c;
b = ++a; // 前自增
c = a++; // 后自增
在这个例子中:
b
的值是 6,因为前自增首先将a
增加到 6,然后赋给b
。- 虽然在给
c
赋值时,a
的值是 6,但由于使用的是后自增,所以c
得到的值是 6。执行完这条语句后,a
的值变为 7。
总结:前自增首先增加值,然后进行其他操作;而后自增在进行其他操作后才增加值。在单独的语句中使用自增操作(例如 x++;
或 ++x;
)时,两者的效果是相同的,但当它们作为表达式的一部分时,它们的行为和结果是不同的。
算术运算符优先级
- 括号 (
()
):- 优先级最高,总是首先计算括号内的表达式。
- 正负号、递增、递减 (
+
(一元),-
(一元),++
,--
):- 如
-a
,+a
,a++
,++a
,a--
,--a
。
- 如
- 乘法、除法、取模 (
*
,/
,%
):- 它们的优先级相同,从左到右计算。
- 例如,在
a * b / c
中,首先计算a * b
,然后用该结果除以c
。
- 加法、减法 (
+
,-
):- 它们的优先级低于乘法、除法和取模,但在两者之间是相同的,并从左到右计算。
- 例如,在
a + b - c
中,首先计算a + b
,然后从该结果中减去c
。
在实际编程中,为了增加代码的清晰度并避免可能的混淆或错误,建议使用括号来明确指定计算的顺序,即使这些括号在某些情况下可能是多余的。
当你在 C 语言(以及许多其他编程语言)中进行整数除法时,如 11 / 3
,并且得到结果 3
而不是浮点数 3.6667...
,这是在考察以下几个重要概念:
- 整数除法:在许多编程语言中,两个整数的除法默认是整数除法。这意味着结果会被截断成整数,任何小数部分都会被丢弃。
- 数据类型:这与数据的类型有关。在上述情况中,被除数和除数都是整数,所以结果也是整数。如果你想得到一个浮点数结果,至少有一个操作数必须是浮点数(例如,
11.0 / 3
或11 / 3.0
)。 - 隐式类型转换:在某些语言中,当你混合使用整数和浮点数时,可能会发生隐式类型转换。了解这些转换是很重要的,否则可能会在不期望的时候得到错误的结果。
- 截断 vs 舍入:整数除法会截断任何小数部分,而不是四舍五入。
3.为了比较两个字符串s1和s2是否相等,应当使用(1)
1、if(strcmp(s1, s2)==0)
2、if(strcmp (&s1, &s2) ==0)
3、if(s1==s2)
4、if(s1=s2)
考察点:
- 字符串在 C 语言中如何比较。
strcmp
函数的使用和语义。- 指针与实际数据之间的区别。
- C 语言中的赋值和比较操作符。
1. 字符串在 C 语言中如何比较
在 C 语言中,字符串被视为字符数组,以空字符('\0'
)结尾。因为字符串只是字符数组,所以我们不能直接使用 ==
运算符来比较两个字符串是否相等。我们需要使用特定的函数来进行字符-by-字符的比较。
-
相关知识点
:
- 字符数组和字符指针。
- 字符串终止符(
'\0'
)。
2. strcmp
函数的使用和语义
strcmp
是 C 语言标准库 <string.h>
中的一个函数,用于比较两个字符串。
- 语义:如果两个字符串相同,
strcmp
返回0
。如果第一个字符串小于第二个字符串,返回一个负数;如果大于,则返回一个正数。 - C 语言还提供了其他字符串比较函数,如
strncmp
(比较字符串的前 n 个字符)、strcasecmp
(忽略大小写的比较)等。
3. 指针与实际数据之间的区别
在 C 语言中,指针只是一个变量,它存储了一个内存地址。它可能指向一个数据元素(如 int
、char
)、数据结构或函数。当我们比较两个指针时,我们实际上是在比较它们指向的地址,而不是它们指向的内容。
-
相关知识点
:
- 指针的定义和初始化。
- 指针算术。
- 指向不同类型的指针。
- 动态内存分配(如
malloc
和free
)。
4. C 语言中的赋值和比较操作符
- 赋值 (
=
):这是一个操作符,用于将右侧的值赋给左侧的变量。例如,a = b;
会将b
的值赋给a
。 - 比较 (
==
):这是一个关系操作符,用于比较两个变量的值是否相等。如果相等,它返回1
(真),否则返回0
(假)。 - 常见错误:在 C 语言中,混淆
=
和==
是初学者经常犯的一个常见错误,导致意外的程序行为。
4、C语言程序是由什么组成的? 1
1、一个主函数和若干子程序
2、若干子程序
3、函数
4、一些可执行语言
5、c语言程序的基本单位是 1
1、函数
2、字符
3、语句
4、程序行
6、使用哪个命令可以检测基本的网络连接:4
1、netstat
2、ifconfig
3、route
4、ping
以下是每个选项的解释以及它们的考察点:
- netstat: 这个命令显示网络连接、路由表、接口统计等。它主要用于检查当前设备上的网络连接的状态和统计信息。考察的是对系统当前网络连接和状态的检查和分析。
- ifconfig (在一些新版本的 Linux 系统上是
ip a
或ip addr
): 这个命令用于显示和配置网络接口。它可以告诉你关于你的网络接口的信息,例如 IP 地址、MAC 地址等。考察的是网络接口的配置和状态检查。 - route (在一些新版本的 Linux 系统上是
ip r
或ip route
): 这个命令用于显示和修改 IP 路由表。它可以让你知道数据包将如何从你的机器路由到其它位置。考察的是对网络路由的理解和配置。 - ping: 这个命令用于测试网络连接。它发送 ICMP Echo 请求到指定的网络地址,并等待回应。如果接收到回应,这意味着网络连接是好的。考察的是基本的网络故障排查和连接测试。
综上所述,这个题目考察的主要知识点是:
- Linux 系统下的网络命令及其用途。
- 对不同网络工具的功能和应用场景的理解。
- 基础的网络故障排查和诊断能力。
7、下面代码段的输出是(20 10 20)
#include "stdio.h"
void func(void)
{
static int tmp=10;
printf("%d " ,tmp);
}
int main()
{
int tmp=20;
printf("%d ",tmp);
func();
printf("%d " ,tmp);
}
考察对局部变量、静态局部变量和变量作用域的理解
- 局部变量:在
main
函数中,有一个局部变量tmp
,它的作用域仅限于main
函数。因此,当你在main
函数中打印tmp
,它引用的是这个局部变量。 - 静态局部变量:在
func
函数中,变量tmp
被声明为static
。这意味着,尽管tmp
是一个局部变量,但它不会在函数调用结束后被销毁。它会保留其值,直到程序结束。每次调用该函数时,它不会重新初始化tmp
。 - 变量的作用域和隐藏:尽管
func
和main
都有名为tmp
的变量,但由于它们的作用域,它们是完全不同的变量。当func
中的tmp
被打印时,它引用的是func
中的静态局部变量,而不是main
中的局部变量。这是一个关于如何局部变量可以"隐藏"在其他作用域中具有相同名称的变量的示例。 - 函数调用:代码展示了如何从一个函数(这里是
main
)调用另一个函数(这里是func
)。
所以,主要考察点是:
- 了解局部变量的作用域和生命周期。
- 了解静态局部变量的特性和用途。
- 理解变量的作用域,以及在不同作用域中相同名称的变量是如何被处理的。
- 基本的函数调用机制。
8.考察结构体对齐
#include "stdio.h"
struct Date{
char a;
int b;
int64_t c;
char d;
};
struct Date data[2][10];