《C与指针》读书笔记
1.操作符
1.1算术操作符
+ - * / %
1.2 移位操作符
<< : 左移位,值最左边的几位被丢弃,右边多出来的几个空位用0补齐。
>> : 右移位有两种方案
(1)逻辑移位
左边移入的位用0填充。
(2)算术移位
左边移入的位由原来的符号位决定,符号位为1则移入的为均为1,符号位为0则移入的符号位均为0。
1.3 位操作符
&:AND操作 两个位都是1,结果为1,否则结果为0。
|: OR操作 两个位都是0,结果为0,否则为1。
^: XOR操作 如果两个位不同,结果为1,两个位相同,结果为0。
1.4 赋值
赋值操作符,用一个“=”表示。
x = y + 3;
赋值操作符的结合性是从右到左。
a = x = y + 3;
相当于:
a = (x = y + 3);
复合赋值符
+= -= *= /= %=
<<= >>= &= ^= |=
a += expression
相当于
a = a + expression
其他情况以此类推。
1.5 单目操作符
! ++ - & sizeof
~ -- + * (类型)
! : 执行逻辑反操作,如果操作数为真,其结果为假。如果操作数为假,其结果为真。这个操作符实际上 产生的一个整形结果:0,1。
~ : 对整形类型的操作数进行求补操作,操作数原先为1的位变成0,原先为0的位变为1。
- : 产生操作数的负值
+ : 产生操作数的值
& : 产生操作数的地址。
* : 间接访问操作符,它与指针一起使用,用于访问指针所指向的值。
sizeof : 判断操作数的类型长度
(类型) :强制类型转换
1.6 关系操作符
用于比较操作数之间的各种关系,产生的结果是整形值:0,1。
> >= < <= != ==
1.7 逻辑操作符
&& ||
&& : expression1 && expression2
如果expression1和expression2的值都是真,那么整个表达式为真,否则为假。
|| : expression1 || expression2
如果expression1和expression2的值有一个为真,那么整个表达式为真,否则为假。
1.8 条件操作符
expression1 ? expression2 : expression3
如果表达式expression1为真,整个表达式的值就是expression2的值,否则就是expression3的值。
1.9 逗号操作符
expression1,expression1,...,expressionN
逗号操作符把两个或两个以上的表达式分隔开来。这些表达式从左到右逐个进行求职,整个表达式的值就是最后那个表达式的值。
while(a = get_value(),count_value(),a > 0){
...
}
1.10 下标引用、函数调用、结构成员
下标引用:下标引用接受两个操作数,一个数组名,一个索引值。除了优先级不同之外,下标引用操作和间接访问表达式是等价的。
array[index] ==> *(array + index)
函数调用:函数操作符接受一个或多个操作数。它的第一个操作数是你希望调用的函数名,剩余的操作数就是传递个函数的操作数。
结构成员:如果s是个结构变量,a是s的成员。用s.a对结构成员进行访问。如果s是指向结构的指针,则使用->操作符对结构成员进行访问。
2 .布尔值
C并没有布尔值,所以使用整数来代替。其规则是:
零是假,任何非零值皆为真。
3. 左值与右值
左值就是那些能够出现在赋值符号左边的东西。右值就是那些可以出现在赋值符号右边的东西。
a = b + 25;
a是个左值,因为它标识了一个可以存储结果的地点,b + 25是个右值,因为它指定了一个值。如果互换:
b + 25 = a;
原先用作左值的a此时也可以当作右值,因为每个位置都包含一个值。然而,b + 25不能作为一个左值,因为它并未标识一个特定的位置。
4 操作符优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | 后置++ | 后置自增运算符 | 变量名++ | 左到右 | |
后置-- | 后置自减运算符 | 变量名-- | |||
[ ] | 数组下标 | 数组名[整型表达式] | |||
( ) | 圆括号 | (表达式)/函数名(形参表) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
前置++ | 前置自增运算符 | ++变量名 | 单目运算符 | ||
前置-- | 前置自减运算符 | --变量名 | 单目运算符 | ||
* | 取值运算符 | *指针表达式 | 单目运算符 | ||
& | 取地址运算符 | &左值表达式 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof 表达式/sizeof(类型) | |||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式%整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 表达式<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 表达式>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 整型表达式&整型表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 整型表达式^整型表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 整型表达式|整型表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量%=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
|= | 按位或后赋值 | 变量|=表达式 | |||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |