0%

C++_表达式

1、基础内容

表达式是由一个或多个运算对象组成,对表达式求值得到的是一个结果,字面值和变量时最简单的表达式。

左值和右值

当一个对象被用作右值时,使用的是该对象的值;而被用作左值时,使用的时对象的内存。

  • 赋值运算符需要一个非常量左值为其左侧运算对象
  • 取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,该指针为右值
  • 解引用求值结果为左值

求值顺序

部分运算符是没有明确指明执行顺序的,例如<<运算符:

1
cout<<i<<""<<++i;

++i和i没有明确的先后关系,因此编译器可能做出任何行为。

当多个函数会影响同一对象时,当同时调用这些函数时,调用函数的顺序也没有明确的先后关系。

2、算术运算符

bool类型

bool类型原则不应参与运算,在运算时会自动转化为int型的1,只要计算结果不为0,都将返回ture

优先级

C++大部分同优先级运算都满足从左至右的规律,赋值则相反

递增运算

C++中,非必要不使用后置递增/减符(i++/i—),因为前置运算为将对象本身作为左值返回,而后置则要额外的空间存储原始值,并将这个额外存储的原始值副本作为右值返回,因此,使用后置操作会消耗更多内存,这在相对复杂的工作中是消耗巨大的。

位操作

关于符号位的处理没有明确规定,因此位运算最好用来处理无符号类型

3、类型转换

C++的类型转换格式不同于C:

1
cast-name<类型>(表达式)

最常用的cast-name为static_castconst_cast

static_cast

任何有明确定义的类型转换(除了底层const)都可以使用static_cast

例:

1
2
void *p = &d;//d不能为常量(底层const)
double *dp = static_cast<double*>(p);

const_cast

专用于改变底层const,其作用为改变const性质

1
2
const char* pc;
char *p=const_cast<char*>(pc);

需要注意,可以有以下用法:

1
2
char* pc;
char *p=const_cast<const char*>(pc);