C++Primer筆記4(第五章-表達式)

第五章 表達式



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
避免使用強制類型轉換!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章