这三节的内容特别多但是比较基础,所以我把他们放在了一起,把一些比较重要(个人认为的)的一些知识点记录下来,以便以后查阅。
1.表达式
运算对象的求值顺序与优先级和结合律无关(运算对象可按任意顺序求值),例如:f() + g() * h() + j()
- 优先级规定,先算乘法后算加法
- 结合律规定,f()的返回值先与g()和h()的乘积相加,所得值再与j()的返回值相加。
- 对于这些函数顺序的调用顺序是没有明确的规定
C++新标准规定商一律先0取整(即直接切除小数部分)
对于除法和取模的运算规则
- (-m) / n 和 m / (-n) 都等于 -(m/n)
- m%(-n) 等于 m%n , (-m) % n 和 (-m)%(-n) 等于 -(m%n)
相等与布尔值的碰撞
//只有当 val 等于 1 时才成立,因为布尔值true转换成 val 的类型
if(val == true)
{
}
- 赋值运算满足的是右结合律
int ival, *pval;
ival = pval = 0; //错误,不能把指针赋值给int
后置递增运算符优先级高于解引用运算符
位操作符
- 与 &:同为 1 才为1
- 或 |:只要一个为 1 就为 1
- 异或 ^: 相同为 0 ,不同为 1
sizeof 运算符
- sizeof运算不会实际求运算对象
- 对引用类型使用sizeof运算得到被引用对象所占空间大小
- 对指针执行sizeof运算得到指针本身所占空间大小非所指对象
- 对解引用指针执行sizeof运算得到指针所指对象所占空间大小,指针不需要有效
- 对数组操作获得整个数组所占空间大小
- 对string对象或vector对象执行sizeof运算返回该类型固定部分的大小,不会计算对象中的元素占用了多少对象。(得到的是string这个类本身占据的空间的大小而不字符串的大小)
2.语句
块:是指用花括号括起来的(可以为空)语句和声明的序列。
一个块就是一个作用域。
break:break语句用于终止离他最近的 while、 do while、 for、 switch,语句并从这些语句之后的第一条语句可是执行。
continue:终止最近循环中的当前迭代并立即开始下一次迭代,适用于while、do while、for循环内部。
try和catch: 将一段可能抛出异常的语句序列放在块里构成 try 语句块,catch处理代码抛出的异常。
throw:存在于语句块中,负责抛出异常并将控制权转移到相关的catch语句中
若一段程序没有 try 语句块且发生了异常,系统会调用 terminate 函数并终止当前程序的执行
try {
int a = 1;
if (a)
{
throw runtime_error("input erro");
}
}
catch (runtime_error err) {
cout << err.what() << endl;
}
3.函数
局部变量会隐藏全局变量,同时局部变量还会隐藏外层作用域中同名的其他申明(包括函数申明。
具有返回值的函数,在最后的循环语句中应有一条return语句,如没有该程序是错误的,因为有部分编译器无法发现此类错误。
不要返回局部对象的指针或引用,因为函数调用完成,它所占的空间会被释放
函数不能返回数组,但能返回数组的指针或引用
函数重载和const形参
//const指针重载
int add(const int* a);
int add(int* a);
//const引用重载
int add(const int& a);
int add(int& a);
不同的作用域是无法重载函数的,因为在C++语言中,名字查找发生在类型检查之前
constexpr 函数的要求:返回类型,字面值且只有一个。形参类型,字面值
函数指针
int f(int num);
int (*pf)(int num); //pf的括号必不可少
pf = &f;
- 当需要返回函数指针时写成后置式
auto f(int num) -> int (*)(int num); //返回函数指针
- 默认实参:通常在函数声明中指定默认实参,函数的定义就不用指定默认实参了,全局变量可以作为默认实参但必须初始化了。
这一节的内容比较零散,希望对大家有帮助,继续加油!!!!