C++ Primer Plus 随记(第五、六、七章)

 

1、for循环:① 设置初始值;② 执行测试,判断循环是否继续执行;③ 执行循环体;④ 更新用于测试的值

2、x+15 表达式不会修改 x 的值,将计算出一个新的值。++x+15 将会使得 x 的值加 1。

3、递增运算符(++)和递减运算符(--) 实现简约方便的变量加减 1。     

其前缀版本和后缀版本的区别在于:前缀“使用前修改”,后缀“使用后修改。       如果在同一条语句中对同一值多次递增或者递减可能造成非预期的结果。

前缀版本:将值加 1 然后返回;后缀版本先复制一个副本并将其加 1 ,返回副本。(对于内置类型,两者没有区别;对于用户定义的类型,前缀版本的效率更高)

4、逗号运算符的运算优先级最低。  因此语句 A=1,21; 等同于 (A=1),21;将1赋值给A, 21不起作用。   语句A=(1,21);将21赋值给A,1不起作用。

5、C风格的字符串之间不能使用比较运算符进行比较,应当使用比较函数。

C++中的字符串类(String对象)重载了比较运算符,可以直接使用运算符比较字符串。

6、while循环:① 测试条件;② 执行循环体

7、类型别名:① #define BYTE char    预处理器在编译程序时用 char 替换所有的 BYTE 实现别名的功能;② typedef char byte;    

相比之下 typedef 方法实现的效果更好,#define方式只是最简单的替换;而typedef方法不会出现这种问题。如下代码

#define FLPOAT_POINTER  float *       
FLPOAT_POINTER pa,pb;  
实际上被转换为   float * pa,pb;

8、do while循环① 执行循环体;②测试条件        至少运行一次

9、基于范围的for循环

double prices[5] = {4.99,10.99,6.87,7.99,8.49}; 
for(double x:prices){
    x*=0.8;
}

10、逻辑运算符:  或 ||,与 &&,按位或  | ,按位与 & ,非  !。

三目运算符: ?:          语句1?语句2:语句3;    若 语句1 为真,执行语句2,否则执行语句3。
whitch语句(多个选项时效率更高,代码更简单),替换多个 if else if else 结构(更加通用)的语句。

switch(interger-expression){
    case lable1: statement(a); break;
    case lable2: statement(b); break;
    defaule:     statement(c);
}

其中break语句为必须的,否则将会继续执行括号中的其他语句。

11、函数: ① 函数定义-函数主体;②函数原型(编译器依此判定参数是否出现错误);③调用函数。

#include <iostream>
void cheers(int);    // 函数原型 -告诉编译器返回值、参数的信息
int main(){
    ...
    cheers(5);    // 函数调用
    ...
}
void cheers(int n){    // 函数定义
    ...
}

12、函数参数与按值传递:上述参数传递的时候创建一个名为 n 的整数副本,main函数中的数据不会受到影响。

13、函数中的数组:

数组声明使用数组名来标记存储位置;对数组名使用sizeof得到整个数组的长度(按字节);地址运算符(&)获取整个数组的地址。

数组作为参数实际上传递的是:数组的地址、数据的类型和数量。(本质上仍是安置传递)       还有一种按引用传递,是传递变量的地址。

14、指针与const

① 让指针指向常量对象,防止使用该指针修改指向的值:int age=20; const int * pt=&age;

② 将指针本身声明为常量,防止改变指针指向的位置: int * const finger=&age;

15、函数和二维数组

int data[3][4] = {{1,2,3,4}, {9,8,7,6}, {2,4,6,8}};
int total = sum(data, 3); 

其中sum的函数原型如下

int sum(int (*ar2)[4], int size);
//或者
int sum(int ar2[][4], int size);

其中第一个参数指代为指针,该指针指向由4个int 组成的数组,表明了二维数组的列数,第二个参数表明了二维数组的行数。

16、函数和C-风格字符串

参数的传递方式:①char数组;②引号括起来的字符串常量;③设置为字符串的地址的 char 指针。

返回值:返回字符串时,可以只返回字符串的地址,提高效率。

C-风格的字符串内置结束字符,位于结尾处,因此可以与 char 数组进行区分。

17、函数和结构体(类对象)

按值传递(pass-by-value)创建副本;引用传递(pass-by-reference),需要保证原结构(对象)不被修改,因此使用const。

18、递归-自己调用自己(根据是否满足条件)

19、函数指针

函数的地址时存储器机器语言代码的内存的开始地址。

函数指针传递:

①获取函数的地址:函数名即可。 即 think()是函数,think就是该函数的地址。  函数名代表函数地址作为参数, 函数代表函数的返回值作为参数。

②声明一个函数指针:

double pam(int); // 函数声明
double (*pf) (int); // 函数指针声明,其中 (*pf)为函数, pf为函数指针。

③使用函数指针来调用函数

pf = pam; // 函数指针指向 pam() 函数
double x = pam(4);
double y = (*pf)(4);  // 效果同上一样  (明确指出使用函数指针)
double y = pf(4);     // 效果同上一样

 函数指针也可以像普通指针一样,组成数组。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值