内容正文:
第3章表达式
第3章表达式
01表达式概述
02赋值表达式
03算术表达式
04强制类型转换及自增自减
05逗号表达式
06典型例题
2
逗号表达式
这节课,我们讨论逗号表达式。
3
逗号操作符(,)
逗号操作符优先级最低,左结合。逗号表达式的一般形式为:子表达式1, 子表达式2, ……, 子表达式n。
逗号表达式求值的过程是自左向右,先求值表达式1,再求值表达式2,……,最后求值表达式n。
表达式n的值和类型也是整个逗号表达式的值和类型。
逗号操作符优先级最低,左结合。逗号表达式的一般形式为:子表达式1, 子表达式2, ……, 子表达式n。
逗号表达式求值的过程是自左向右,先求值表达式1,再求值表达式2,……,最后求值表达式n。
表达式n的值和类型也是整个逗号表达式的值和类型。
4
例3-14 分析下面两个表达式
1. b = (a = 3 * 5, a * 4)
求值顺序为(b = ((a = (3 * 5)), (a * 4))),赋值表达式
(b = ((a = (3 * 5)), (a * 4)))⇒(b = ((a = 15), (a * 4)))⇒(b = (15, (a * 4)))
⇒(b = (15, 60))⇒b = 60⇒表达式的值为60,int。
2. b = a = 3 * 5, a * 4
求值顺序为(b = (a = (3 * 5))), (a * 4),逗号表达式。
(b = (a = (3 * 5))), (a * 4)⇒(b = (a = 15)), (a * 4)⇒(b = 15), (a * 4)
⇒15, (a * 4)⇒15, (15 * 4)⇒15, 60⇒表达式的值为60,int。
表达式应易于理解,可读性好。这两个表达式是错误的示范。
表达式b = (a = 3 * 5, a * 4)求值时先执行圆括号里面的逗号表达式,自左向右依次执行,先执行3 * 5,再执行a = 15,接着执行a * 4,逗号表达式的值为60。
赋值表达式b = 60最后执行,因此,这是一个赋值表达式。最后执行什么操作,整个表达式就是什么表达式。
这个表达式的作用有两个,将变量a赋值为15,将变量b赋值为60。这个表达式不简洁,可读性不好。
表达式b = a = 3 * 5, a * 4是逗号表达式,自左向右依次执行每个子表达式。表达式最后的值为60。这个表达式的作用,是将变量a和b赋值为15。这个表达式中
a * 4没有作用,纯属多余。
这两个表达式仅仅用于求值过程分析,可读性太差,没有实用价值。
5
逗号表达式的作用
逗号表达式可用于将多条简单的语句合并成一条语句。
两条语句i = 0;和语句j = ++i;可合并成一条语句i = 0, j = ++i;。
由于逗号表达式自左向右依次对子表达式求值,合并后的一条语句与合并之前的两条语句在执行次序上完全相同。
表达式i = 0, j = ++i中,++操作符的优先级最高,为何不先执行?
逗号表达式的求值过程不符合优先级高的操作符先执行的规则,这是因为表达式求值时首先遵循序列点规则。
逗号表达式可用于将多条简单的语句合并成一条语句。
两条语句i = 0;和语句j = ++i;可合并成一条语句i = 0,j = ++i;。
由于逗号表达式自左向右依次对子表达式求值,合并后的一条语句与合并之前的两条语句在执行次序上完全相同。
表达式i = 0,j = ++i中,++操作符的优先级最高,为何不先执行?
逗号表达式的求值过程不符合优先级高的操作符先执行的规则,这是因为表达式求值时首先遵循序列点规则。
6
序列点规则
表达式求值时,先考虑序列点,再考虑优先级和结合性。
特定的操作符有序列点,有序列点的操作符执行时,左操作数先于右操作数求值。
表达式3 * 2 + 3 - 2的求值顺序为(((3 * 2) + 3) - 2)。+操作符的左边相邻的操作符是*,优先级高,因此,+操作符的左操作数是子表达式3 * 2;+操作符的右边相邻的操作符是-,两者优先级相同,但左结合,因此,+操作符的右操作数是3。通过确定求值顺序可以清晰地看出每个操作符的操作数。
表达式求值时,先考虑序列点,再考虑优先级和结合性。
特定的操作符有序列点,有序列点的操作符执行时,左操作数先于右操作数求值。
表达式3 * 2 + 3 - 2的求值顺序为(((3 * 2) + 3) - 2)。+操作符的左边相邻的操作符是*,优先级高,因此,+操作符的左操作数是子表达式3 * 2;+操作符的右边相邻的操作符是-,两者优先级相同,但左结合,因此,+操作符的右操作数是3。通过确定求值顺序可以清晰地看出每个操作符的操作数。
操作符的操作数与其相邻的操作符的优先级和结合性有关。
7
逗号操作符有序列点