第五章 表達式
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
避免使用強制類型轉換!