【C语言】填空题/程序填空题1

下列程序取出一个整数x的二进制表示中,从第p位开始的n位二进制,并输出所表示的整数值。如:

输入:-17 5 3

输出:5

【说明】整数-1732位二进制表示为:11111111 11111111 11111111 11101111,第5位(从右往左数,最右边位为第0位)开始的3位二进制为101,其所表示的整数为5

请填空补全程序。(空为???)

cs 复制代码
#include <stdio.h>

int GetBits(int x, int p, int n);

int main(void)
{
    int x, p, n;

    scanf("%d%d%d", &x, &p, &n);
    printf("%d\n", GetBits(x, p, n));

    return 0;
}

int GetBits(int x, int p, int n)
{
    x = ???; //将从第p位开始的n位二进制右移到最右边
    int mask = ???; //设置掩模为:最低n位全为1,其余位全为0
    return x & mask; //用位逻辑与运算,取出已处于最右边的n位二进制
}

答案:第一空:x>>(p+1-n)

第二空:~(~0<<n)或pow(2,n-1)

解题思路:

下面程序段的运行结果是(ef)

复制代码
  char str[]= "abc\0def\0ghi", *p = str;
    
  printf("%s", p+5) ;

\0看做一个字符,且遇到\0停止读入

下列程序段的输出结果为7,-13

复制代码
#define F(x)  x - 2
#define D(x)  x * F(x)
printf("%d,%d\n", D(3), D(D(3))) ; /* 中间没有空格 */

分析:

第二问:首先带入内部D(3)得D*D-2

再把D展开

3*3-2*3*3-2-2

即先展开外部函数(展开时把里面看做整体),再展开内部,而不是直接把原式等价于D(7)

写出以下程序的运行结果。

复制代码
#include<stdio.h>
int f(int n)
{    
     static int k = 1;
         
     k++;
     return 2*n + k;
}
int main(void)
{    
     printf("%d\n", f(4));
     printf("%d\n", f(f(4)));
         
     return 0;
}

第1行输出:10

第2行输出:26

分析:求第二行时:先算最里层的函数,外层先不算,k也不加

**3,4题总结:**函数是先算内层函数再算外层函数;宏定义是先展开外层函数(展开时把内层函数看做整体)再展开内层函数

阅读以下程序并回答问题。

复制代码
#include <stdio.h>
#define T(a, b) ((a) != (b)) ? ((a) > (b) ? 1 : -1) : 0

int f1() 
{   
    int x = -10;
        
    return !x == 10 == 0 == 1;
}

void f2(int n) 
{   
    int s = 0;
        
    while(n--){
        s += n;
    }
    printf("%d,%d\n", n, s);  /* 中间没有空格 */
}

double f3(int n)
{   
   if(n == 1) return 1.0;
    else return n * f3(n-1);  
}

int main(void)
{    
     printf("%d,%d,%d\n", T(4, 5), T(10, 10), T(5, 4)); /* 中间没有空格 */
     printf("%d\n", f1());
     f2(4);
     printf("%.1f\n", f3(5));
         
     return 0;
}

(1)程序运行时,第1行输出-1,0,1

(2)程序运行时,第2行输出1

(3)程序运行时,第3行输出-1,6

(4)程序运行时,第4行输出120.0

第三行答案解析:

第一次循环:while(4)成立,n变成3,s加上3

第二次循环:while(3)成立,n变成2,s加上2

第三次循环:while(2)成立,n变成1,s加上1

第四次循环:while(1)成立,n变成0,s加上0

第五次循环:while(0)不成立,但不是直接退出,还要把这个语句执行完,即n--也要完成,n变成-1,退出

输出-1,6

相关推荐
董董灿是个攻城狮7 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
RuoZoe12 小时前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
blasit13 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
AI软著研究员14 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish14 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Ray Liang15 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
颜酱15 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶