c++primer之表达式

一、需要右值的地方可以用左值来代替,但不能把右值当成左值使用,当一个左值被当成右值使用时,实际上使用的是它的内容

二、当一元正运算符作用于一个指针或算术值时,返回运算对象值的一个副本

三、bool b = true; bool b2 = -b;布尔类型变量b的值为真,参与运算时将被提升为整数1, 对它求负的结果为-1,将-1换回布尔值并将其作为b2的初始值,转换成布尔值后结果为1

四、递增或递减前置版本和后置版本: 前置首先将运算对象加1,然后将改变后的对象最为求值结果。后置首先将运算对象加1,但求值结果是运算对象改变之前那个值的副本。优先使用前置版本,因为后置版本需要将原始值存储起来以便返回这个未修改的内容,对于不需要修改前的值,就是一种浪费

五、点运算符获取对象的一个成员,箭头运算符ptr->mem 等价于 (*ptr).mem

六、可以使用sizeof获取数组元素数量: constexpr size_t sz = sizeonf(arr) / sizeof(*arr)

七、逗号运算符首先对左侧的表达式求值,然后将求值结果丢弃掉,逗号运算符真正的结果是右侧表达式的值

八、如果一个运算对象是无符号类型,另一个运算对象是带符号类型,而且其中的无符号类型小于带符号类型,那么带符号的运算对象转换成无符号的。如果带符号类型大于无符号类型,此时依赖于机器,如果无符号类型的所有值都能存在该带符号类型中,则无符号类型的运算对象转换成带符号类型,如果不能,那么带符号类型的运算对象转换成无符号类型

九、数组转换成指针: 大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针

十、指针转换:常量整数值0或字面值nullptr能转换成任意指针类型。指向任意非常量的指针能转换成void*。指向任意对象的指针能转换成const void*

十一、转换成常量: 允许将指向非常量类型的指针转换成指向相应的常量类型的指针,引用也这样

十二、类类型定义的转换:类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换

十三、强制类型转换:

1、cast-name<type>(expression): type是转换的目标类型,expression是要转换的值,cast-name是sataic_cast、dynamic_cast、const_cast、reinterpret_cast种的一种

2、type(expression)

3、(type)expression

 

 

bool b = true;
	// 布尔类型变量b的值为真,参与运算时将被提升为整数1, 对它求负的结果为-1,
	// 将-1换回布尔值并将其作为b2的初始值,转换成布尔值后结果为1
	bool b2 = -b;
	cout << b << endl;
	cout << b2 << endl;

	int i = 1;
	// 前置首先将运算对象加1,然后将改变后的对象最为求值结果
	// 优先使用前置版本,因为后置版本需要将原始值存储起来以便返回这个未修改的内容,对于不需要修改前的值,就是一种浪费
	int j = ++i;
	cout << i << "==" << j << endl; // 2 == 2

	int x = 1;
	// 后置首先将运算对象加1,但求值结果是运算对象改变之前那个值的副本
	int y = x++;
	cout << x << "==" << y << endl; // 2 ==  1

	//后置递增运算符的优先级高于解引用运算符,因此*pbeg++等价于*(pbeg++)
	// pbeg++把pbeg的值加1,然后返回pbeg的初始值的副本作为其求值结果
	// 因此解引用运算符的运算对象是pbeg未增加之前的值
	// 这条语句输出pbeg开始时指向的那个元素,并将指针向前移动一个位置
	// 后置递增运算符返回初始的未加1的值,如果返回的是加1之后的值,解引用该值将产生错误的结果
	// 不但无法输出第一个元素,还可能试图解引用一个根本不存在的元素
	vector<int> arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	auto pbeg = arr.begin();
	while (pbeg != arr.end() && *pbeg >= 0) {
		cout << *pbeg++ << endl;
	}

	// 点运算符获取对象的一个成员
	// 箭头运算符ptr->mem 等价于 (*ptr).mem
	string s1 = "a string", * sp = &s1;
	auto s1n = s1.size();
	cout << s1n << endl; // 8
	s1n = (*sp).size();
	cout << s1n << endl; // 8
	s1n = sp->size();
	cout << s1n << endl; // 8

	// 逗号运算符首先对左侧的表达式求值,然后将求值结果丢弃掉,逗号运算符真正的结果是右侧表达式的值
	vector<int>::size_type cnt = arr.size();
	for (vector<int>::size_type ix = 0; ix != arr.size(); ++ix, --cnt) {
		arr[ix] = cnt;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值