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
避免使用强制类型转换!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值