操作符习题

简介: 操作符习题

1 知识点

(1)b = ++c, c++, ++a, a++ // 逗号表达式的优先级最低,这里先算b=++c, b得到的是++c后的结果,b=++c 和后边的构成逗号表达式,依次从左向右计算的。

(2)全局变量 没有初始化的时候 会默认初始化为0。

(3)关于表达式求值,注意 要考虑 隐式类型转换、算数转换、操作符的优先级 结合性 求值顺序

2 输入一个整数 n ,输出该数32位二进制表示中1的个数。

其中负数用补码表示。要求:写一个函数返回参数二进制中 1 的个数。

代码1展示:(注意:这里是放在内存中补码的二进制中1的个数)

1. #include <stdio.h>
2. int count_number_of_1(unsigned int n)
3. {
4.  int count = 0;
5.  while (n)
6.  {
7.    if (n % 2 == 1)
8.    {
9.      count++;
10.       n = n / 2;
11.     }
12.   }
13.   return count;
14. }
15. int main()
16. {
17.   int a =-1;
18.   int ret = count_number_of_1(a);
19.   printf("%d", ret);
20.   return 0;
21. }

注意:函数里写的是unsigned int (无符号整型int)

代码解析:

7的二进制序列是00000000000000000000000000000111,当7%2=1,这个1就是二进制最后一位,7/2=3,这个3是7的二进制序列向右移动一位显示的数字,00000000000000000000000000000011。(这个思路,当一个十进制数字,要想知道每一位数字,我们一般都是先%10,再除以10 依此循环)

代码2展示:

1. #include <stdio.h>
2. int count_number_of_1(int n)
3. {
4.  int count = 0;
5.  int i = 0;
6.  for (i = 0; i < 32; i++)
7.  {
8.    if ((n & 1) == 1)
9.    {
10.       count++;
11.     }
12.     n = n >> 1;
13.   }
14.   return count;
15. }
16. 
17. int main()
18. {
19.   int a = -1;
20.   int ret = count_number_of_1(a);
21.   printf("%d", ret);
22.   return 0;
23. }

代码3展示:

1. #include <stdio.h>
2. int count_number_of_1(int n)
3. {
4.  int count = 0;
5.  while (n)
6.  {
7.    n = n & (n - 1);
8.    count++;
9.  }
10.   return count;
11. }
12. 
13. int main()
14. {
15.   int a = -1;
16.   int ret = count_number_of_1(a);
17.   printf("%d", ret);
18.   return 0;
19. }

代码理解:

m&(m-1)会把二进制序列从右面依次去掉一个1  ( 0111&0110=0110  0110&0101=0100)

(执行一次去掉一个1,执行多少次,就有多少个1)

(这个是最佳答案,有几个1,就循环几次.)

3 求两个数二进制中不同位的个数

两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同

代码1展示:

1. #include <stdio.h>
2. int count_diff_bit(int m, int n)
3. {
4.  int count = 0;
5.  int i = 0;
6.  for (i = 0; i < 32; i++)
7.  {
8.    if ((m & 1) != (n & 1))
9.    {
10.       count++;
11.     }
12.     m >>= 1;
13.     n >>= 1;
14.   }
15.   return count;
16. }
17. 
18. int main()
19. {
20.   int a = -1;
21.   int b = 1;
22.   int ret = count_diff_bit(a, b);
23.   printf("%d", ret);
24.   return 0;
25. }

代码2展示:

1. #include <stdio.h>
2. int count_diff_bit(int m, int n)
3. {
4.  int count = 0;
5.  int i = m ^ n;
6.  while (i)
7.  {
8.    i = i & (i - 1);
9.    count++;
10.   }
11.   return count;
12. }
13. 
14. int main()
15. {
16.   int a = -1;
17.   int b = 1;
18.   int ret = count_diff_bit(a, b);
19.   printf("%d", ret);
20.   return 0;
21. }

异或 相同为0,不同为1.,结果又回到了求一个二进制数列1的个数。

4 打印整数二进制的奇数位和偶数位

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

1. #include <stdio.h>
2. void print(int m)
3. {
4.  int i = 0;
5.  for (i = 30; i >= 0; i -= 2)
6.  {
7.    printf("%d ", (m >> i) & 1);
8.  }
9. 
10.   printf("\n");
11.   for (i = 31; i >= 1; i -= 2)
12.   {
13.     printf("%d ", (m >> i) & 1);
14.   }
15. }
16. 
17. int main()
18. {
19.   int a = 5;
20.   scanf("%d", &a);
21.   print(a);
22.   return 0;
23. }

5 下面的代码结果是

#include <stdio.h>

int i;

int main()

{

   i--;

   if (i > sizeof(i))

   {

       printf(">\n");

   }

   else

   {

       printf("<\n");

   }

   return 0;

}

A.>         B.<       C.不输出        D.程序有问题

解析:

C语言中,0为假,非0即为真。全局变量,没有给初始值时,编译其会默认将其初始化为0。

i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A

sizeof 操作数 计算的结果类型是size_t 无符号整型unsigned int   在这道题中 int >unsigned int 首先应该把 int类型(进行隐式类型转换中的算数转换) 转换成 unsigned int 类型才可以 当-1 被认为是无符号整型的时候(-1的补码是32个1),原码 反码 补码都应该相同,那么-1的无符号整型显然很大,大于4,所以应该选A

6 判断整数奇偶性 (多组输入的场景)

从键盘任意输入一个整数(范围-231~231-1),编程判断它的奇偶性。      输入描述:多组输入,每行输入包括一个整数。   输出描述:针对每行输入,输出该数是奇数(Odd)还是偶(Even)。

代码展示:

1. #include <stdio.h>
2. int main()
3. {
4.  int a = 0;
5.  while ((scanf("%d", &a)) != EOF)
6.  {
7.    if (a % 2 == 0)
8.    {
9.      printf("Even\n");
10.     }
11.     else
12.     {
13.       printf("Odd\n");
14.     }
15.   }
16.   return 0;
17. }

scanf读取失败,就会返回EOF

7 判断是元音还是辅音(多组输入场景)

输入描述:

多组输入,每行输入一个字母。

输出描述:

针对每组输入,输出为一行,如果输入字母是元音(包括大小写),输出“Vowel”,如果输入字母是非元音,输出“Consonant”。

1. #include <stdio.h>
2. int main()
3. {
4.  char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
5.  char ch = 0;
6.  while ((scanf("%c", &ch) != EOF))
7.  {
8.    int i = 0;
9.    for (i = 0; i < 10; i++)
10.     {
11.       if (ch == arr[i])
12.       {
13.         printf("Vowel\n");
14.         break;
15.       }
16.     }
17.     if (i == 10)
18.     {
19.       printf("Consonant\n");
20.     }
21.     getchar();
22.   }
23. }

注意:

在键盘上获取ch类型的时候,会把\n也输入到,所以要用getchar()清理缓冲区

代码2展示:

1. #include <stdio.h>
2. int main()
3. {
4.  char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
5.  char ch = 0;
6.  while ((scanf("%c\n", &ch) != EOF))
7.  {
8.    int i = 0;
9.    for (i = 0; i < 10; i++)
10.     {
11.       if (ch == arr[i])
12.       {
13.         printf("Vowel\n");
14.         break;
15.       }
16.     }
17.     if (i == 10)
18.     {
19.       printf("Consonant\n");
20.     }
21.   }
22. }

代码3展示:

1. #include <stdio.h>
2. int main()
3. {
4.  char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
5.  char ch = 0;
6.  while ((scanf(" %c", &ch) != EOF))
7.  {
8.    int i = 0;
9.    for (i = 0; i < 10; i++)
10.     {
11.       if (ch == arr[i])
12.       {
13.         printf("Vowel\n");
14.         break;
15.       }
16.     }
17.     if (i == 10)
18.     {
19.       printf("Consonant\n");
20.     }
21.   }
22. }


相关文章
|
文字识别 安全 JavaScript
6款超实用的Edge浏览器插件,让你的浏览器瞬间开挂!
Microsoft Edge是由微软开发的一款网页浏览器,致力于提供一个现代化、高效率、安全可靠的网络浏览器,以满足用户对于网络浏览的各种需求。
744 1
|
编译器 C语言
C语言中整数如何自动转换为浮点数
C语言中整数如何自动转换为浮点数
801 0
|
8月前
|
机器学习/深度学习 人工智能 负载均衡
《人工智能驾驭复杂网络拓扑:网络规模扩张下的管理之道》
在数字化时代,网络规模持续扩大,拓扑结构日益复杂,传统管理方式难以应对。人工智能凭借强大数据处理与决策能力,成为解决这一难题的关键技术。它通过智能拓扑发现、动态路由优化、故障预测诊断及资源智能分配等策略,有效提升网络性能与可靠性。例如,谷歌B4网络和阿里巴巴电商网络成功应用AI技术,实现了高效资源利用与快速故障修复。未来,结合区块链与量子计算等新兴技术,人工智能将推动网络拓扑管理迈向更智能、安全与高效的阶段,助力构建可靠的数字世界。
228 5
|
11月前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。
486 38
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
|
10月前
|
JSON API 数据安全/隐私保护
淘宝商品评价 API 的获取与应用
淘宝商品评价API是电商数据分析的重要工具,帮助商家和开发者获取淘宝平台上的商品评价信息。通过注册淘宝开放平台账号、申请AppKey和AppSecret、获取API权限等步骤,用户可以调用该API进行市场分析、竞品研究及店铺运营优化。API支持HTTP GET/POST请求,返回JSON或XML格式的评价数据,包括评价内容、时间、评分等。本文详细介绍API的使用方法,并提供Python代码示例,助力用户更好地利用这一资源。注意遵守请求频率限制、数据隐私保护等相关规定,确保合法合规使用数据。
349 3
|
11月前
|
机器学习/深度学习 人工智能 编译器
【AI系统】AI 芯片的思考
为了应对数据中心算力需求,谷歌自2014年起研发TPU,专为深度学习设计的硬件加速器。TPU加速了谷歌的机器学习任务,尤其在大模型训练和推理方面表现突出。大卫·帕特森教授加入谷歌TPU团队后,分享了TPU发展历程及技术心得,强调了AI模型对内存和算力需求的快速增长、模型结构的快速演变、生产部署中的多租户需求、SRAM与DRAM的权衡、内存优化的重要性、DSA的专业与灵活性、半导体供应链选型、编译器优化及AI应用兼容性等方面的关键挑战与解决方案。
201 2
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
301 0
|
数据采集 存储 前端开发
豆瓣评分9.0!Python3网络爬虫开发实战,堪称教学典范!
今天我们所处的时代是信息化时代,是数据驱动的人工智能时代。在人工智能、物联网时代,万物互联和物理世界的全面数字化使得人工智能可以基于这些数据产生优质的决策,从而对人类的生产生活产生巨大价值。 在这个以数据驱动为特征的时代,数据是最基础的。数据既可以通过研发产品获得,也可以通过爬虫采集公开数据获得,因此爬虫技术在这个快速发展的时代就显得尤为重要,高端爬虫人才的收人也在逐年提高。
|
机器学习/深度学习 人工智能 安全
智能之网:探索人工智能在现代通信系统中的应用与挑战
【8月更文挑战第4天】 随着人工智能技术的快速发展,其在通信领域的应用也日益广泛。从信号处理到网络优化,人工智能正在重塑通信行业的未来。本文将深入探讨人工智能如何革新现代通信系统,包括提高数据传输效率、增强网络安全、优化资源分配等方面,并分析面临的主要挑战及未来的发展方向。
757 3