操作符包括算数操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用,函数调用和结构成员。
1.算数操作符:
+ - * / %
(1)除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
(2)对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
(3)%操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.移位操作符:
<< 左移操作符 >> 右移操作符
(1)左移操作符操作时:左边抛弃,右边补0。
(2)右移操作符操作运算分为俩种:
逻辑右移:左边用0填充,右边丢弃。
算数右移:左边用原该值的符号位填充,右边丢弃。
注意:
(1)对于移位操作符,不要移动负数位,这个是标准未定义的。
(2)我们一般使用算数右移。
3位操作符
& 按位与 | 按位或 ^ 按位异或
#include<stdio.h>
int main()
{
int num1 = 1;//00000000000000000000000000000001
int num2 = 2;//00000000000000000000000000000010
num1 & num2; //00000000000000000000000000000000 有0为0
num1 | num2; //00000000000000000000000000000011 有1为1
num1 ^ num2; //00000000000000000000000000000011 相同为0,相异为1
return 0;
}
4.赋值操作符:
= += -= *= /= %= >>= <<= &= |= ^=
这些运算符都可以写成复合的效果。比如:
int i = 0;
i = i + 5;
i += 5;//复合赋值
5.单目操作符:
! 逻辑反操作、 - 负值、 + 正值、 & 取地址、 sizeof 操作数的类型长度,以字节为单位、
~ 对一个数的二进制按位取反、 -- 前置、后置--、 ++ 前置、后置++、
* 间接访问操作符,解引用操作符、 (类型) 强制类型转换 .
(1)!是操作符对它的操作数执行逻辑反操作,结果为真则输出假,结果为假输出为真,真为1,假为0。
(2)- 与 +就像一个数学符号一样产生正值和负值。
(3)& 取地址,取一个操作数的地址,&数组名取的是整个数组的地址。
(4)sizeof求变量时,可省括号:sizeof a //求a变量的类型长度。以字节为单位。 求类型长度时,不能省略括号: sizeof(int)
(5)~ 对一个数的二进制按位取反(包括符号位)
(6)前置 ++ 先加后用 ,前置 -- 先减后用
int i = 0;
int j = ++i;
printf("%d %d", j, i);//j = 1; i = 1;
(7)后置 ++ 先用后加,后置 -- 先用后减
int i = 0;
int j = i++;
printf("%d %d", j, i);//j = 0; i = 1;
(8)* 间接访问操作符,与指针一起使用,用于访问指针所指向的值。
int a = 10;
int *p = &a;//此处 * 表示为整型指针 ,把现有变量的地址赋值给一个指针变量
*p = 20;// * 为指针运算符 ,*p的值改变,同样a的值也改变
printf("%d", a);//20
(9)(类型)强制类型转换,把表达式的值转换为另外比较大的类型的时候,需要强制类型转换。
6.关系操作符
> >= < <= != 不想等 == 相等
7.逻辑操作符
&& 逻辑与 || 逻辑或
(1)区分逻辑与和按位与,逻辑或和按位或
1 & 2 ----------> 0 二进制运算后值为0
1 &&2 -----------> 1
1 | 2 -------------> 3
1 || 2 ------------->1
(2)工作原理: &&操作符的左操作数总是首先进行求值, 如果它的值为真,然后就紧接着对右操作数进行求值。如果左操作数
的值为假,那么右操作数便不再进行求值,因为整个表达式的值肯定是假的,右操作数的值已无关紧要。|操作符也具有相同的特
点,它首先对左操作数进行求值,如果它的值是真,右操作数便不再求值, 因为整个表达式的值此时已经确定。这个行为常常
被称为“短路求值”。
#include<stdlib.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i = a++ || ++b || d++ a = 1, b = 3, c = 3, d = 4
printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);//a = 1, b = 2, c = 3, d = 4
system("pause");
return 0;
}
8.条件操作度
exp1 ? exp2 : exp3
(1)首先计算的是exp1, 如果它的值为真(非零值),那么整个表达式的值就是exp2的值, exp3不会进行求值。但是,如果exp1
的值是假(零值), 那么整个条件语句的值就是expression3的值,exp2 不会进行求值。
9.逗号表达式
exp1 , exp2 , exp3,....... expN
(1) 逗号操作符将两个或多个表达式分隔开来。这些表达式自左向右逐个进行求值,整个逗号表达式的值就是最后那个表达式的
值,意思就是最后这个表达式起判断作用。
10.下标引用,函数调用和结构成员
(1)[ ]下标引用操作符
操作数:一个数组名 + 一个索引值
(2)()函数调用操作符
接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传给函数的参数
(3). 结构体、成员名 -> 结构体指针->成员名
. 和 -> 操作符用于访问一个结构的成员。如果s是一个结构变量,那么s.a就访问s中叫a的成员。当你拥有一个指向结构的指针而不是结构本身,且欲访问它的成员时,就需要->操作符,这样性能会高一些。
C语言操作符拥有品种繁多的操作符,它的这个特点使它很难精通。但另一方面,C的操作符具有其他语言的操作符无可抗衡的价值。