运算符表
运算符(优先级从高至低) | 结合律 |
---|---|
i++后缀 i–后缀 fun()函数调用 ary[1]数组 {语句}块 (复合字面量) . -> | 从左往右 |
++i前缀–i前缀 - + ~ ! *(解引用) &取址 sizeof _Alignof(类型名) (本栏都是一元运算符) | 从右往左 |
(类型名) | 从右往左 |
*乘/除%取余数 | 从左往右 |
+加-减 (都是二元运算符) | 从左往右 |
<<左移 >>右移 | 从左往右 |
<小于>大于<=小于等于>=大于等于 | 从左往右 |
== 相等 !=不相等 | 从左往右 |
& | 从左往右 |
^ | 从左往右 |
I | 从左往右 |
&& | 从左往右 |
II | 从左往右 |
?:三元运算 | 从右往左 |
= 等于 *= 乘等于 /=除等于+=加等于-=减等于<<=左移等于 >>==右移等于 &= I= ^= | 从右往左 |
,逗号运算符 | 从左往右 |
运算符分析
算术运算符
$+$
把右边的值加到左边的值上$+$
作为一元运算符,生成一个大小和符号都与右边值相同的值$-$
从左边的值中减去右边的值$-$
作为一元运算符,生成一个与右边值大小相等符号相反的值$*$
把左边的值乘以右边的值$/$
把左边的值除以右边的值;如果两个运算对象是整数,其结果要被截断- % 得左边值除以右边值的余数
$++$
把右边变量的值加1(前缀模式),把左边的值加1(后缀模式)$--$
把右边变量的值减1(前缀模式),把左边的值减1(后缀模式)
关系运算符
每个运算符都把左边的值与右边的值相比较
$<$
小于$<=$
小于或等于$>$
大于$>=$
大于或等于$==$
相等$!=$
不相等
关系表达式
关系包大师由关系运算符及其两侧的运算对象组成。关系为真,表达式值==1;关系为假,表达式值==0.
例:
5>2 关系为真,表达式值是1;
(2+a)==a 关系为假,表达式值是0;
赋值运算符
基本赋值运算符
- = 把它右边的值赋值给左边的左值
复合赋值运算符
每个赋值运算符都根据他右边的值更新其左边的左值,R—H右边,L—R左边
$+=$
把到左边量加右边的量,并把结果存储在左边的变量中$-=$
从到左边量减右边的量,并把结果存储在左边的变量中$*=$
把到左边量乘以右边的量,并把结果存储在左边的变量中$/=$
把到左边量除以右边的量,并把结果存储在左边的变量中- %= 得到左边量除以右边量的余数,并把结果存储在左边的变量中
- &= 把L—R & R—H的值赋值给左边的量,并把结果存储在左边的变量中。
$|=$
把L—R | R—H的值赋值给左边的量,并把结果存储在左边的变量中。$^=$
把L—R ^ R—H的值赋值给左边的量,并把结果存储在左边的变量中。$>>=$
把L—R >> R—H的值赋值给左边的量,并把结果存储在左边的变量中。$<<=$
把L—R << R—H的值赋值给左边的量,并把结果存储在左边的变量中。- 例:rabbits *=1.6;rabbits=rabbits *1.6;效果相同
逻辑运算符
逻辑运算符通常以关系表达式作为运算对象,!运算符只需要一个运算对象,其他需要两个运算对象
- && 与
- 真&&真==真
- 真&&假==假
- 假&&真==假
- 假&&假==假
- 当且仅当两个表达式都为真时,整个表达式的值才为真。
- || 或
- 真||真==真
- 真||假==真
- 假||真==真
- 假||假==假
- 两个表达式中至少有一个为真时,整个表达式的值才为真。
- ! 非
- 如果expresson 的值为假,则!expresson 的值为真。
- 如果expresson 的值为真,则!expresson 的值为假。
逻辑表达式
逻辑表达式的求值顺序
逻辑表达式的求值顺序是从左到右,当发现可以使整个表达式为假的条件时立刻停止求值。
例:
- 6>2&&3==3 真
- !(6>2&&3==3) 假
- X!= 0&& 20/X<5 只有在X是非零时才会对第二个表达式求值
,三目运算、条件运算符
表达式1?表达式2:表达式3
- 表达式1为真,执行表达式2,整个表达式结果==表达式2
- 表达式1为假,执行表达式3,整个表达式结果==表达式3
- 例:求大小
- max=a>b?a:b;
- max=(a>b?a:b)>c?(a>b?a:b):c;
与指针有关的运算符
- &是地址运算符,当它后面是一个变量时,&给出该变量的地址。
$*$
是间接或解引用运算符,当它后面是一个指针时。$*$
给出存储在指针指向地址中的值- 例:
&nurse是变量nurse的地址。
nurse=22;
ptr=&nurse;//ptr指针指向nurse地址
val=*ptr;//给出存储在ptr指针指向地址中的值赋值给val
符号运算符
$-$
负号,反转运算对象的符号$+$
正号,不改变运算对象的符号
结构和联合运算符
结构和联合使用一些运算符标识成员
成员运算符
- 成员运算符
$.$
与结构和联合一起使用,指定结构或联合中的一个成员。
struct
{
int code;
float cost;
}item;
item.code=1265;
/*
把1265赋值给结构变量item的成员code。
item是一个结构名
code是结构item模板指定的成员名
那么item.code标识该结构中的这个成员
item.code的类型就是被指定的code的类型
在联合中也可以用相同的方式使用成员。
*/
间接成员运算符
- 间接成员运算符
$->$
与指向结构或联合的指针一起使用,标识该结构或联合的一个成员。
srryct
{
int code;
float cost;
}item,*ptrst;
ptrst=&item;
ptrst->code=3451;
/*
ptrst->code==item.code==(*ptrst).code
ptrst是一个指向结构的指针
code是结构item模板指定的成员
那么ptrst->code标识了指针所指向结构的这个成员
在联合中也可以用相同的方式使用间接成员运算符。
*/
按位运算符
~ 是一元运算符,它通过翻转运算对象的每一位得到一个值
- & 只有当两个运算对象中对应的位都是1时,它生成的值中对应位才为1.
- | 只要两个运算对象中对应的位有一位位1,它生成的值中对应的位就为1.
- ^ 按位异或运算符,只有两个运算对象中的位只有1位位1(不能全为1),它生成的值中对应的位才为1.
- << 左移运算符,把左边运算对象中的位向左移动得到一个值。移动的位数由该运算符右边的运算对象确定,空出的位用0填充。
- >> 右移运算符,把左边运算对象中的位向右移动得到一个值。移动的位数由该运算符右边的运算对象确定,空出的位用0填充。
int x=2;
int y=3;
x==00000010
y==00000011
x&y==00000010==2
y<<x==00001100=12
y>>x==00000000????右移不确定结果
混合运算符
- sizof 给出它右边运算对象的大小,单位是char的大小。通常char类型是一字节。运算对象可以圆括号中的类型说明符,如sizeof(float),也可以是特定的类型名,数组名等,如sizeof foo.sizeof表达式类型是size_t
// Definitions of common types
#ifdef _WIN64
typedef unsigned __int64 size_t;
#else
typedef unsigned int size_t;
#endif
-
_Alignof(C11)给出它的运算对象指定类型的对齐要求。一些系统要求以特定值的倍数在地址上储存特定类型,如4的倍数,这个整数就是对齐要求
-
(类型名)强类型转换运算符,它把后面的值转换成圆括号中关键字指定的类型。
(float)9 把整数9转换成浮点数9.0
(int)9.0 把浮点数9.0转换成整数9
$,$
逗号运算符,它把两个表达式链接成一个表达式,并保证先对左端的表达式求值,整个表达式的值是最右边表达式的值,该运算符通常在for循环头中用于包含更多的信息
int fargo,step,i,j,k;
for(step=2,fargo=0;fargo<1000;step+=2,i++,j--,k+=j)
{
fargo+=step;
}