四、表达式
1、什么是表达式?
表达式由一个或者多个操作数构成。更一般情况下,表达式要加上操作数之间的操作【操作符】。
ivec[ size/2 ] * delta
作用在一个操作数上的操作符叫做一元操作符,同理,作用在两个操作数上的叫做二元操作符。一般来说,表达式的结果是右值。
表达式的结果一般由子表达式的计算顺序决定,所以我们要了解操作符的优先级和结合性。
2、算术操作符
操作符 | 功能 | 用法 |
* | 乘 | a*b |
/ | 除 | a/b |
% | 取余 | a%b |
+ | 加 | a+b |
- | 减 | a-b |
如果使用了int类型,那么小数的部分会被裁掉:
int ival1 = 21 / 6; // 3
取余操作不能用于浮点数类型【取余操作后的值一定是整数】:
1、如果都是正数,那么结果为正;
2、如果有负数存在,那么最后取余的正负号由机器决定【不同机器产生结果不同】;
算术异常情况:除以0或者结果溢出【结果的值超过了该类型长度】
显式类型转换:显式地转换对象的数据类型
char byte_value = 0 ;
cout << "byte_value: " << byte_value << endl; //byte_value:
static_cast<int> ( byte_value );
cout << "byte_value: " << byte_value << endl; //byte_value: 0
C++的limits文件提供了内置类型有关的信息,告诉我们它们的取值范围。
浮点数类型在运算是还有精度的问题【受底层数据类型的固有精度影响】:我们使用浮点数会带有小数点,当我们从十进制转换成二进制储存这个数字的时候,由于二进制储存的长度有限,小数部分不能用二进制精确的还原,会存在一定的误差。
3、等于、关系和逻辑操作符
操作符 | 功能 | 用法 |
! | 逻辑非 | !a |
< | 小于 | a<b |
<= | 小于等于 | a<=b |
> | 大于 | a>b |
>= | 大于等于 | a>=b |
== | 等于 | a==b |
!= | 不等于 | a!=b |
&& | 逻辑与 | a&&b |
|| | 逻辑或 | a||b |
这些操作符的结果都是bool类型,返回true或false。
二元运算符潜在的缺点:
1、二元操作符左右运算顺序是未定义的,所以我们在对二元关系符进行操作时,最好是顺序无关的:
if ( ia[ index++ ] < ia[ index ] )
//如果先运算左边,那么左边是ia[0],然后index++,然后右边是ia[1]
//如果先运算右边,那边右边是ia[1],然后左边是ia[0],然后index++
2、如果连续使用的话,可能会出现不对的情况。