文章目录
一、概述
二、内容
4.1、基础
一元运算符(unary operator):取地址符(&)和解引用()
二元运算符 (binary operator): 相等运算符(==)和乘法运算符()
首先理解运算符的优先级、结合律以及运算对象的求值顺序。
运算对象的转换(类型转换)
重载运算符 :例如IO库中>>和<<,以及命名空间引用string :: 和 vector<> 、迭代器等
难点:decltype
优先级和结合律
#include <iostream>
using std::cout; using std::endl;
int main()
{
cout << 6 + 3 * 4 / 2 + 2 << endl;
// parentheses in this expression match default precedence and associativity
cout << ((6 + ((3 * 4) / 2)) + 2) << endl; // prints 14
int temp = 3 * 4; // 12
int temp2 = temp / 2; // 6
int temp3 = temp2 + 6; // 12
int result = temp3 + 2; // 14
cout << result << endl;
// parentheses result in alternative groupings
cout << (6 + 3) * (4 / 2 + 2) << endl; // prints 36
cout << ((6 + 3) * 4) / 2 + 2 << endl; // prints 20
cout << 6 + 3 * 4 / (2 + 2) << endl; // prints 9
return 0;
}
4.2、算术运算符
#include <iostream>
using std::cout; using std::endl;
int main()
{
cout << -30 * 3 + 21 / 5 << endl;
cout << -30 + 3 * 21 / 5 << endl;
cout << 30 / 3 * 21 % 5 << endl;
cout << 30 / 3 * 21 % 4 << endl;
cout << -30 / 3 * 21 % 4 << endl;
cout << 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2 << endl;
return 0;
}
4.3逻辑和关系运算符
4.4赋值运算符
C++11中允许用花括号进行初始值列表作为赋值语句的右侧运算对象
复合赋值运算符
4.5、递增和递减运算符
++i;
i++;
#include <iostream>
using std::cout; using std::endl;
int main()
{
int i = 0, j;
j = ++i; // j = 1, i = 1: prefix yields the incremented value
cout << i << " " << j << endl;
j = i++; // j = 1, i = 2: postfix yields the unincremented value
cout << i << " " << j << endl;
return 0;
}
4.6成员访问运算符
4.7、条件运算符
#include <iostream>
using std::cin; using std::cout; using std::endl;
#include <string>
using std::string;
#include <vector>
using std::vector;
vector<unsigned> grades;
int main()
{
unsigned i;
while (cin >> i)
grades.push_back(i);
for (auto grade : grades) { // for each grade in grades
// set the initial grade as pass or fail
string finalgrade = (grade < 60) ? "fail" : "pass";
finalgrade = (grade > 90) ? "high pass"
: (grade < 60) ? "fail" : "pass";
cout << grade << " " + finalgrade << endl;
}
return 0;
}
4.8、位运算符
4.9、sizeof运算符
#include "Version_test.h"
#include <iostream>
using std::cout; using std::endl;
#include "Sales_data.h"
int main()
{
Sales_data data, *p;
sizeof(Sales_data); // size required to hold an object of type Sales_data
sizeof data; // size of data's type, i.e., sizeof(Sales_data)
sizeof p; // size of a pointer
sizeof *p; // size of the type to which p points, i.e., sizeof(Sales_data)
sizeof data.revenue; // size of the type of Sales_data's revenue member
#ifdef SIZEOF_MEMBER
sizeof Sales_data::revenue; // alternative way to get the size of revenue
#else
sizeof Sales_data().revenue; // use an object
#endif
cout << "short: " << sizeof(short) << "\n"
<< "short[3]: " << sizeof(short[3]) << "\n"
<< "short*: " << sizeof(short*) << "\n"
<< "short&: " << sizeof(short&) << endl;
cout << endl;
cout << "int: " << sizeof(int) << "\n"
<< "int[3]: " << sizeof(int[3]) << "\n"
<< "int*: " << sizeof(int*) << "\n"
<< "int&: " << sizeof(int&) << endl;
cout << endl;
cout << "Sales_data: " << sizeof(Sales_data) << "\n"
<< "Sales_data[3]: " << sizeof(Sales_data[3]) << "\n"
<< "Sales_data*: " << sizeof(Sales_data*) << "\n"
<< "Sales_data&: " << sizeof(Sales_data&) << endl;
#ifdef SIZEOF_MEMBER
cout << "Sales_data::revenue: " << sizeof Sales_data::revenue << "\n"
#else
cout << "Sales_data().revenue: " << sizeof Sales_data().revenue << "\n"
<< "data.revenue: " << sizeof data.revenue << endl;
#endif
int x[10];
int *ip = x;
// number of elements in x
cout << sizeof(x)/sizeof(*x) << endl;
// divides sizeof a pointer by sizeof an int
cout << sizeof(ip)/sizeof(*ip) << endl;
return 0;
}
4.10、逗号运算符
#include <cstddef>
using std::size_t;
#include <vector>
using std::vector;
#include <iostream>
using std::cout; using std::endl;
int main()
{
vector<int> ivec; // empty vector
int cnt = 10;
// add elements 10 . . . 1 to ivec
while (cnt > 0)
ivec.push_back(cnt--); // int postfix decrement
auto iter = ivec.begin();
// prints 10 9 8 . . . 1
while (iter != ivec.end())
cout << *iter++ << endl; // iterator postfix increment
vector<int> vec2(10, 0); // ten elements initially all 0
cnt = vec2.size();
// assign values from size . . . 1 to the elements in vec2
for(vector<int>::size_type ix = 0;
ix != vec2.size(); ++ix, --cnt)
vec2[ix] = cnt;
iter = vec2.begin();
// prints 10 9 8 . . . 1
while (iter != vec2.end())
cout << *iter++ << endl; // iterator postfix increment
return 0;
}
4.11、 类型转换
4.12 运算符优先级
4.13、小结
4.14、术语表