选择题
1.数组名作为参数传递给函数,作为该参数的数组名被处理为()
A 该数组的长度
B 该数组的元素个数
C 该数组中元素的值
D 该数组的首地址
正确答案:D
参考答案:选D。
数组名就是数组的首地址。
用数组名做函数参数时所进行的传递实际上是地址的传递,也就是把实参数组的首地址赋予形参数组名。
形参数组名取得该首地址后,也就等于有了具体的地址。
实际上是形参数组和实参数组为同一数组,共同使用一段内存空间。
知识点:C语言
2.以下代码段中循环执行的次数是()
int k = 0;
do {
++k;
} while(k < 1);
A 一次也不执行
B 无限次
C 执行1次
D 有语法错误,不能执行
正确答案:C
官方解析:
do-while 语句至少执行一次,A 选项错误。
第一次执行后 k 自增变为1。1 < 1为假,退出循环。因此只执行 1 次。C选项正确。
知识点:C++、C++工程师、2019、C语言
3.()运算符把其操作数中所有值为0和所有值为1的位分别在结果的相应中设置1和0
A &
B |
C !
D ~
正确答案是 D. ~。
这是因为 ~
运算符是按位取反运算符(bitwise NOT)。它会将操作数中所有的 0
变成 1
,所有的 1
变成 0
。
解释选项:
-
A. & (按位与,bitwise AND):
按位与运算符会对两个操作数的每一位进行“与”运算,只有当两个位都是1
时,结果才为1
。例如:5 & 3: 0101 & 0011 = 0001
这个操作并不是将所有
0
变成1
,所有1
变成0
,所以与题目描述不符。 -
B. | (按位或,bitwise OR):
按位或运算符会对两个操作数的每一位进行“或”运算,只要任意一位是1
,结果就为1
。例如:5 | 3: 0101 | 0011 = 0111
这个操作也不会将所有
0
变成1
,所有1
变成0
。 -
C. !(表示逻辑非,logical NOT,但这不是标准的按位运算符):
如果是逻辑非(通常是!
),那么它只是对一个布尔值进行取反,True
变成False
,False
变成True
。这不是按位操作,因此也与题目不符。 -
D. ~ (按位取反,bitwise NOT):
按位取反运算符~
会将操作数的每一位进行翻转,即0
变为1
,1
变为0
。例如:~5: 5 在二进制下是 0000 0101 ~5 = 1111 1010 (在有符号整数下这表示 -6)
这个运算符与题目描述完全符合。
4.执行下列语句后的结果为( )
int x = 3, y;
int *px = &x;
y = *px++;
正确答案:B
你的答案:C
执行语句后的结果分析:
第一步:初始化变量
int x = 3, y;
x
被初始化为 3。y
被声明但未初始化,其值是未定义的。
第二步:定义指针并初始化
int *px = &x;
px
是一个指向int
类型的指针,被初始化为指向变量x
的地址。
第三步:执行复合赋值语句
y = *px++;
这里涉及到两个操作:
- 解引用操作:
*px
表示获取指针px
所指向的值,即x
的值,也就是 3。 - 后置递增操作:
px++
表示先使用当前的px
值,然后再将px
的值增加 1(即指向下一个int
类型的地址)。
由于这两个操作的结合方式,根据运算符优先级,先进行解引用操作,再进行递增操作。因此,y
被赋值为 *px
的当前值,即 3,然后 px
的值增加 1。
最终结果
执行完所有语句后:
x
的值仍然是 3。y
的值被赋为了 3。px
现在指向x
之后的地址(具体值取决于内存布局,但与y
的值无关)。
5.有以下程序
#include <stdio.h>
main(){
int a = 2, c = 5;
printf("a=%%d,b=%%d\n", a, c);
}
则程序的输出结果是()
A a=2,b=5
B a=%2,b=%5
C a=%d,b=%d
D a=%%d,b=%%d
正确答案:C
你的答案:B
官方解析:
C 语言中用 “%%” 打印输出字符 “%”,
所以 %%d, 输出为 %d 两个普通字符 , 而不是格式控制符 “%d” 的含义 ,
所以打印结果为 C 。
知识点:C++、C语言
6.对于函数void f(int x);,下面调用正确的是()
A int y=f(9);
B f(9);
C f(f(9));
D x=f();
正确答案:B
参考答案:选B。
根据题目所给的函数void f(int x),得出该函数: 无返回值。不能给A选项中的变量y赋值,也不能作为C选项中的参数。所以A、C错误。
调用时需要一个int型的参数,而D选项中属于无参数函数,与题目不符合。所以D错误。
知识点:C++、C语言
编程题
描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例1
输入:{1,2,3}
返回值:{3,2,1}
示例2
输入:{ }
返回值:{ }
说明:空链表则输出空
答案
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
struct ListNode* ReverseList(struct ListNode* head ) {
// write code here
struct ListNode* prev = NULL;
struct ListNode* curr = head;
while (curr != NULL) {
struct ListNode* nextNode = curr->next;
curr->next = prev;
prev = curr;
curr = nextNode;
}
return prev;
}