前言:
欢迎打开这篇博客,从今天开始,每天和大家分享一个C语言小细节,不久之后还会追加C++
一些常常被忽视的小细节和思想统一的编程题目是这个专栏的核心哦
虽然简单但千万别在细节处失分!!!!
每日花一两分钟浏览一下加深一个知识点不香吗
感兴趣的赶紧收藏关注起来吧,不要迷路~
目录
常量的分类:
2.const修饰的常变量,本质是变量但是有常属性,但是在必须要常量的地方他就失效了,比如int arr[] []里面就不可以放入const修饰的常变量
- int main()
- {
- const int a = 10;
- int* p = &a; //报错
- *p = 20;
- printf("%d", a);
- }
这里书写是不正确的为什么呢,正常的常量都可以&啊!
千万注意!常属性不代表变量不可更改
准确的说是变量对应的地址 指向的数据不可更改
对于简单类型的数据(布尔型,数值,字符串),值就是保存在变量指向的地址里,所以等同于常量(不可更改),但是对于更复杂类型的数据(对象,数组),变量指向的地址,只是一个保存实际数据的指针,const只能保证指针是不变的,但是指针指向的数据他就不能保证一定不可修改了
3.#define定义的标识符常量,宏
一定要注意没有分号;
- #define MAX 10 //没有分号;
- int main()
- {
- printf("%d",MAX);
- }
并且宏只能替换不能计算!!!!(重点)
来看这个题

N被定义成常量2
M被定义为N+1——>2+1 千万注意这里不是3!因为不能计算只能替换
NUM被定义为(M+1)*M/2——> (2+1+1)*2+1/2 绝对不是(2+1+1)*(2+1)/2
所以最后结果是8.5但是用%d打印应该是8
4.enum枚举常量
注意符号的运用
- enum Sex
- {
- MALE,
- FEMALE,
- SECRET
- };
- int main()
- {
- enum Sex p = FEMALE;
- printf("p=%d\n", p); //结果是1
- return 0;
- }
默认从第一个元素开始记为0,一次递增
首先来回忆一下二进制的各种规则吧
计算机最擅长计算二进制,是因为很多硬件都是二进制的,就好比人最擅长十进制,因为人有十根手指。
最本质的二进制计算规则都是在补码上进行的,关于原反补的计算简单来说
具体在C不会断句?【前后置,位,移位操作符详解】 b = ++c, c++, ++a, a++_tt142的博客-CSDN博客 这篇我的博客里面

思路很简答,主要就是考察位操作符的熟练使用
统计需要变动几位能把两个数字变成相等,也就是两个数字二进制序列(补码)有几个不一样的位,把个数统计出来就是结果
所以用^ 按位异或,相同为0,相异为1,最后统计1的个数即可
(二进制1的个数在这篇文章里详细讲解过https://blog.csdn.net/weixin_71138261/article/details/126305840?spm=1001.2014.3001.5501)
- int convertInteger(int A, int B){
- int n=A^B;
- int count=0;
- for (int i = 0; i <32; i++)
- {
- if (1& (n>>i))
- count++;
- }
- return count;
- }
如果有所收获的话点个赞吧
创作不易,感谢观看