操作符习题

简介: 操作符习题

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. }


相关文章
|
5月前
|
C语言
C语言的详解操作符(2)之取余操作符
C语言的详解操作符(2)之取余操作符
|
编译器 C语言 C++
【刷题笔记】Day1:操作符的使用和算术转换(下)
【刷题笔记】Day1:操作符的使用和算术转换(下)
【刷题笔记】Day1:操作符的使用和算术转换(上)
【刷题笔记】Day1:操作符的使用和算术转换(上)
|
4月前
|
编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
44 3
|
4月前
|
C语言
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
27 1
|
4月前
|
存储 编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
35 1
|
5月前
|
存储 编译器
有趣的移位操作符和位操作符(由浅入深轻松搞定!)
有趣的移位操作符和位操作符(由浅入深轻松搞定!)
|
5月前
|
存储
【例题】逆波兰表达式求值(图解+代码)
【例题】逆波兰表达式求值(图解+代码)
128 0
|
编译器 C语言 C++
C语言操作符经典例题
C语言操作符经典例题
|
存储 编译器 C语言
【C语言初阶】操作符之 位运算符详解(“ << ”,“ >> ”,“ & ”,“ | ”,“ ^ ”,“ ~ ”)
目录 C语言中六种位运算符: 一、位移运算符 1、移位运算符简介 2、先要了解一点 3、 << 左移运算符 4、>>右移运算符 5、警告 二、 1、& 按位与 2、| 按位或 3、^ 按位异或
259 0
【C语言初阶】操作符之 位运算符详解(“ << ”,“ >> ”,“ & ”,“ | ”,“ ^ ”,“ ~ ”)