【C语言刷题练习】

选择题

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 变成 FalseFalse 变成 True。这不是按位操作,因此也与题目不符。

  • D. ~ (按位取反,bitwise NOT):
    按位取反运算符 ~ 会将操作数的每一位进行翻转,即 0 变为 11 变为 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++;

这里涉及到两个操作:

  1. 解引用操作*px 表示获取指针 px 所指向的值,即 x 的值,也就是 3。
  2. 后置递增操作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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值