运算符

来源:互联网 发布:java 适配器模式详解 编辑:程序博客网 时间:2024/06/06 03:09

运算符

运算符是一种操作方法


运算符列表及优先级

运算符 名称或含义 使用形式 结合性 说明 优先级 [] 数组下标 数组名[常量表达式] 左到右 1 () 圆括号 (表达式)/函数名(形参表) 左到右 1 . 成员选择(对象) 对象.成员名 左到右 1 -> 成员选择(指针) 对象指针->成员名 左到右 1 - 负号运算符 -表达式 右到左 单目运算符 2 (类型) 强制类型转换 (数据类型)表达式 右到左 2 ++ 自增运算符 ++变量名/变量名++ 右到左 单目运算符 2 – 自减运算符 –变量名/变量名– 右到左 单目运算符 2 * 取值运算符 *指针变量 右到左 单目运算符 2 & 取地址运算符 &变量名 右到左 单目运算符 2 ! 逻辑非运算符 !表达式 右到左 单目运算符 2 ~ 按位取反运算符 ~表达式 右到左 单目运算符 2 sizeof 长度运算符 sizeof(表达式) 右到左 2 / 除 表达式/表达式 左到右 双目运算符 3 * 乘 表达式*表达式 左到右 双目运算符 3 % 余数(取模) 整型表达式/整型表达式 左到右 双目运算符 3 + 加 表达式+表达式 左到右 双目运算符 4 - 减 表达式-表达式 左到右 双目运算符 4 << 左移 变量<< 表达式 左到右 双目运算符 5 >> 右移 变量>>表达式 左到右 双目运算符 5 > 大于 表达式>表达式 左到右 双目运算符 6 >= 大于等于 表达式>=表达式 左到右 双目运算符 6 < 小于 表达式<表达式 左到右 双目运算符 6 <= 小于等于 表达式<表达式 左到右 双目运算符 6 == 等于 表达式==表达式 左到右 双目运算符 7 != 不等于 表达式!= 表达式 左到右 双目运算符 7 & 按位与 表达式&表达式 左到右 双目运算符 8 ^ 按位异或 表达式^表达式 左到右 双目运算符 9 | 按位或 表达式|表达式 左到右 双目运算符 10 && 逻辑与 表达式&&表达式 左到右 双目运算符 11 || 逻辑或 表达式||表达式 左到右 双目运算符 12 ?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符 13 = 赋值运算符 变量=表达式 右到左 14 /= 除后赋值 变量/=表达式 右到左 14 *= 乘后赋值 变量*=表达式 右到左 14 %= 取模后赋值 变量%=表达式 右到左 14 += 加后赋值 变量+=表达式 右到左 14 -= 减后赋值 变量-=表达式 右到左 14 <<= 左移后赋值 变量<< =表达式 右到左 14 >>= 右移后赋值 变量>>=表达式 右到左 14 &= 按位与后赋值 变量&=表达式 右到左 14 ^= 按位异或后赋值 变量^=表达式 右到左 14 |= 按位或后赋值 变量|=表达式 右到左 14 , 逗号运算符 表达式,表达式,… 左到右 从左向右顺序运算 15

运算符优口诀

  括号成员第一;        //括号运算符[]() 成员运算符.  ->  全体单目第二;        //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&  乘除余三,加减四;   //这个"余"是指取余运算即%  移位五,关系六;    //移位运算符:<< >> ,关系:> < >= <= 等  等于(与)不等排第七;    //即== 和!=  位与异或和位或;    //这几个都是位运算: 位与(&)异或(^)位或(|)      "三分天下"八九十;    逻辑或跟与;            //逻辑运算符:|| 和 &&  十二和十一;            //注意顺序:优先级(||)  底于 优先级(&&)   条件高于赋值;        //三目运算符优先级排到13 位只比赋值运算符和","高  逗号运算级最低!    //逗号运算符优先级最低 

要点

一般来说
  • 单目运算符大于双目运算符
  • 单目算术运算符>!>&&>||>?:>赋值运算符>逗号运算符

运算符结合性

结合性是为了控制哪个运算符先和常量/变量/函数调用结合.

运算符的结合性在常量/变量/函数调用两端都有运算符且运算符优先级相同时,才会被考虑

  • 例如

    x-y+z;//变量y左右两边有 - 和 + 两个运算符,优先级相同//这时候要考虑结合性的问题//两个运算符的结合性凑是左结合性,即自左向右,所以符号 - 先被结合//此语句的效果和(x-y)+z;一样

用运算符设计分支语句

  • 一般来说,我们不可以通过条件运算符来进行分支语句的设计

    但运算符中有两种确实可以用来设计分支语句

    /*条件运算符 ? :*/a >= b?printf("%d\n",a):printf("%d\n",b);/*||和&&*/a > b || puts("hello");//如果a<=b的话就打印hello,否则什么都不干.a > b && a = 1;//如果a>b的话对a赋值1;否则什么都不干.

运算符实例

   int (*p)[4];//指针   int *p[4];//数组   //第一条语句定义了一个指针变量,第二条语句定义了一个数组变量   //但是很多人都搞不清是怎么回事,这个问题要从结合性要看   int (*p)[4];   //变量为p   //p首先和*结合,形成(*p),这就表明它是一个指针   //其中4和[]结合,形成[4],表明这是一个数组   //接着(*p)和[4]结合,这表明它是一个指向数组的指针   //很多人又搞不明白,既然第7行说它是一个指针,第8行又说它是一个数组,不知道到底它是个什么东西   //再来一遍,我们研究的是什么,是变量p,[4]和(*p)结合形成了一个数组名为(*p)的数组   //所以说(*p)是数组,p是一个指向数组的指针   //不过我们一般不说(*p)是个数组名,注意了.   int *p[4];   //变量为p   //4和[]结合,形成[4],表明这是一个数组   //p左边为*,右边为[4].等级相同,右结合性.所以先和[4]结合,形成了p[4],即数组名为p的数组   //p[4]和*结合,产生了一个存储指针的数组?为什么?
0 0
原创粉丝点击