2.双目表达式 双目表达式>=<表达式><双目运算符>表达式 <双目运算符>:=*|%+|-|>1<1>1<|>=| =|=&|^|&&|‖ 双目运算符中又可为 算术运算符:*,/,%,十, 移位运算符:>,<< 关系运算符:>,<,=,<=,=,= 字位运算符:&,^, 逻辑运算符:&&,‖ 逗号运算符: 第二章数据、运算符、表达式
第二章 数据、运算符、表达式 2.双目表达式 <双目表达式> ::= <表达式> <双目运算符> <表达式> <双目运算符> ::= * | / | % | + | - | >> | << | > | < | >= | <= | == | != | & | ^ | | | && | || | , 双目运算符中又可为: 算术运算符:*, /, %, +, - 移位运算符:>>, << 关系运算符:>, <, >=, <=, ==, != 字位运算符:&, ^, | 逻辑运算符:&&, || 逗号运算符:
在按位运算中, 按位或通常用于给字中某些位赋值 按位与通常用于取出字中某些位的值。 按位异或通常用于图形运算中。 [例]取整型变量x从位置p开始的n位 unsigned getbits(unsigned x, unsigned p, unsigned n return((x>>(p+1-n))&~(~0<≤n) 第二章数据、运算符、表达式
第二章 数据、运算符、表达式 在按位运算中, •按位或通常用于给字中某些位赋值。 •按位与通常用于取出字中某些位的值。 •按位异或通常用于图形运算中。 [例] 取整型变量x从位置p开始的n位 unsigned getbits(unsigned x, unsigned p, unsigned n) { return ( ( x >> (p + 1 – n)) & ~(~0 << n)); }
a &&B 若A为0,则B不必求值,结果一定为0。 A‖B 若A为非0,则B不必求值,结果一定为非0。 右移,低位移出,对int为算术右移(高位补符号位) ,对 unsigned为逻辑右移(高位补0)。 左移,高位移出,低位补0。 注意整除有别于浮点数相除。 % 整数求余。 逗号表达式,如el,e2顺序求el和e2,以e2值作为整个 表达式结果的值。 如,a=(t=3,t+2),结果为5 (逗号通常还用在变量说明以及函数参数表中,用作 分隔符。) 第二章数据、运算符、表达式
第二章 数据、运算符、表达式 A && B 若A为0,则B不必求值,结果一定为0。 A || B 若A为非0,则B不必求值,结果一定为非0。 >> 右移,低位移出,对int为算术右移(高位补符号位) ,对unsigned为逻辑右移(高位补0)。 << 左移,高位移出,低位补0。 / 注意整除有别于浮点数相除。 % 整数求余。 , 逗号表达式,如e1,e2顺序求e1和e2,以e2值作为整个 表达式结果的值。 如,a = (t = 3, t+2); 结果为5。 (逗号通常还用在变量说明以及函数参数表中,用作 分隔符。)
3.三目表达式(条件表达式) <条件表达式>:=<表达式1>?<表达式2>:<表达式3 先计算表达式1,若其值为非零,则结果是表达式2的值,否则就 是表达式3的值 例 if(a> b) else 等价于: (a>b)? a: b 第二章数据、运算符、表达式
第二章 数据、运算符、表达式 3.三目表达式(条件表达式) <条件表达式> ::= <表达式1> ? <表达式2> : <表达式3> 先计算表达式1,若其值为非零,则结果是表达式2的值,否则就 是表达式3的值。 例: if( a > b) z = a; else z = b; 等价于: z = ( a > b) ? a: b;
4.赋值表达式 赋值表达式左值×赋值运算符>表达工 <赋值运算符>:==+=|=%=1*>=|<∈=&=|=| 赋值表达式可表示为 (el)op=(e2) 其中op为一个双目运算符,其等价于 (el)=(el)op(e2) 如,x+=n;即x=x+n 注意]:这种等价关系并不是完全正确的,因为在(el)op=(e2)中, el只计算一次,而在(el)=(el)op(e2)中却计算两次,例如:a[++订*= n与a[++]=a[++]*n不同,后者跟计算次序有关。 第二章数据、运算符、表达式
第二章 数据、运算符、表达式 4.赋值表达式 <赋值表达式> ::= <左值><赋值运算符><表达式> <赋值运算符> ::= = | += | -=| /= | %= | *= | >>= | <<= | &= | ^= | |= 赋值表达式可表示为: (e1) op= (e2) 其中op为一个双目运算符,其等价于 (e1) = (e1) op (e2) 如, x += n; 即x = x+n; [注意]:这种等价关系并不是完全正确的,因为在(e1) op= (e2)中, e1只计算一次,而在(e1)=(e1)op(e2)中却计算两次,例如:a[++i] *= n与a[++i] = a[++i] * n不同,后者跟计算次序有关