运算符

运算符

运算符分类
  • 按照功能分类
    • 算术运算符
    • 关系运算符和逻辑运算符
    • 按位运算符
  • 运算符根据参与运算的操作数的个数分为
    • 单目运算
      • 单目运算:只有一个操作数
    • 双目运算
      • 双目运算:两个操作数
    • 三目运算
      • 三目运算:C语言中唯一的一个,也称为问好表达式
运算符的优先级以及结合性
  • C语言中,运算符的运算优先级分为15级,1级最高,15级最低,在表达式中,优先级高的先于优先级低的进行运算,而在一个运算量两侧的运算符,优先级相同时,则按照运算符的结合性所规定的结合方向处理
优先级 运算符 名称或含义 使用形式 结合方向 说明
1 [] 数组下标 数组名[常量表达式] 左到右
() 圆括号 (表达式)/函数名(形参)
. 成员选择(对象) 对象.成员
-> 成员选择(指针) 对象指针->成员名
2 - 负号运算符 -表达式 右到左 单目运算符
(类型) 强制类型转换 (数据类型)表达式
++ 自增运算符 ++变量名/变量名++ 单目运算符
-- 自减运算符 --变量名/变量名-- 单目运算符
* 取值运算符 *指针变量 单目运算符
& 取地址运算符 &变量名 单目运算符
逻辑非运算符 !表达式 单目运算符
~ 按位取反运算符 ~表达式 单目运算符
sizeof 长度运算符 sizeof(表达式) 单目运算符
3 / 表达式/表达式 左到右 双目运算符
* 表达式*表达式 双目运算符
% 取余(取模) 整型表达式%整型表达式 双目运算符
4 + 表达式+表达式 左到右 双目运算符
- 表达式-表达式 双目运算符
5 << 左移 变量<<表达式 左到右 双目运算符
>> 右移 变量>>表达式 双目运算符
6 > 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式 双目运算符
< 小于 表达式<表达式 双目运算符
<= 小于等于 表达式<=表达式 双目运算符
7 == 等于 表达式==表达式 左到右 双目运算符
!= 不等于 表达式!=表达式 左到右 双目运算符
8 & 按位与 表达式&表达式 左到右 双目运算符
9 ^ 按位异或 表达式^表达式 左到右 双目运算符
10 按位或 按位或 表达式 按位或 表达式 左到右 双目运算符
11 && 逻辑与 表达式&&表达式 左到右 双目运算符
12 逻辑或 表达式 表达式 左到右 双目运算符
13 ?: 条件运算符 表达式1 ? 表达式2:表达式3 右到左 三目运算符
14 = 赋值运算符 变量=表达式 右到左
/= 除后赋值 变量/=表达式
*= 乘后赋值 变量*=表达式
%= 取模后赋值 变量$=表达式
+= 加后赋值 变量+=表达式
-= 减后赋值 变量-=表达式
<<= 左移后赋值 变量<<=表达式
>>= 右移后赋值 变量>>=表达式
&= 按位与后赋值 变量&=表达式
^= 按位异或后赋值 变量^=表达式
按位或后赋值 按位或后赋值 变量按位或后赋值表达式
15 , 逗号运算符 表达式,表达式..... 左到右 从左向右顺序运算
- 注意:`按位或 ,逻辑或 , 按位或后赋值 = `
结合性
  • C语言中各种运算符的结合性分为两种,左结合性(自左至右)和右结合性(自右至左)
    • 算术运算符的结合性是自左至右,即先左后右
    • 自右至左的结合方向称为“右结合性”
算术运算符
  • 算术运算符有:加+ 减- 乘* 除/ 取余%

  • 整数除以整数,求出来的结果依然是整数

  • 浮点型赋值给整型会损失小数部分

  • % 两侧必须都为整数

  • 利用%求出来的余数是正数还是负数,由%左边的被除数决定,被除数是正数,余数就是正数,反之则是负数

  • 结合性优先级
    -* / % 优先级大于 + -

    • 优先级相同则左结合计算
  • 自动类型提升

    • 算术运算符规定:只有相同类型的数据才可以进行运算
    • 如果计算过程中,参与运算的操作数不是同一类型,那么系统会自动将小类型转换为大类型,然后再进行计算
  • 算术运算的注意点:

    • 自动类型转换:int a = 10.6;
    • 自动将大类型转换为小类型,会丢失精度,自动类型提升 int b = 10.5 + 10;
    • 将右边的1 提升为double类型,double b = 1.0 / 2 ;解决除法的精度问题
    • 强制类型转换 double a = (double)1 / 2; 结果:a=0.500000; double b = (double)(1 / 2);结果:b=0.000000;
    • 如果取模运算左边小于右边,那么结果就是左边的数
    • 无论是隐式转换还是显式转换,只要将一个大类型的数据,转换为小类型的数据,那么就有可能丢失精度
类型转换问题
  • 类型转换分为

    • 隐式类型转换
      • 不同类型数据混合运算时,升级成数据类型较大的类型
      • 赋值时右侧表达式的值转换成左侧变量的类型
      • 所有浮点运算都是以double类型进行计算,即使表达式中都是float
      • 必定会发生的转换
        • char、short -> int
        • float -> double
    • 显式类型转换
      • (类型关键字)(表达式)
      • (int)8.8 / 4: 8.8先转换为8 然后再除以4,结果是2
  • 自动转换发生在不同数据类型的量混合运算时,由编译器系统自动完成

  • 自动类型转换遵循以下规则:

    • 相同的数据类型的值才能进行运算(比如加法运算),而且运算结果依然是同一种数据类型,系统会自动对占用内存较少的类型做一个自动类型提升的操作
    • 若参与运算量的类型不同,先转换成同一类型,然后进行运算
    • 转换按数据长度增加的方向进行,以保证精度不降低,如int类型和long类型运算时,先把int量转换成long类型再进行计算
    • 所有浮点型运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double类型再做运算
    • char型和short型参与运算时,必须先转换成int型
    • 在赋值运算中,赋值号两边的数据类型不同时,赋值号右边的量将转换为左边的量,如果右边的量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失部分,按四舍五入
    • char/short -> int ->unsigned -> long -> double
  • 强制类型转换:

    • 将大范围的数据赋值给小范围的变量时,系统会自动做一个强制类型转换的操作,这样容易丢失精度
    • 类型说明符和表达式都必须加括号(单个变量可以不加括号)
赋值运算符
  • 简单赋值运算符:=

  • 复合赋值运算符:+=、-=、*=、/=、%=

  • 最简单的赋值运算:将等号右边的值赋值给等号左边的变量

  • 复合赋值运算符

    • /= 例如:a/=3; 相当于a = a / 3;
    • *= 例如: a*=3; 相当于a = a * 3;
    • %= 例如: a%=3; 相当于a = a % 3;
    • += 例如: a+=3; 相当于a = a + 3;
    • -= 例如: a-=3; 相当于a = a - 3;
自增、自减
  • 前缀表达式:++x,--x:其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值,即先变后用,也就是变量的值先变,然后再用变量的值参与运算
  • 后缀表达式:x++,x--:先用x的值为表达式的值,然后变量自增自减1,即先用后变,也就是先用变量的值进行运算,然后变量自增自减变换
sizeof运算符
  • sizeof可以用来计算一个变量或一个常量、一种数据类型所占用的内存字节数

  • 格式:sizeof(变量/常量)

  • sizeof不是一个函数,是一个运算符

  • 计算常量所占用字节数

    • sizeof(10); 或者sizeof 10
  • 计算变量占用的字节数

double doubleValue = 10.9;
int number = sizeof(doubleValue);
// 也可以省略括号
int number = sizeof doubleValue;
  • 计算数据类型
    • sizeof计算数据类型,括号不能省略
int number = sizeof(char);
int number = sizeof(double);
逗号运算符
  • 功能是将多个表达式连接起来组成一个表达式,称为逗号表达式

    • 格式:表达式1,表达式2,.....表达式n;
  • 求值过程

    • 逗号表达式从左往右以此计算各个表达式的值
    • 整个逗号表达式的值是最后一个表达式的值
关系运算符
  • c语言中,条件成立称为真,条件不成立称为假

  • 任何非0值都是真,只有0才是假

  • 关系运算符有:> 、>= 、< 、<= 、== 、 !=

    • 关系运算符的结果只有两种,条件成立结果为真,条件不成立结果为假
  • 关系运算符优先级:> < >= <= 优先级大于== !=

  • 算术运算符优先级大于关系运算符

逻辑运算符
  • C语言提供了三种逻辑运算符

    • && 与
    • || 或
    • ! 非
  • 逻辑与(&&)

    • 格式:表达式1 && 表达式2
    • 只有表达式1和表达式2都为真的时候才是真,只要有一个是假,那么结果就是假
    • 特点:一假则假,如果表达式1是假,那么表达式2将不会计算
  • 逻辑或(||)

    • 格式:表达式1 || 表达式2
    • 只要有一个是真,那么结果是真,只有两个表达式都为假时,结果才是假
    • 特点:一真则真,如果表达式1是真,那么表达式2将不会计算
  • 逻辑非 (!)

    • 格式:!表达式
    • 表达式是真,那么就是假,表达式是假,那么就是真
    • 结合性:从右至左
三目运算符
  • 格式:条件表达式 ? 结果A : 结果B
  • 结合性:从左往右
  • 条件表达式为真,就返回结果A,否则返回结果B
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • C++运算符重载-上篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 2,280评论 0 51
  • 谨记 当你还在原地停留不动时,你的敌人已经前进一大步了;当你还沉浸在成功的喜悦中,你的对手又更上一层楼了;当你还在...
    长风留言阅读 1,743评论 2 5
  • C++运算符重载-下篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 1,430评论 0 49
  • 表达式和运算符 程序中最简单的表达式就是,程序中的常量 变量名也是一种简单的表达式 复杂的表达式是由简单的表达式组...
    zhaolion阅读 1,620评论 3 12
  • Method Swizzling原理每个类都维护一个方法(Method)列表,Method则包含SEL和其对应IM...
    monk阅读 226评论 0 0