C++学习之路(九)

第六章 分支语句和逻辑运算符

1.逻辑表达式:
(1)逻辑OR运算符:||
||运算符是个顺序点,也就是说先修改左侧的值,再对右侧的值进行判定;冒号和逗号运算符也是顺序点;||的优先级比关系运算符低
(2)逻辑AND运算符:&&
(3)逻辑NOT运算符:!。!运算符的优先级高于所有的关系运算符和算术运算符。
注意:#include中定义的两个符号常量(INT_MAX和INT_MIN)来确定其参数是否位于适当的范围内。
2.字符函数库cctype
其头文件即为#include
3.条件运算符(?:)
例如:c=a>b?a : b ;

第七章 函数——C++的编程模块
1.使用C++函数,必须完成如下工作:
(1)提供函数定义;(2)提供函数原型;(3)调用函数
2.可以将函数分为两类:没有返回值的函数(void)和有返回值的函数
注意:C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型——整数、浮点数、指针和结构、对象(C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回)
返回函数和调用函数必须就该内存单元中存储的数据的类型达成一致。
3.原型确保以下几点:
(1)编译器正确处理函数返回值;(2)编译器检查使用的参数数目是否正确;(3)编译器检查使用的的参数类型是否正确。如果不正确,则转换为正确的类型。
原型描述了函数到编译器的借接口,将函数返回值的类型以及参数的类型和数目告诉编译器。
4.静态类型检查:在编译阶段进行的原型化被称为静态类型检查,可以看出,静态类型检查可以捕获许多在运行阶段非常难以捕获的错误。
5.局部变量也称为自动变量,因为它们是在程序的执行过程中自动被分配和释放的。
6.C++标准使用参数(argument)来表示实参,使用参量(parameter)来表示形参。
7.函数和数组:
int sum_arr(int arr[],int n) //arr实际上并不是数组,而是指针
等效于int sum_arr(int *arr,int n) //C++中,当用于函数头或函数原型中,int *arr和int arr[]的含义是相同的
两个恒等式:

arr[i]==*(arr+i)         //两个变量的值
&arr[i]==arr+i;          //两个变量的地址

注意,对于遍历数组而言,使用指针加法和数组下标时等效的
8.在声明形参时使用关键词const,防止函数无意间修改数组的内容:
void show_array(const double ar[],int n); //表明指针ar指向的是常量数据(注意,这并不意味着原始数组必须是常量,只是意味着不能在show_array()函数中使用ar来修改这些数据)
另外,C++将声明const double ar[]解释为const double *ar
9.使用数组区间的函数
double elbuod[20]; //指针elboud和elboud+20定义了区间;elboud+20指向数组结尾后面的一个位置;
10.使用两种不同的方式将const关键字用于指针:
(1)让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值;
(2)将指针本身声明为常量,这样可以防止改变指针指向的位置。
四种情况:1)将常规变量的地址赋给指向const的指针;2)将const变量的地址赋给指向const的指针;3)将const的地址赋给常规指针(不可行,可使用强制类型转换);4)指针指向指针:仅当只有一层间接关系(如指针指向基本数据类型)时,才可以将非const地址或指针赋给const指针。

int sloth=3;
const int *ps=&sloth;                //允许将ps指向另一个位置,但不允许ps来修改sloth的值
int * const finger=&sloth;         //使得finger只能指向sloth,但允许使用finger来修改sloth的值

11.函数和二维数组:

int  data[3][4]={{1,2,3,4},{9,8,7,6},{2,4,6,8}};
int total=sum(data,3);
int sum(int  (*ar2)[4], int size);              //data的类型为指向由4个int组成的数组的指针
int sum(int ar2[][4], int size);                 //等效的函数原型

注意:函数参数不能是数组。
12.函数和C—风格字符串
假设要将字符串作为参数传递给函数,则表示字符串的方式有三种:
(1)char数组;(2)用引号括起的字符串常量(也称字符串字面值);(3)被设置为字符串的地址的char指针

unsigned int c_in_str(const char * str, char ch);
unsigned int c_In_str(const char str[], char ch);        //等效,在函数头中使用数组表示法,而不声明str;

注意:当时用指针表示法时,参数不一定是数组名,也可以是其他形式的指针
13.函数和结构
(1)传递和返回结构:当结构比较小时,按值传递结构,可以将结构用来声明变量、函数的返回类型和函数的参数类型,函数使用的是原始结构的副本。
(2)另一种处理结构的函数示例(时间、空间); cin>>rplace.x>>rplace.y;
(3)传递结构的地址:(show_polar()函数)
1)调用函数时,将结构的地址(&pplace)而不是结构本身(pplace)传递给它;
2)将形参声明为指向polar的指针,即polar*类型。由于函数不应该修改结构,使用const修饰符;
3)由于形参是指针而不是结构,因此应间接成员运算符(->),而不是成员运算符(句点)。
(rect_to_polar函数修改:)
需要将两个指针传递给该函数,第一个指针指向要转换的结构,第二个指针指向存储转换结果的结构。
14.函数和string对象(P235)、函数和array对象(P236)
15.递归(包含一个递归调用的递归):通常的方法是将递归调用放在if语句中;(例如:如果recurs()进行了5次递归调用,则第一个statements1部分将按函数调用的顺序执行5次,然后statements2部分将以与函数调用相反的顺序执行5次,进入5层递归后,程序将沿进入的路径返回。)
(包含多个递归调用的递归):ruler示例(P240) 分而治之策略
16.函数指针
1)获取函数的地址:使用函数名

process(think);          //传递函数地址
thought(think());        //传递函数返回值

2)声明函数指针:

double pam(int);
double   (*pf) (int);                    //pf即为函数指针
double   (*pf)(int);           //pf是一个指向函数的指针
double   *pf(int);             //pf()是一个返回指针的函数

3)使用指针来调用函数(只需使用(*pf)时,将它看作是函数名即可)

double pam(int);
double (*pf)(int);
pf=pam;
double x=pam(4);
double y=(*pf)(5);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值