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