【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

相关推荐
atunet2 分钟前
关于从哈希冲突看缓存设计的实践与权衡7
算法
zjun10011 小时前
C++:单例模式
c++·单例模式
-银雾鸢尾-5 小时前
C#中的拓展方法
开发语言·c#
guodingdingh7 小时前
软件开发工作问题总结0718
java·开发语言·数据库
GuWenyue9 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
优橙教育9 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
同勉共进10 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋10 小时前
C ++ [ hello world ]
c语言·c++·算法
SeaTunnel11 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影11 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库