单元表达式 46问号表达式和逗号表达式 C++中还提供了一种比较复杂的表达式,即问号表达式,又称条件表达式。问号表达式 使用两个运算符(?和:)对三个运算对象进行操作,格式为 <表达式1>?<表达式2><表达式3> 问号表达式的值是这样确定的:如果<表达式1>的值为非零值,则问号表达式的值就是 <表达式2>的值;如果<表达式1>的值等于0,则问号表达式的值为<表达式3>的值。利用问 号表达式可以简化某些选择结构的编程。例如,分支语句 等价于语句 >y ?x:y 例4-2编写一个求绝对值的函数。 程序 ∥/ Example4-2:求双精度类型量的绝对值 double dabs(double x) return x>0?x: -x 在C+中可以使用逗号(,)将几个表达式连接起来,构成逗号表达式。逗号表达式的 格式为 <表达式1>,<表达式2>,,<表达式n> 在程序执行时,按从左到右的顺序执行组成逗号表达式的各表达式,而将最后一个表达 式(即表达式n)的值作为逗号表达式的值。 逗号表达式常用于简化程序的编写。例如,如下程序结构 if(x>y) t =x 可以利用逗号表达式简化为
第 4 单元 表达式 - 71 - 4.6 问号表达式和逗号表达式 C++中还提供了一种比较复杂的表达式, 即问号表达式, 又称条件表达式。问号表达式 使用两个运算符 ( ? 和 : ) 对三个运算对象进行操作, 格式为: <表达式 1>?<表达式 2>:<表达式 3> 问号表达式的值是这样确定的: 如果<表达式 1>的值为非零值, 则问号表达式的值就是 <表达式 2>的值; 如果<表达式 1>的值等于 0, 则问号表达式的值为<表达式 3>的值。利用问 号表达式可以简化某些选择结构的编程。例如, 分支语句 if(x>y) z = x; else z = y; 等价于语句 z = x>y ? x : y; [例 4-2] 编写一个求绝对值的函数。 程 序: // Example 4-2:求双精度类型量的绝对值 double dabs(double x) { return x>0?x:-x; } 在C++中可以使用逗号 ( , ) 将几个表达式连接起来,构成逗号表达式。逗号表达式的 格式为: <表达式 1>, <表达式 2>, ..., <表达式 n> 在程序执行时, 按从左到右的顺序执行组成逗号表达式的各表达式, 而将最后一个表达 式 (即表达式 n) 的值作为逗号表达式的值。 逗号表达式常用于简化程序的编写。例如, 如下程序结构 if(x>y) { t = x; x = y; y = t; } 可以利用逗号表达式简化为: if(x>y)
单元表达式 47表达式中各运算符的运算顺序 大家知道,四则运算的运算顺序可以归纳为“先乘、除,后加、减”,也就是说乘、除 运算的优先级别比加减运算的优先级别要高。C语言中有几十种运算符,仅用一句“先乘 除,后加、减”是无法表示各种运算符之间的优先关系的,因此必须有更严格的确定各运算 符优先关系的规则。表43列出了各种运算符的优先级别和同级别运算符的运算顺序(结合 方向) 表4-3运算符的优先级别和结合方向 优先级别运算符 运算形式结合方 名称或含义 圆括号 自左至右数组下标 结构体成员 用指针访问结构体成员 负号和正号 ++X 或 自增运算和自减运算 逻辑非 自右至左按位取反 类型转换 由地址求内容 求变量的地址 求某类型变量的长度 除和求余 el+e2 自左至右加和减 el<<d2 自左至右左移和右移 自左至右关系运算(比较) =自左至右等手和不等于比纹一 el&e2 自左至右按位与 自左至右按位异或 左至右按位或 自左至右逻辑与(并且) 续表4-3 运算符 运算形式结合方向 称或含义 12 自左至右逻辑(或者) e1?e2. e3 自右至左条件运算
第 4 单元 表达式 - 72 - t = x, x = y, y = t; 4.7 表达式中各运算符的运算顺序 大家知道, 四则运算的运算顺序可以归纳为“先乘、除, 后加、减”, 也就是说乘、除 运算的优先级别比加减运算的优先级别要高。C语言中有几十种运算符, 仅用一句“先乘、 除, 后加、减”是无法表示各种运算符之间的优先关系的, 因此必须有更严格的确定各运算 符优先关系的规则。 表 4-3 列出了各种运算符的优先级别和同级别运算符的运算顺序(结合 方向)。 表 4-3 运算符的优先级别和结合方向 优先级别 运算符 运算形式 结合方向 名称或含义 1 () [] . -> (e) a[e] x.y p->x 自左至右 圆括号 数组下标 结构体成员 用指针访问结构体成员 2 - + ++ -- ! ~ (t) * & sizeof -e ++x 或 x++ !e ~e (t)e *p &x sizeof(t) 自右至左 负号和正号 自增运算和自减运算 逻辑非 按位取反 类型转换 由地址求内容 求变量的地址 求某类型变量的长度 3 * / % e1*e2 自左至右 乘、除和求余 4 + - e1+e2 自左至右 加和减 5 << >> e1<<d2 自左至右 左移和右移 6 < <= > >= e1<e2 自左至右 关系运算(比较) 7 == != e1==e2 自左至右 等于和不等于比较 8 & e1&e2 自左至右 按位与 9 ^ e1^e2 自左至右 按位异或 10 | e1|e2 自左至右 按位或 11 && e1&&e2 自左至右 逻辑与(并且) 续表 4-3 优先级别 运算符 运算形式 结合方向 名称或含义 12 || e1||e2 自左至右 逻辑(或者) 13 ? : e1?e2:e3 自右至左 条件运算 14 = 赋值运算