C++学习笔记7:表达式和语句

补充C++基础笔记。

表达式

  1. 非法的赋值语句
1024 = k;   //错误:字面值是右值
i + j = k;   //错误:算术表达式是右值
//赋值符满足右结合律
  1. 赋值运算符的优先级低于关系运算符的优先级 -> 条件语句中复制部分通常应该加上括号。
  2. 除非必须,否则不用递增递减运算符的后置版本
  3. 后置递增运算符 优先级高于 解引用运算符,因此*ptr++相当于*(ptr++)

类型转换

  1. 隐式类型转换:
    (1) 数组转换成指针:在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针;
    不会发生转换:被用作decltype关键字的参数,或者作为取地址符(&)、sizeof以及typeid等运算符的运算对象时。
    (2) 指针的转换:常量整数值0或者字面值nullptr能转换成任意指针类型;指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*;
    (3) 算术类型除0外转换成布尔类型为true;
    (4) 允许将指向非常量类型的指针转换成指向相应的常量类型的指针;
    (5) istream类型:
string s, t = "a value";  //字符串字面值转换成string类型
while (cin >> s)  //while的条件部分把cin转换成布尔值

如果最后一次读入成功,转换得到的布尔值时true,否则转换得到的布尔值是false。

  1. 显式转换:强制类型转换
    cast-name <type> (expression);
    其中,cast-name是static_cast、dynamic_cast、const_cast和reinterpret_cast中的一种。

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

double slope = static_cast<double>(j) / i;  //进行强制类型转换以便执行浮点数除法

void* p = &d;  //正确:任何非常量对象的地址都能存入void*
double *dp = static_cast<double*>(p);  //正确:将void*转换回初始的指针类型

const_cast:只能改变运算对象的底层const

const char *pc;
char *p = const_cast<char*>(pc);  //正确:但是通过p写值是未定义的行为

常量对象改成非常量:去掉const性质(cast away the const),编译器不再组织我们对对象执行写操作,但对象不是常量的情况下,使用const_cast执行写操作会产生未定义的后果。

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

语句

  1. 范围for语句
    for (declaration : expression) statement
  2. 跳转语句:break、continue、goto[不建议用]、return
    break: 负责终止离它最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。
    continue: 终止[for、while、do while]循环的当前迭代并立即开始下一次迭代。
  3. try语句块和异常处理 -> throw表达式和try语句块
    (1) throw表达式
Sales_item item1, item2;
cin >> item1 >> item2;
if (item1.isbn() != item2.isbn())
	throw runtime_error("Data must refer to same ISBN");
cout << item1 + item2 << endl;

runtime_error是标准库异常类型的一种,定义在stdexcept头文件中。
(2) try语句块

try {
	program_statements
} catch (exception-declaration) {
	handler-statements
} catch (exception-declaration) {
	handler-statements
} //...

try中抛出异常,如[runtime_error] – catch(runtime_error)捕获异常。
在这里插入图片描述

参考资料:
  1. C++ primer. 第五版.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值