C++表达式

一、左值和右值

在c里,左值和右值根本区别就在于,左值是可以被赋值的,而右值不能。
在c++里就大有文章了,最基本的区别在于,左值应该是有地址的,存储在内存中的某个确定位置的,而右值并不在内存中占有确定位置的表达式。
具体可参见(https://blog.csdn.net/xuwqiang1994/article/details/79924310
(但我个人对里面讲的还不是很理解,先码住,以后再回来看)

二、sizeof运算符

sizeof运算符返回一条表达式或一个类型名字所占的字节数。

sizeof(类型名字)
sizeof 表达式

对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof,再将结果求和。(即对数组进行sizeof,并不会被当成是指针处理)
对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算该元素占用了多少空间

char ia[5];
constexpr size_t sz=sizeof(ia)/sizeof(*ia);//一种可以求得数组元素数量的方法。
int arr[sz];//正确

三、一些隐式类型转换

①数组转换成指针:在很多用到数组的表达式中,数组会被当成是指针处理,但当数组被用作decltype关键字的参数,或者作为取地址符&,sizeof及typeid等运算符的运算对象时,或用一个引用初始化数组时,则数组还是数组。
②在条件语句的括号里,算术类型或指针类型回向布尔类型自动转换。while(cin>>s)//这里实际检查的是istream类型的值,IO库里定义了从istream向布尔值转换的规则,若读入成功为true,反之false

四、显式转换

1、命名的强制类型转换

形式:
cast-name<type>(expression);

type是转换的目标类型,而expression是要转换的值,如果type是引用类型,则结果是左值。而cast-name是static_cast, dynamic_cast, const_cast, reinterpret_cast中的一种.

static_cast, 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

int i=5,j=6;
double slope =static_cast<double>(j)/i;

static_cast对于编译器无法自动执行的类型转换非常有用。例如,可以用static_cast找回存在于void*指针。
void *p=&d;// 任何非常量对象的地址都能存入void*
double dp = static_cast<double *>(p);//将void * 转换回初始的指针类型(前提:指针原先所指的类型必须就是double)

const_cast, 只能改变运算对象的底层const,可以去掉运算对象的底层const

const char*pc;
char *p =const_cast<char *>(pc)//正确,但pc并未指向对象,所有通过p写值是未定义行为,解引用p去赋值会error。

一些例子:
const char *cp;
char *q= static_cast<char *>(cp);//错误,static_cast不能改变const性质
static_cast<string>(cp);//正确,将字符串字面值转换成string类型
const_cast<string>(cp);//错误,const_cast只改变常量属性

reinterpret_cast, 通常为运算对象的位模式提供较低层次上的重新解释。本质上依赖机器,要想安全使用,必须对涉及的类型和编译器实现转换的过程都非常了解,这里先不掌握。

2、旧式的强制类型转换

type (expr) //函数形式的强制类型转换
(type) expr //c语言风格的强制类型转换

根据所涉及的类型不同,旧式的强制类型转换分别具有与const_cast, static_cast或reinterpret_cast相似的行为。当我们在某处执行旧式的强制类型转换时,如果换成const_cast, static_cast也合法,则其行为与对应的命名转换一致,若不合法,则其实现的功能相等于reinterpret_cast。

换而言之,在C++,这些强制类型转换更加明确了,是有利于我们去实际调试,排错、使用的。

再插一点try语句部分的内容:

try{
    program-statements
    }catch (exeception-declaration) {
    handelr-statements
    }catch (exeception-declaration) {
     …
    }

其中program-statements是可能会出现error的语句
exeception-declaration是错误的类型
handelr-statements是出现这种错误后,怎么处理。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注