CppPrimer–算术运算符
Tags :Cpp
算术运算符的运算对象和求值结果都是右值,
在表达式求值前,小整数类型的运算类型会被提升成较大的整数类型,所有运算对象最终会转成同一类型
一元正/负号运算符(+,-)
一元 正/负 号运算符 返回 运算对象值(提升后)副本
需要注意的是bool
bool x = true;
bool y = -x; // y 是true! x被提升为整数1后取负为-1,然后转回布尔值为true(只有0转为false)
乘,除,求余
除:C++11 规定一律向0取整,即直接切掉小数部分
求余:m%n 要求m,n均为整数且n不为0。当m%n != 0 则 结果与m同号
逻辑运算符
与,或 运算符
注意这两个运算符存在求值顺序
非 运算符
关系运算符
相等性测试与布尔字面值
除非清楚比较对象是布尔类型,否则博使用布尔字面值true 和 false作为运算对象
赋值运算符
赋值运算符左侧必须为 可修改的左值 如:
int i = 0, j = 0, k = 0;
const int ci = i;
//以下语句均非法
1024 = k; //1024为右值
i+j = k; //i+j返回右值
ci = k; //ci不可修改
赋值运算结果是它的左侧运算对象,并且是一个左值。
结果的类型就为左侧运算对象的类型 如
int k =0;
k = 3.14;//结果是int, 值是3
利用初始化列时禁止 收缩转换
int k = {3.14}; //error: 首先要丢去小数点,而且int也不足够大容纳整数部分。因而禁止
int a(3.14); //warning: 只是丢失数据
赋值运算满足右结合律
int i;
double j;
j = i = 3.5; // i = 3 j = 3;
复合赋值运算符较之其等价形式少求一次值。
递增与递减运算符
前置版本: 将运算对象增1后,将改变后的对象作为求值结果,即将对象本身作为左值返回。
后置版本: 将运算对象增1后,求值的结果是运算对象改变之前那个值的副本,
将对象原始值的副本作为右值返回。因而一般不会使用。
均需作用于左值运算对象。
成员访问运算符
注意解引用优先级比 . 运算符要小,注意使用括号。
string s1 = "a string", *p = &s1;
auto size = (*p).size();
条件运算符
形式: cond ? expr1 : expr2;
这是具有求值顺序的运算符
一般形式与嵌套形式
string finalgrade = (grade < 60) ? "fail" : "pass";
finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";
条件运算符优先级较小,使用时注意使用括号
int grade = 59;
string s;
cout << endl;
cout << s << endl;
cout << ((grade < 60) ? "fail" : "pass"); //prints fail;
s = cout << (grade < 60) ? "fail" : "pass"; //print 1; and assign "fail" to s
cout << grade < 60 ? "fail" : "pass"; //error:compares cout to 60
位操作符
用作整数类型处理,就是当做二进制数了操作其位数。这在 《深入理解计算机系统》Chapter2有详细讲解。
sizeof运算符
sizeof 返回 一条表达式或者一个类型名字所占的字节数 为size_t的常量表达式。
满足右结合律。
逗号运算符
含有两个运算对象,从左到右依次求值(具有求值顺序)
先对左侧求值,然后结果丢弃,再对右侧求值,返回右侧的结果
int x = 1;
int y = 2;
int z = 0;
z = (x++, ++y);
cout << z << endl;//z = 3;