一.算术操作符
+ - * / %
除了 % 操作符,其余几个都是既适用于浮点型又适应整形。
当 / 操作符的两边都为整型时,执行整除运算;其余情况为浮点数除法。
二.赋值
1.单=赋值
x = y + 1 ;
2.连续赋值
a = b= c = 1;
相当于 c = 1;b = c; a = b;
c语言语法支持连续赋值,但这样会使代码可读性变差;
3.复合赋值符
+= -= *= /= %=
<<= >>= &= ^= |=
以+=为例,其他操作符的用法类似:
a += 1;
即 a = a + 1;
使用复合赋值符的优点:使源代码更容易阅读和书写。
三.关系操作符
> >= < <= != ==
通常用于 if 或 while 语句中,作为测值表达式。
工作方式:表达式的结果若为非0值,则为真;
操作符两端的操作符合他们的指定关系,则为真。
四.逻辑操作符
1. &&(逻辑与)
expression1 && expression2
工作方式:expression1和expression2都为真,表达式为真;
有任一者为假,则表达式为假。
短路求值:先求值坐操作,若为真,接着对右操作求值;若为假,便不再对右操作求值。
(表达式为假,已无必要,)
2.||(逻辑或)
expression1 || expression2
工作方式: expression1和expression2都为假,表达式为假;
有一者为真,则表达式为真。
短路求值:先求值左操作,若为假,接着对右操作求值;若为真,便不再对右操作求值。
(表达式为真,已无必要,)
五.条件操作符(三目运算符)
expression1 ? expression2 : expression3
结合性 : 自右向左
首先计算expression,若为真,那么整个表达式的值为expression2的值, expression3不会进行求值;
同理,若为假,那么整个表达式的值为expression3的值, expression2不会进行求值。
六.逗号操作符
expression1 , expression2 ,... , expressionN
将表达式自左向右逐个求值,整个逗号表达式的值即为最后那个表达式的值。
优点:使源程序更易于维护。
七.单目操作符
只接受一操作数的操作符
!
对执行操作数进行逻辑反操作
++ –
有前缀和后缀两种形态之分 a++
--b
在操作数之前的操作符在变量值被使用之前增加它的值;
在操作数之后的操作符在变量值被使用之后才增加它的值。
- +
产生操作数的负/正值
&
产生它的操作数的地址。
例如:scanf("%d",&a);
~
按位取反—取内存里的补码
对整型关系的操作数进行求补操作,操作数中所有的原先为1的变为0,0变1。
*
间接访问操作符,与指针一起使用,用于访问指针所指向的值。
例如:
int a, *b;
b = &a;
表达式b的值为变量a的地址,&b为变量a的值。
sizeof
以字节为长度,操作数的类型长度
例如:sizeof(int)
返回整型变量的字节数,结果取决于环境。
(类型)
强制类型转换,用于显式地把表达式的值转换成另外的类型。
例如: (float)a
八.移位操作符
<<(左移)
在左移位中,值最左边的几位数被丢弃,右边多出的几个空位由0补齐。
b = a<<1;
向左移动一位,移动的是a的二进制位,a本身无变化。
>>(右移)
右移操作符有以下两种方案:
1.逻辑右移
左边补0,右边丢弃。
2.算数右移
左边移入的位由原先该值的符号位决定,符号位1则移入1,为0则移入0。
3.选择与联系
算术左移与逻辑左移是相同的,它们只有在右移时不相同,而且条件为操作数为负值。
标准说明无符号值执行的所有移位操作都是逻辑移位,
但对于有符号值,采用哪种取决于编译器。
∴ 有符号数的右移操作符是不可移植的。
4.另类操作之a << 负数
这种移位是未定义的,产生效果不可预测。
九.位操作符
& (按位与)
如果两个位都是1,结果为1,否则为0。
|(按位或)
如果两个位都是0,结果为0,否则为1。
^ (按位抑或)
个位相同为0,不同为1。
十.指向结构体成员运算符
->
拥有一个指向结构的指针,要访问它的成员时使用。
.
直接调用结构体中的某个成员
如果一个函数的传入参数是结构体,且需要该结构体作为返回值的时候,必须采用指针传递的方式,其中对结构体赋值必须使用箭头运算符。
十一.下标引用操作符
[下标 ]
下标引用操作和简介访问表达式是等价的,以下是它们的映像关系:
*(arr + i) 即 arr[i]即 i[arr]
∴ &arr[i] 即arr+i