内容正文:
第3章表达式
第3章表达式
01表达式概述
02赋值表达式
03算术表达式
04强制类型转换及自增自减
05逗号表达式
06典型例题
2
赋值表达式
赋值操作符
赋值操作符=是双目操作符,优先级倒数第2,右结合。
赋值操作符用于赋值,左边不能是字面量或不表示存储单元的表达式。'a' = 23、3 = i、a + b = 23都是非法的表达式。
赋值表达式的作用是给变量赋值,但作为表达式,它也有一个值。
赋值操作符=是双目操作符,优先级倒数第2,右结合。
赋值操作符用于赋值,左边不能是字面量或不表示存储单元的表达式。'a' = 23、3 = i、a + b = 23都是非法的表达式。
赋值表达式的作用是给变量赋值,但作为表达式,它也有一个值。
4
例3-3 分析下面程序的运行情况
矛盾吗?
应如何理解?
程序中先定义两个整型变量i和j,变量j被初始化为3。接着变量i被赋值为1。语句i = i + 1;怎样求值呢?
5
语句i = i + 1;的执行过程
语句中有赋值=和加法+两个操作符,加法+的优先级高,求值顺序是
(i = (i + 1))。
子表达式i+1求值时,运算器进行加法操作,变量i的值会被读取到运算器中,然后和整数1相加,得到和为2,int。
原表达式变为i = 2,求值时,会把运算器中的
2存入变量i中,同时运算器中的2也是表达式
的值。
语句i = i + 1;中有赋值=和加法+两个操作符,加法+的优先级高,求值顺序是(i = (i + 1))。
子表达式i+1求值时,运算器进行加法操作,变量i的值会被读取到运算器中,然后和整数1相加,得到和为2,int。
原表达式变为i = 2,求值时,会把运算器中的2存入变量i中,同时运算器中的2也是表达式的值。
6
语句j = i;执行后,变量i的值是多少?
该语句的作用是将变量i的值存入变量j中,即变量j的值也变为2。
语句执行后,变量i的值依然为2。
两变量的赋值操作可理解为拷贝。赋值时,
变量j的存储状态会设置成与变量i的相同,
但变量i的存储状态不会改变,因此,
其值不变。
语句j = i;的作用是将变量i的值存入变量j中,即变量j的值也变为2。
语句执行后,变量i的值依然为2。
两变量的赋值操作可理解为拷贝。赋值时,变量j的存储状态会设置成与变量i的相同,
但变量i的存储状态不会改变,因此,其值不变。
程序的输出结果为2,2.
7
例3-4 有int i, j, k;,表达式a = b = c = 23合法吗?
原表达式的求值顺序为(a = (b = (c = 23)))。
子表达式c = 23先执行,变量c的值变为23,且该表达式的值为23,int型。接着求值时,原表达式变为(a = (b = 23))。
子表达式b = 23先执行,变量b的值变为23。表达式又变为(a = 23),变量a的值变为23,该表达式的值为23,int型。原表达式的值也就是整数23。
右结合使得给多个变量赋值相同的数的表达式非常简洁。若赋值操作符是左结合,则相关表达式需写作:a = (b = (c = 23))。
赋值操作符为何要右结合?以表达式a = b = c = 23的求值过程为例分析。
原表达式的求值顺序为(a = (b = (c = 23)))。
子表达式c = 23先执行,变量c的值变为23,且该表达式的值为23,int型。接着求值时,原表达式变为(a = (b = 23))。
子表达式b = 23先执行,变量b的值变为23。表达式又变为(a = 23),变量a的值变为23,该表达式的值为23,int型。原表达式的值也就是整数23。
右结合使得给多个变量赋值相同的数的表达式非常简洁。若赋值操作符是左结合,则相关表达式需写作:a = (b = (c = 23))。
8
表达式的合法性
怎样判断一个表达式是否合法?
方法一:按照规则对表达式求值,如果能得到一个值,表达式就合法;如果在求值的过程中出现了错误,表达式非法。
方法二:把表达式变成表达式语句,如果语句能通过编译,相关表达式就合法。
推荐的作法:先利用方法一得出结论,再利用方法二进行验证。养成人工执行代码的习惯!
怎样判断一个表达式是否合法?
方法一:按照规则对表达式求值,如果能得到一个值,表达式就合法;如果在求值的过程中出现了错误,表达式非法。
方法二:把表达式变成表达式语句,如果语句能通过编译,相关表达式就合法。
推荐的作法:先利用方法一得出结论,再利用方法二进行验证。养成人工执行代码的习惯!
9
例3-5 分析表达式a = 3 * 2 = 5 * 7。
求值顺序为(a = ((3 * 2) = (5 * 7)))。
乘法操作符执行后,原表达式变为a =(6 = 35)。子表达式6 = 35中赋值操作符的左操