介绍:首先明确基础知识
b=a++ 把a赋给b 然后a+1
c=--a 先a-1 然后把结果赋给a和c
逗号表达式的优先级较低,从左往右算
整数的原反补相同
内存中存储的都是二进制的补码,单位是比特,一个int整型也就是4字节,32比特位
直接按照数字写的 打印的 都是原码
& 按位与(二进制位
| 按位或
^按位异或
目录
1.断句
int main()
{
int a, b, c;
a = 5;
c = ++a;
b = ++c, c++, ++a, a++;
b += a++ + c;
printf("a = %d b = %d c = %d\n:", a, b, c);
return 0;
}
这个代码的结果是多少呢?
在明确介绍里的知识之后我们知道
c=++a
这里计算之后c=a=a+1=6
b = ++c, c++, ++a, a++;
这个则需要我们清楚,他其实是b=++c (c++, ++a, a++);
首先算b=++c b=c=6+1=7
(c++, ++a, a++) 的计算顺序是 c=c+1=8 , a=a+1=7 , a=a+1=8
此时a=8 b=7 c=8
b += a++ + c 其实是b=b+ a +c (因为a++是先把a赋给这里a++对应的地方,然后在整个式子算完之后再把a自身+1)
也就是b=7+ 8+8=23
然后a=a+1=9
c还是=8
除此之外还看到了网上一个很有意思的式子
x=++a+b+++c++
到底改怎么断句呢
答案是x=(++a)+(b++)+(c++)
这个的突破口在于最后的++一定是和c配合,从后往前分析
2.移位操作符
>>右移操作符
<<左移。。。
看箭头指向哪里就应该是向哪个方向移动
a<<1 a向左移动1(一个比特位)
移位移的是二进制位,内存中整数的存储都是补码
所以移动的时候也是写出补码再移动(因为如果只是原码移动那较小的负数左移1岂不是变成正数)
补码移动结束之后应该变成原码,因为打印的都是原码
原反补规则:
原码 —— 符号位不变其他位按位取反 ——>反码——+1——>补码
补码 ——-1——>反码——符号位不变其他位按位取反 ——>原码
补码变成原码还用更好用的方法
和原码——>补码的过程完全一样!!!
补码———符号位不变其他位按位取反——>反码——+1——>原码
其实仔细思考符号位不变的原因也是为了防止造成符号的丢失
<<补码左移之后 左边丢弃 右边补充0
>>
分为两种
1.算数右移 补码右移之后左边补充符号位
2.逻辑右移 补充0
一般来说编译器采用的都是1
3.位操作符
0为假 非零为真
& 其实和数学上“且”的逻辑相同:全真才真,有假则假
| 等价“或” 有真则真,全假才假
^ 相同为0,相异为1
以上的相同或相异都是在补码上操作的
写给和我一样的普通人:
自己接触C一个月,整体的感觉就是很艰难,也许非班科的生活就是这么忙碌,也许入门的过程就是这样困难,也许普通人的认知上限就摆在那里,
但是通过我的经验,其实自己有多逻辑清晰,代码就有多“聪明”,刷题的时候试着先在纸上写出思路再去实践,多去回顾经典题型,手感和眼界很重要
不要计较自己的能力没有别人强,只是一个开始谁会学的更扎实也未可知
最后引用一个我很喜欢的作者——史铁生的一句话(鲁迅太经典大家都听腻了哈哈)
“大多数时候的放弃,是你败给了自己,而不是命运。” ——《我与地坛》,史铁生
创作不易,感谢观看