Skip to content

Latest commit

 

History

History
73 lines (54 loc) · 2.3 KB

09-表达式.md

File metadata and controls

73 lines (54 loc) · 2.3 KB

表达式

表达式由一个或多个运算对象组成,对表达式求值将会得到一个结果。


避免陷阱

if(i =j){//判断条件是 i的值

}
if(i == j){//判断条件是i == j

}

sizeof

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


语句

  • if语句
  • while
  • 传统for
  • 范围for
  • switch:switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。
  • goto:goto语句的作用是从goto语句无条件跳转到同函数内的另一条语句。不要在程序中使用goto语句。
  • TRY:用于处理异常。

显式类型转换

有时候需要将一种数据类型强转为其他类型。

命名的强制类型转换

一个命名的强制类型的形式如下:

cast-name<type>(expression);

type是转换的目标类型,而expression是被转换的值。

cast-name包括

  • static_cast:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast
  • dynamic_cast:运行时的类型识别,通常在基类和派生类之间转换时使用
  • const_cast:只能改变运算对象的底层const
    • 将常量转换为非常量,我们称为去掉const性质
    • 如果一个对象本身不是const的,去掉const性质后获得的写权限是合法的
    • 如果一个对象是const的,使用const_cast执行写操作就会产生未定义的效果
  • reinterpret_cast:通常为运算对象的位运算模式提供较低层次的重新解释。用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数
int *p
char *pc = reinterpret_cast<char*>(p)

旧式的类型转换

早期版本的c++中,包含两种强制类型转换语法:

  • type(expr) 函数形式的类型转换
  • (type)expr c风格的类型转换

旧式的类型转换分别具有static_cast、const_cast、reinterpret_cast相似的行为,旧式的转换类型可以替换成命名强制类型转换,如果换成static_cast、const_cast 合法,则其行为与对应的命名转换一致,否则旧式类型转换执行与reinterpret_cast相似的行为。

int *ip;
char *pc = (char*)ip;

效果与reinterpret_cast一样。