目录
一、前言
1、上节课回顾
上一次给大家讲了strlen和sizeof的区别,不仅仅在期末考试中,在以后写代码的过程中我们也会经常用到这两个来计算字符串的长度,所以大家一定要弄明白,不然以后很容易出错的。
今天主要给大家讲的就是表达式与运算符优先级的问题。这块对于初学C++的同学来说也是一块难点,希望大家能够用心学习。
2、上节思考题答案
上节课让大家分析下面这几个字符串的长度
char a[] = "ab\0cd\5\\";
char a[10] = "ab\0cd\5\\";
char a[] = "ab\1cd\5\\";
答案如下:
字符串 | sizeof | strlen |
char a[] = "ab\0cd\5\\"; | 8 | 2 |
char a[10] = "ab\0cd\5\\"; | 10 | 2 |
char a[] = "ab\1cd\5\\"; | 8 | 7 |
二、重点知识介绍
1、表达式
1.什么是表达式
表达式是由运算符和操作数组成的式子。例如:
1+2+3;
a = 4*5/6;
2.运算符
运算符包含:常量、变量、函数及自己命名的标识符。
3.常见表达式
常见表达式有如下几种:
1.算术表达式
由算术运算符和位操作运算符组成的表达式,其值是算术值。类型由操作数决定。
示例如下:
6 * 5 / 3 - 4 + 5
2.逻辑表达式
由逻辑运算符组成的表达式。类型是bool型。
示例如下:
5 && 6 && i++
3.关系表达式
由关系运算符组成的表达式。类型是bool型。
示例如下:
i != 5
4.赋值表达式
由赋值运算符组成的表达式。赋值运算符共有11种,一种基本的,11种复合的。
赋值运算符有两个很重要的特点:
(1)结合性从右到左。
(2)优先级较低,仅高于逗号表达式。
示例如下:
i += 5
5.条件表达式
由三目运算符组成的表达式。三目运算符的格式为:
a > b? a : b
6.逗号表达式
将若干表达式用逗号连接起来的表达式。
示例如下:
i-=3, i++
2、C++常用运算符优先级
1.运算符优先级表
下表为常见运算符名称及其使用优先级。
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[整型表达式] | 左到右 | |
() | 圆括号 | (表达式)/函数名(形参表) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2 | - | 负号运算符 | -算术类型表达式 | 右到左 | 单目运算符 |
(type) | 强制类型转换 | (纯量数据类型)纯量表达式 | |||
++ | 自增运算符 | ++纯量类型可修改左值表达式 | 单目运算符 | ||
-- | 自减运算符 | --纯量类型可修改左值表达式 | 单目运算符 | ||
* | 取值运算符 | *指针类型表达式 | 单目运算符 | ||
& | 取地址运算符 | &表达式 | 单目运算符 | ||
! | 逻辑非运算符 | !纯量类型表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~整型表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof 表达式 sizeof(类型) | |||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式%整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 整型表达式<<整型表达式 | 左到右 | 双目运算符 |
>> | 右移 | 整型表达式>>整型表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 整型表达式&整型表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 整型表达式^整型表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 整型表达式|整型表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 可修改左值表达式=表达式 | 右到左 | |
/= | 除后赋值 | 可修改左值表达式/=表达式 | |||
*= | 乘后赋值 | 可修改左值表达式*=表达式 | |||
%= | 取模后赋值 | 可修改左值表达式%=表达式 | |||
+= | 加后赋值 | 可修改左值表达式+=表达式 | |||
-= | 减后赋值 | 可修改左值表达式-=表达式 | |||
<<= | 左移后赋值 | 可修改左值表达式<<=表达式 | |||
>>= | 右移后赋值 | 可修改左值表达式>>=表达式 | |||
&= | 按位与后赋值 | 可修改左值表达式&=表达式 | |||
^= | 按位异或后赋值 | 可修改左值表达式^=表达式 | |||
|= | 按位或后赋值 | 可修改左值表达式|=表达式 | |||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序结合 |
2.重点说明
很多人有这个表遇到复杂的表达式还是不会计算,所以做如下说明。
1.分析表达式时,从左往右看;
2.先算优先级高的,再算优先级低的;
3.若是同级,看结合方向,若结合方向从左到右,先算左边再算右边;若结合方向从右到左,先算右边再算左边;
4.可以用小括号改变优先级;
5.使用逻辑与和逻辑或会有“短路”概念。
3.短路
逻辑与:当有一个是假,则最终为假,则a&&b中a为假时,b没有执行的必要,被短路。
逻辑或:当有一个是真,则最终为真,则a || b中a为真时,b没有执行的必要,被短路。
4.示例
为帮助大家理解,特别举几个例子说明:
(1)!a && ++b //a = 8 , b = 2
从左往右看,逻辑非!是二级,比逻辑与(11级)高,先算 !a 是0,逻辑与,被短路,后面不操作,所以a还是8,b还是2。
使用 const 关键字声明常量格式如下:
(2)a += b += a+b; //a = 8 b = 2
从左往右看,+= 和+=同级,先算后面的,+的优先级高于 += ,则先算+,即上面代码先算a+b = 10;+=是从右向左结合,所以先计算 b += a+b,最后计算 a += b。所以上面式子与下面式子等价:
b += (a+b);
a += b;
最后b = 12 ,a = 20。
三、思考题
已知a = 12,b = 3。
分析下面表达式的值,以及a和b的值:
b||a-4&&a/b
b&&a*b&&a+b
a+b/(a+b)&&b++
a+=b*=a-=b/=a-b
思考题的答案会在下一次的【C++从入门到熟练练习题】中公布哦,希望大家能够多多练习。