第五章 表达式
1、高优先级的操作符要比低优先级的结合得更紧密。
2、某些算术表达式的求解结果未定义,其中一部分由数学特性引起,例如除零操作;其他则归咎于计算机特性。个人理解,计算机特性是指计算机的位(32位/64位)。
3、在解除法(/)和求模(%)时,如果两个操作数中只有一个操作数为负数,这两种操作的结果取决于机器:求模结果的符号要取决于机器,除法操作的值则是负数(或零)。
//习题5.7
#include "stdafx.h"
#include <iostream>
int main(int argc, char* argv[])
{
int m_cin;
while(std::cin >> m_cin && m_cin != 42)
{
//do something
}
return 0;
}
//习题5.8
if(a>b && b>c && c>d){//do something}
4、对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整型操作数。
5、一般来说,标准库提供的bitset操作更直接、更容易阅读和书写、正确使用的可能性更高。而且,bitset对象的大小不受unsigned数的位数限制。通常来说,bitset优于整型数据的低级直接位操作。
这段话的意思就是说,当要进行位操作的时候,最好使用bitset类型。
#include <bitset>
using std::bitset;
int main(int argc, char* argv[])
{
bitset<30> bitset_quiz1; //bitset_quiz1的每一位都默认为0值
unsigned long int_quiz1=0;
//设置第27位为1
bitset_quiz1.set(27);
int_quiz1 |= 1UL<<27;
//从新设置第27位为0值
bitset_quiz1.reset();
int_quiz1 &= ~(1UL<<27);
//检验第27位到底是1还是0
bool status ;
status = bitset_quiz1[27];
status = int_quiz1 & (1UL<<27);
return 0;
}
//习题5.9
unsigned long ul1=3,ul2=7;
unsigned long result1 = ul1 & ul2;
unsigned long result2 = ul1 && ul2;
unsigned long result3 = ul1 | ul2;
unsigned long result4 = ul1 || ul2;
cout << result1 << endl
<< result2 << endl
<< result3 << endl
<< result4 << endl;
运行结果为:
//习题5.10
bitset<30> bitset_quiz1; //bitset_quiz1的每一位都默认为0值
cout << bitset_quiz1[27] << endl;
cout << bitset_quiz1 << endl;
bitset_quiz1[27] = 1;
cout << bitset_quiz1[27] << endl;
cout << bitset_quiz1 << endl;
bitset_quiz1[27] = 0;
cout << bitset_quiz1[27] << endl;
cout << bitset_quiz1 << endl;
//习题5.11
int i;
double d;
d=i=3.5;
cout << i << endl << d << endl;
i=d=3.5;
cout << i << endl << d << endl;
运行结果为:
6、只有在必要时才使用后置操作符。因为前置操作符需要做的工作更少。
vector<int> ivec;
int cnt=10;
while(cnt > 0)
ivec.push_back(cnt--);//先返回cnt的值,然后cnt再减一
需要注意的是:解应用和自 增操作的组合。
vector<int>::iterator iter = ivec.begin();
while(iter != ivec.end)
cout << *iter++ << endl;
/*
自增操作符的优先级高于解引用,故*iter++等效于*(iter++)
*/
//习题5.18
vector<string*> ivec;
string str;
int i=10;
while(i > 0)
{
cin >> str;
string* ptr = new string;
*ptr = str;
ivec.push_back(ptr);
i--;
}
for(vector<string*>::iterator iter = ivec.begin(); iter != ivec.end();++iter)
{
cout << **iter << " length of string is " << (**iter).size() << endl;
}
for(vector<string*>::iterator it = ivec.begin(); it != ivec.end();++it)
{
delete *it;
}
//习题5.20
int i=0,j=0;
cin >> i;
cin >> j;
cout << (i < j ? i : j) << endl;
//习题5.21
vector<int> ivec;
int value;
int i=10;
while (i)
{
cin >> value;
ivec.push_back(value);
i--;
}
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{
*iter = (*iter % 2 ? *iter * 2 : *iter);
cout << *iter << ' ';
}
7、sizeof表达式是编译时常量
sales_item item,*pitem;
cout << "sizeof(sales_item) is " <<sizeof(sales_item) << endl;//24
cout << "sizeof(item) is " << sizeof(item) << endl;//24
cout << "sizeof(pitem) is " << sizeof(pitem) << endl;//4
cout << "sizeof(*pitem) is " << sizeof(*pitem) << endl;//24
sales_item &refitem = item;
cout << "sizeof(&refitem) is " << sizeof(&refitem) << endl;//4
cout << "sizeof(refitem) is " << sizeof(refitem) << endl;//24
char* p = new char[10];
cout << "sizeof(p) is " << sizeof(p) << endl;//4
cout << "sizeof(*p) is " << sizeof(*p) << endl;//1
char m_array[10] = {0};
cout << "sizeof(m_array) is " << sizeof(m_array) << endl;//10
cout << "sizeof(*m_array) is " << sizeof(*m_array) << endl;//1
cout << "sizeof(char) is " << sizeof(char) << endl;//1
cout << "sizeof(4) is " << sizeof(4) << endl;//4
8、new和delete必须成对的出现,不然,必会造成内存泄漏。
string* pps = new string();
delete pps;
pps = NULL;
//习题5.30
vector<string> svec(10);
vector<string> *pvec1 = new vector<string>(10);
//vector<string> **pvec2 = new vector<string>(10);//err
vector<string> *pv1 = &svec;
vector<string> *pv2 = pvec1;
//delete svec;//err
delete pvec1;
//delete[] pvec2;//err
delete pv1;//err
delete pv2;//err
9、显式转换 / 强制类型转换: static_cast,dynamic_case,const_cast,reinterpret_cast
避免使用强制类型转换!