操作符 分类:
算术操作符
移位操作符
位操作符
赋值操作符
复合赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号操作符
下标引用、函数调用和结构成员
算术操作符
- 加、减、乘很简单,和平常数学中运算规则相同。
- /(除)这个操作符需要注意的是:除的时候如果’/’两边只要有(一个或两个)浮点数,采用的是浮点型除法,若’/’两边都是整型,则采用的是整型除法。
- %这个操作符两边的数只能是整数,它返回的是整除之后的余数
移位操作符
- 移位操作符作用的对象是一个数的补码;
- 对于左移:左边抛弃,右边补0;
- 对于右移:右边抛弃,左边补原来的符号位(采用算术移位);
- 对于’>>’操作符,分为两种移位规则:一种逻辑移位,另一种是算术移位,
a.逻辑移位规则是右边抛弃,左边最高位直接补0,不考虑之前数的符号位。
b.算术移位规则是右边抛弃,左边最高位补和之前数相同的符号位。而目前编译器通常采用的是算术移位规则。 - 但这里需要注意,对一个数移位操作完成后,当前的数不会改变的,除非把它赋值给另外一个变量。
- 对于移位操作符,不要移动负数位,这个是标准未定义的。
int main()
{
int p=0,q=0,n=2;
p=n<<1;
printf("%d",p);
q=n>>1;
printf("%d",q);
}
此时输出的结果为:p=4,q=1;左移操作相当于给之前的数乘2,右移操作相当于给之前的数除2;
这里有一个思考题:求一个整数存储在内存中的二进制中1的个数。
位操作符
1.同样这里位操作符作用的对象也是一个数的补码,并且它们的操作数必须是整数。
2.对于’&’,两个数补码对应位置的值都为1,结果为1,否则为0;对于’|’,两个数补码对应位置都是0,结果是0,否则为1;
问题:不能创建临时变量(第三个变量),实现两个数的交换
赋值操作符
这里需要注意的是为了代码方便理解和调试,赋值时不要连续赋值。
复合赋值符
操作符 | 功能 |
---|
+= | 相加之后赋值 |
-= | 相减之后赋值 |
*= | 相乘之后赋值 |
/= | 相除之后赋值 |
%= | 取余之后赋值 |
>>= | 右移之后赋值 |
<<= | 左移之后赋值 |
= | 按位或之后赋值 |
^= | 按位与之后赋值 |
用复合操作符可以使代码更简洁。
单目操作符
操作符 | 功能 |
---|
! | 逻辑反操作 |
+ | 正值 |
- | 负值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位整体取反 |
– | 前置、后置– |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
1. sizeof操作符计算的是变量(类型)所占空间的大小,是按字节来计算,重要的是,sizeof (a+b)里面的表达式不参与计算,若a,b都是int行类型,其结果依然是4;
2. 当数组作为参数为函数传参时,由于数组要发生降级,其会降级为一个指针,如果此时在一个函数中sizeof计算数组的大小是不可以的,其计算的是数组降级为指针的大小(4个字节),所以,若函数要得到一个数组的大小,应该在主函数中计算。
3. 对于前置++或 - -,先操作,再使用,对于后置++或 - -,先使用,再操作。
关系操作符
操作符 | 功能 |
---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不等于 |
== | 等于 |
这些关系操作符,比较简单,不多说,但需要注意,不要将等于(==)写成赋值操作(=)。
逻辑操作符
不同与按位与和按位或。
条件操作符
操作符 | 功能 |
---|
exp1?exp2:exp3 | exp1为真,结果为exp2,否则结果是exp3 |
逗号操作符
操作符 | 功能 |
---|
exp1,exp2,…expN | 从左往右依次执行,整个表达式结果是最后一个表达式的结果 |
int main()
{
int a = 1; int b = 2;
int c = (a>b, a=b+10, a, b=a+1);
printf("%d",c);
return 0;
} //结果是13
下边引用、函数调用和结构成员
操作符 | 功能 |
---|
[ ] | 数组下标操作符,操作数:数组名+一个索引值 |
( ) | 函数调用操作符,接受一个或多个操作数:第一个是函数名,其余是函数参数 |
. | 访问结构体成员 |
-> | 访问结构体成员 |