运算符

运算符表

运算符(优先级从高至低)结合律
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值