C++进阶⑤:运算符优先级、四种强制类型转换、accumulate、bit_xor()、string.size()返回无符号整数、int和unsigned的转换

1 运算符优先级

运算符优先级

初等运算符->单目运算符->算数运算符->关系运算符->逻辑运算符->条件运算符->赋值运算符->逗号运算符;

2 四种强制类型转换

四种强制类型转换
static_cast<>() / dynamic_cast<>() / const_cast<>() / reinterpret_cast

3 accumulate

int sum = accumulate(vec.begin() , vec.end() , 42);
string sum = accumulate(v.begin() , v.end() , string(" "));  

accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值。
accumulate函数将它的一个内部变量设置为指定的初始值,然后在此初值上累加输入范围内所有元素的值。accumulate算法返回累加的结果,其返回类型就是其第三个实参的类型。

4 bit_xor()

bit_xor()
异或的函数对象类。
可用作 transform 或者 accumulate等的操作符。
类似的还有与操作bit_and 、或操作 bit_or。
#include < functional >

5 string.size()函数的返回值是无符号类型整数。

C++中string类size() length()函数的返回值是无符号类型整数,unsigned int。
①不能直接用max/min函数比较int类型和size()返回值

int a = 0;
string word = "abc";
a = max(a, word); /error,word是unsigned int类型,不能与int类型比较。

②当int和unsigned int类型比较时,会默认把int类型转换为unsigned,如果int型变量是负数,会出现错误。

int a = -1;
string word = "abc";
while (a < word.size()) {
...} /error,把int类型的-1转换为unsigned类型会变成4294967295,永远无法进入循环

负数在计算机中存的是它的补码,对于-1:
原码是 1000 0000 0000 0000 0000 0000 0000 0001
补码 是 1111 1111 1111 1111 1111 1111 1111 1111 ,即0xFFFFFFFF
-1转换成unsigned无符号的时候,会直接赋值给unsigneed
所以-1转换后变成1111 1111 1111 1111 1111 1111 1111 1111,即0xFFFFFFFF,即2^32 - 1
2^32 = 4294967296
C++进阶⑤:运算符优先级、四种强制类型转换、accumulate、bit_xor()、string.size()返回无符号整数、int和unsigned的转换_第1张图片

你可能感兴趣的:(C++进阶,c++,开发语言,后端)