【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

相关推荐
彩妙不是菜喵几秒前
算术操作符与类型转换:从基础到精通
c语言
心扬8 分钟前
python网络编程
开发语言·网络·python·tcp/ip
qq_4541757915 分钟前
c++学习-this指针
开发语言·c++·学习
Rose 使者34 分钟前
全球IP归属地查询接口如何用C#进行调用?
c#·api·ip地址
尘浮72841 分钟前
60天python训练计划----day45
开发语言·python
Magnum Lehar1 小时前
vulkan游戏引擎test_manager实现
java·算法·游戏引擎
sss191s1 小时前
校招 java 面试基础题目及解析
java·开发语言·面试
sduwcgg1 小时前
python的numpy的MKL加速
开发语言·python·numpy
水蓝烟雨1 小时前
[面试精选] 0094. 二叉树的中序遍历
算法·面试精选
钢铁男儿1 小时前
Python 接口:从协议到抽象基 类(定义并使用一个抽象基类)
开发语言·python