要学懂操作符,首先我们要知道什么是操作符。“操作符”是嵌在每一条指令中的,也就是说指令系统的每一条指令都有一个操作符。
首先操作符分为以下10个大类:
算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用,函数调用和结构成员
现在详细介绍每一种操作符:
1.算术操作符
符号: + - * / %
+:分别用于整数和浮点数的加法。
-: 分别用于整数和浮点数的减法
*: 分别用于整数和浮点数的乘法
/: 分别用于整数和浮点数的除法
%:用于两个整数之间相除取余数
符号 + - * / 运算优先级符合数学中的运算优先级。
例:int i = 1 + 2 * 3
结果 i = 7
注意:
1.除了%操作符之外,其他的几个操作符都可以用于整数和浮点数。
2.对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.移位操作符
符号:<< 和 >>
说明:
<< 左移操作符:不论算术移位还是逻辑移位,均将左边的数舍弃,右边空缺位补0(左边丢弃,右边补0)
>> 右移操作符:1.当进行逻辑移位时,最左侧无脑补0
2.当进行算术移位时,右边位丢弃,左边位补原数的符号位(右边丢弃,左边补符号位)。
3.位操作符
符号:& | ^ ~
符号说明:& 按位与(如果两个数字都为1,结果为1,否则位0)
| 按位或(如果两个数字都为0,结果为0,否则为1)
^ 按位异或(如果两个数字相同,结果为0,否则为1)
~按位取反(针对这个数字,0变为1,1变为0)
举例说明:
按位与&
int a = 3
int b = 4
int c = a & b
在32位操作系统中,3的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0011
4的二进制表示为:0000 0000 0000 0000 0000 0000 0000 0100
按照按位与的操作规则,则c就为:0000 0000 0000 0000 0000 0000 0000 0000
按位或|
int a = 3
int b = 4
int c = a | b
在32位操作系统中,3的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0011
4的二进制表示为:0000 0000 0000 0000 0000 0000 0000 0100
按照按位与的操作规则,则c就为:0000 0000 0000 0000 0000 0000 0000 0111
按位异或^
int a = 3
int b = 4
int c = a ^ b
在32位操作系统中,3的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0011
4的二进制表示为:0000 0000 0000 0000 0000 0000 0000 0100
按照按位与的操作规则,则c就为: 0000 0000 0000 0000 0000 0000 0000 0111
按位取反~
int a = 3
int c = ~a
在32位操作系统中,3的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0011
按照按位与的操作规则,则c就为: 1111 1111 1111 1111 1111 1111 1111 1100
4.赋值操作符
符号:= += -= *= /= %= >>= <<= &= |= ^=
符号说明:
= 为简单赋值操作
+= -= *= /= %= >>= <<= &= |= ^= 为复合赋值操作
例如:
//简单赋值操作
int i = 20;
i = i + 23
double j = 3.0;
j = 3.5;
//连续赋值操作
int i = 2;
int j = 3;
int k = 4;
k = j = i + 5;//先将i + 5 赋值给j,再将j赋值给k
+= -= *= /= %= >>= <<= &= |= ^=复合赋值操作
//复合复制操作
int i = 20;
i = i + 23 与 i += 23 完全等效
int j = 2;
j = j - 2 与 j -= 2 完全等效
5.单目操作符
符号: ! - + & sizeof ~ - - ++ * (类型)
符号说明:
! 为逻辑反操作
- 为负值
+ 为正值
& 为取地址
sizeof 为操作数的类型长度(单位:字节)
~ 为对一个数的二进制按位取反
-- 为前置、后置--
++ 为前置、后置++
* 为解引用操作符
(类型) 为强制类型转换
6.关系操作符
符号:· > < >= <= != ==
符号说明:
> 为大于
< 为小于
>= 为大于等于
<= 为小于等于
!= 为不等于
7.逻辑操作符
符号: && ||
符号说明:
&& 为逻辑与操作(只要有一个表达式为假便为假,不再执行后面的表达式)
|| 为逻辑或操作(只要有一个表达式为真便为真,不再执行后面的表达式)
举例说明:
1 && 2 = 1; //逻辑与,只要有一个为假便为假
1 & 2 = 0; //按位与(二进制位)
1 || 2 = 1; //逻辑或,只要有一个为真便为真
1 | 2 = 3; //按位或(二进制位)
8.条件操作符
符号:exp1 ? exp2 : exp3
符号说明:
exp1 ? exp2 : exp3 为目表达式,若表达式1(exp1)为真则返回表达式2(exp2),否则返回表达式3(exp3)
例:
int i = 5, j = 7;
i > j ? i : j;
//如果i > j为真, 就返回 i 的值,如果i > j为假,就返回 j 的值。
9.逗号表达式
符号:exp1, exp2, exp3, …, expN
符号说明:
exp1, exp2, exp3, …, expN 为逗号表达式(用逗号隔开的表达式),从左往右依次执行。整个表达式的结果为最后一个表达式的结果。
例:
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
//c就为最后一个表达式的结果,也就是b = a + 1的结果就是2
10.下标引用、函数调用和结构成员
下标引用
符号:[ ]
符号说明:
[ ] 为下标引用操作符,有两个操作数(数组名和索引值)
例:
int arr[10];
arr[9] = 10;
[]的两个操作数是arr和9.
函数调用
符号:()
符号说明:
() 函数调用操作符 接受一个或者多个操作数:第一个操作数是函数名,生育的操作数就是传递给函数的参数。
#include <stdio.h>
void test1(){
printf("hehe\n");
}
void test2(const char* str){
printf("%s\n", str);
}
int main(){
test1();
test2("hello bit.");
return 0;
}
结构成员
符号: . ->
符号说明:
. 为结构体对象.成员名
-> 为结构体指针->成员名
例:
#include <stdio.h>
struct Stu{
char name[10];
int age;
char sex[5];
double score;
};
void set_age1(struct Stu stu){
stu.age = 18;
}
void set_age2(struct Stu* pStu){
pStu -> age = 18;
}
int main(){
struct Stu stu;
struct Stu* pStu = &stu;
stu.age = 20;
set_age1(stu);
pStu -> age = 20;
set_age2(pStu);
return 0;
}