1,return语句返回函数的返回值,就是函数的类型,函数只能有唯一的返回值;
return可以停止函数,并将控制返回主调函数;
一个函数可以有许多return语句,执行到哪个return语句,哪个起作用;
如果函数的类型和return表达式中的语句不一致,则以函数的类型为准;
函数的类型觉得return返回值的类型,对数值型数据,可以进行类型转换;
2,函数原型声明:
如果调用的是自定义的函数,并且该函数和主函数在同一个程序中且位置在主函数之后,则必须在调用函数之前对函数进行声明;
void main(){
float a,b,c;
float max(float,float); //函数原型声明;
cin>>a>>b;
c=max(a,b);
cout<<"The max is"<<c<<endl;
}
float max(float x, float y){
float z;
z=(x>y)? x :y ;
return z;
}
3,函数可以嵌套调用,但不可以嵌套定义;
4,函数的递归调用:在调用函数的过程中,直接或间接的调用函数本身;
5,作用域和存储类:
作用域:即某个标识符在哪个区间有效;
作用域分为5类:块作用域,文件作用域,函数原型作用域,函数作用域和区间作用域;
块作用域:
块:用花括号括起来的程序为一个块;作用域在块内,始于标识符的声明处,结束于块的结尾处;
形参也属于局部变量;
主函数中定义的变量也属于局部变量,只在主函数内部有效;
不同的函数可以使用相同名字的局部变量,它们在内存中分属不同的空间,互不干扰;
定义变量就是在内存中开辟空间;
注意:具有块作用域的标识符在其作用域内,将屏蔽其作用块包含本块的同名标识符,即变量名相同,局部更优先;
文件作用域:函数外定义的变量称为全局变量,全局变量的作用域称为文件作用域,即在整个文件中都是可以访问的;其缺省的范围是从全局变量的定义处开始,到源程序的结束;
当块作用域内的变量和全局变量同名时,局部变量优先;
在同一个源文件中,外部变量和局部变量同名,则在局部变量的作用范围内,外部变量不起作用;
int a = 3, b =5;
int max(int a, int b){
int c ;
c = a>b?a:b;
return c;
}
void main(void){
int a =8; //覆盖了外部的全局变量a;
cout<<max(a,b)<<endl;
} //结果是输出 8 ;
在块作用域内,可通过作用域运算符::来引用与局部变量同名的全局变量;
int i = 100;
void main(void){
int i , j = 50;
i = 18 ; //访问局部变量i;
::i= ::i + 5 ; //访问全局变量i;
j = ::i + i ; //访问全局变量i和局部变量j;
cout<<"::i="<<::i<<' '; // 的引号是单引号;
cout<<"j="<<j<<' ';
}
3,函数原型作用域:
在函数原型的参数表中声明的标识符所具有的作用域称为函数原型作用域,从函数原型声明处开始,到函数原型声明结束处为止;
float tt( int x , float y); //函数tt的原型说明;
可以在函数原型声明中,只声明参数类型,省略参数名;
局部变量的分类:
静态局部变量:存储在静态区;
动态变量:默认,存储在动态区;
寄存器变量:在cpu内部存储;
4,内联函数:在函数声明前加inline关键字;(c++中,除函数内部有循环,switch分支语句及复杂的嵌套if语句外,任何函数都可以生命为内联函数,如被调函数)
内联函数的实质是采用空间(占用更多的空间)换时间(换取更少的执行时间);
5,具有缺省参数值和参数可变的函数:
在c++中定义函数时,允许给参数指定一个缺省值。在调用函数时,若明确给出了实参的值,则使用相应的实参的值,若没有给出相应的实参,则使用缺省值;
6,函数重载:是指完成不同功能的函数可以使用相同的函数名;
定义函数的重载,必须有不同的参数个数或不同的参数类型,这样编译系统才能根据不同的实参决定调用哪个函数;
仅仅函数的类型不同,不能定义为重载函数;
c++的编译器,是根据函数的实参来决定调用哪个函数的;
7,宏定义:#define 标识符 字符串 //使用指定的标识符代替字符串;
注意:末尾没有分号;
作用域为:声明处开始到程序文件结束为止,可以使用#undef 结束作用域;
在程序中用双引号括起来的字符串内容,即使与宏名相同,也不进行置换;
在进行宏定义中,可以使用已定义的宏名,来进行层层置换;
#define G 9.8
# undef G
8,文件包含:#include “文件名”
7,数组:
c++中不允许对数组进行动态定义,即数组的大小不能是变量,必须是常量;
数组的初始化:
int a[10]= {0,1,2,3,4,5,6,7,8,9}
int a[10] = {0,1,2,3} //未赋值的那部分是0;
不能给数组整体赋值:
如 int a[10]={0,1,2,3......,9} //是非法的;
数组在内存中按顺序存放,第一个元素位于最底端;
8,冒泡法对数组中的n个数进行排序:
首先将相邻的两个数进行比较,然后调换位置,小的放到前边,n个数要比较n-1趟;
每一趟要比较的次数是不同的:第一趟比较n-1次,第二趟比较n-2次,第三趟比较n-3次,,,,第n-1趟比较1次(n-(n-1));
for(int j=1;j<=n-1;j++) { //控制比较趟数
for(int i=1;i<=n-j;i++){ //控制每趟比较的次数
if(a[i]>a[i+1]){
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
}
一般元素的序号是从0开始,因此程序可以变动如下:
for(int j=0;j<n-1;j++){
for(int i=0;i<n-1-j;i++){
//。。。。。
}
}
9,数组中分行或全部赋值时,第一维可以省,第二维不可以省。
int a[][4]={{1,2},{5,6,7,8},{9,10,11,12}}
10,c++中,数组名默认是数组在内存中存放的首地址;
用数组名做函数参数,实参和形参都应该是数组名,此时函数传递的是数组在内存中的地址;实参中地址传到实参中,实参形参共用同一段内存,形参数组中的值发生变化,实参数组中的值夜发生变化;
用数组名做函数参数,应该在主调函数和被调函数中国分别定义数组,并且类型相同;
实参数组的大小需指定,形参数组的大小不用指定;数组名做实参,实际上是传递数组的首地址;
11,字符数组:用来存放字符数据的数组称为字符数组;一个元素放一个字符;
定义:char 数组名[常量表达式]
char c[10] = {'I','','a','m','','a','','b','o','y'};
如果省略数组长度,则字符数即为数组长度;char c[] = {'I','','a','m','','a','','b','o','y'};
取相应的ASCII码值;
char str[] = {66,67,68}; //'A','B','D'
字符串和字符数组的区别:
如果不指定长度,字符数组的长度就是字符的个数,字符串的长度则是字符的个数加末尾