C++学习笔记——表达式、语句、函数

来源:互联网 发布:淘宝账号怎么快速升心 编辑:程序博客网 时间:2024/04/30 11:20

这三节的内容特别多但是比较基础,所以我把他们放在了一起,把一些比较重要(个人认为的)的一些知识点记录下来,以便以后查阅。

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);  //返回函数指针
  • 默认实参:通常在函数声明中指定默认实参,函数的定义就不用指定默认实参了,全局变量可以作为默认实参但必须初始化了。

这一节的内容比较零散,希望对大家有帮助,继续加油!!!!

原创粉丝点击