c++基础知识

来源:互联网 发布:答题软件游戏 编辑:程序博客网 时间:2024/05/21 03:55

1.数据类型


整型变量:

分为有符号型与无符号型。
有符号型:
    short 在内存中占两个字节,范围为-215~(215-1)
    int 在内存中占四个字节,范围为-231~(231-1)
    long在内存中占四个字节,范围为-2-31~231-1


无符号型:最高位不表示符号位
unsigned  short 在内存中占两个字节,范围为0~216-1
unsigned int  在内存中占四个字节,范围为0~232-1
unsigned  long在内存中占四个字节,范围为0~232-1


1)整型常量亦有长短之分,常量中无unsigned型,但一个非负的整型常量可以赋给unsigned型的变量。
2)若一个常量定义为长整型数,则在其后加l或L进行区分。
如:32l    32L    564L等,内存为其分配四个字节存储。


不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。


实型数又称浮点数,有两种表示方式:
1)十进制形式:  23.0    24.5     3.56789
指数形式:   23E1    145e-1    356789e1   e前有数字,后面必须是整数。

实型变量分单精度 float 和双精度 double 两种形式:
float:占四个字节,提供7~8位有效数字。
double: 占八个字节,提供15~16位有效数字。


当计算机中出现小于机器所能表示的最小数时,机器只能当零来处理,当出现超过机器所能表示的最大数时,出现溢出现象,一旦出现溢出,就会停止运算。定点数,浮点数均会出现溢出现象。

字符型数据(char)

字符型数据实际上是作为整型数据在内存中存储的。
计算机是以字符编码的形式处理字符的,因此,我们在计算机内部是以ASCII码的形式表示所有字符的。所以7位二进制数即可表示出一个字符,我们用一个字节的容量(8位)存储一个字符。

在程序中表示为:
char   grade ;//定义一个字符型的变量空间(1个字节)
grade=‘A’;  //必须用‘   ’表示,否则易与标识符混同
‘ ’内括起来的字符表示该字符的ASCII码。

非打印字符
有些ASCII的字符代表某些操作,不能打印出来,如回车、退格等,可用两种方式表示这些字符。
1)用ASCII码的形式          char   re=13;
2)用转义字符               char   re=‘\n’;(p15)


转义字符虽然包含2个或多个字符,但它只代表一个字符。编译系统在见到字符“\”时,会接着找它后面的字符,把它处理成一个字符,在内存中只占一个字节。

'a'在内存中占一个字节              "a"占两个字节

变量
1) 在程序的执行过程中,其值可以改变的量称为变量。

2) 变量名必须用标识符来标识。

3) 变量根据其取值的不同值域,分为不同类型的变量:整型变量、实型变量、字符型变量、构造型变量、指针型变量等等。


4) 对于任一变量,编译程序要为其分配若干个字节(连续的)的内存单元,以便保存变量的取值。

5) 当要改变一个变量的值时,就是把变量的新的取值存放到为该变量所分配的内存单元中;用到一个变量的值时,就是从该内存单元中取出数据。

6) 不管什么类型的变量,通常均是变量的说明在前,使用变量在后。


一、算术运算符和算术表达式
+    -   *    /    %  
用算术运算符连接起来的式子是算术表达式

二、优先级与结合性
()      *        /       %           +       —

关系运算符(比较运算)
     <   >  <=   >=     = =      !=
  = = 与 =
     a=5;    赋值运算           a= =5;判断是否相等

<  >  <=   >= 的优先级大于= =   !=

 算术运算符的优先级大于关系运算符的优先级

sizeof()运算符是一个单目运算符,用于计算某一个操作数类型的字节数。其格式为:
sizeof(<类型>)

sizeof(int)   //其值为4
sizeof(float) //其值为4
sizeof(double)  //其值为8
sizeof(char)  //其值为1




二。输入输出

程序在执行期间,接收外部信息的操作称为程序的输入;而把程序向外部发送信息的操作称为程序的输出。在C++中没有专门的输入输出语句,所有输入输出是通过输入输出流来实现的。
要使用C++提供的输入输出时,必须在程序的开头增加一行:
#include  <iostream.h>

在缺省的情况下,cin自动跳过输入的空格,换言之,cin不能将输入的空格赋给字符型变量,同样地,回车键也是作为输入字符之间的分隔符,也不能将输入的回车键字符赋给字符型变量。

若要把从键盘上输入的每一个字符,包括空格和回车键都作为一个输入字符赋给字符型变量时,必须使用函数cin.get()。其格式为:
cin.get(<字符型变量>);


cin.get()从输入行中取出一个字符,并将它赋给字符型变量。这个语句一次只能从输入行中提取一个字符。

3、输入数据的格式、个数和类型必须与cin中所列举的变量类型一一对应。一旦输入出错,不仅使当前的输入数据不正确,而且使得后面的提取数据也不正确。


输出数据    cout
与输入cin对应的输出是cout输出流。


指定输出项占用的宽度:
在输出的数据项之间进行隔开的另一种办法是指定输出项的宽度。如上面的两个输出语句可改写为:
cout <<setw(6)<< i<<setw(10)<<j<<endl;


与cin中类同,当在cout中指明以一种进制输出整数时,对其后的输出均有效,直到指明又以另一种进制输出整型数据为止。对实数的输出,也是这样,一旦指明按科学表示法输出实数,则接着的输出均按科学表示法输出,直到指明以定点数输出为止。明确指定按定点数格式输出(缺省的输出方式)的语句为:
cout.setf(ios::fixed,ios::floatfield);


三。控制语句


if(表达式1)  语句1
    else if (表达式2)     语句2
      ......
      else  if (表达式n)    语句n
      else      语句n+1 


switch(表达式)
    { case  常量表达式1:语句1
         case  常量表达式2:语句2
          … …
         case 常量表达式n:语句n
         default:语句n+1
      }

while ( 表达式)
     {  语句组1  }
{语句组2}



do
    { 语句组1}
while(表达式);
{语句组2}


for(表达式1;表达式2;表达式3)
         
           {语句组1(循环体)}

{语句组2}



break在switch语句中,可以使流程跳过判断体,执行下面的程序。在循环体中,也可以从循环体内跳出循环体,提前结束循环。


continue:其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。


四。函数与编译预处理


函数是程序代码的一个自包含单元,用于完成某一特定的任务。

C++是由函数构成的,函数是C++的基本模块。

有的函数完成某一操作;有的函数计算出一个值。通常,一个函数即能完成某一特定操作,又能计算数值。

1、一个源程序文件由一个或多个函数组成,编译程序以文件而不是以函数为单位进行编译的。
2、一个程序可以由多个源文件组成,可以分别编译,统一执行。

3、一个程序必须有且只有一个main( )函数,C++从main( )函数开始执行。

4、C++语言中,所有函数都是平行独立的,无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。

5、从使用角度来说,分标准函数和用户自定义函数;从形式来说,分无参函数和有参函数。


库函数是C++编译系统已预定义的函数,用户根据需要可以直接使用这类函数。库函数也称为标准函数。
为了方便用户进行程序设计,C++把一些常用数学计算函数(如sqrt()、exp()等)、字符串处理函数、标准输入输出函数等,都作为库函数提供给用户,用户可以直接使用系统提供的库函数。
库函数有很多个,当用户使用任一库函数时,在程序中必须包含相应的头文件。 如 #include<iostream.h>等。


用户在设计程序时,可以将完成某一相对独立功能的程序定义为一个函数。用户在程序中,根据应用的需要,由用户自己定义函数,这类函数称为用户自定义的函数。



函数定义的一般形式

一、无参函数

主调函数并不将数据传给被调函数。

无参函数主要用于完成某一操作。


二、有参函数
主调函数和被调函数之间有数据传递。主调
函数可以将参数传递给被调函数,被调函数
中的结果也可以带回主调函数。


函数参数和函数的值
形参是被调函数中的变量;实参是主调函数
赋给被调函数的特定值。实参可以是常量、
变量或复杂的表达式,不管是哪种情况,在
调用时实参必须是一个确定的值。
形参与实参类型相同,一一对应。
形参必须要定义类型,因为在定义被调函数
时,不知道具体要操作什么数,而定义的是
要操作什么类型的数。



函数参数和函数的值
形参是被调函数中的变量;实参是主调函数
赋给被调函数的特定值。实参可以是常量、
变量或复杂的表达式,不管是哪种情况,在
调用时实参必须是一个确定的值。
形参与实参类型相同,一一对应。
形参必须要定义类型,因为在定义被调函数
时,不知道具体要操作什么数,而定义的是
要操作什么类型的数。


形参必须要定义类型,因为在定义被调函数
时,不知道具体要操作什么数,而定义的是
要操作什么类型的数。


形参是被调函数中的变量;实参是主调函数
赋给被调函数的特定值。在函数调用语句
中,实参不必定义数据类型,因为实参传递
的是一个具体的值(常量),程序可依据这个
数值的表面形式来判断其类型,并将其赋值
到对应的形参变量中。


函数的返回值
函数的返回值通过return语句获得。函数只
能有唯一的返回值。
函数返回值的类型就是函数的类型。
return语句可以是一个表达式,函数先计算
表达式后再返回值。
return语句还可以终止函数,并将控制返回
到主调函数。
一个函数中可以有一个以上的return语句,执行
到哪一个return语句,哪一个语句起作用。


4) 如果使用用户自己定义的函数,而该函数与调
用它的函数(即主调函数)在同一个程序单位中且
位置在主调函数之后,则必须在调用此函数之前对
被调用的函数作声明。


作用域和存储类
作用域是指程序中所说明的标识符在哪一个区间内
有效,即在哪一个区间内可以使用或引用该标识符。
在C++中,作用域共分为五类:块作用域、文件作
用域、函数原型作用域、函数作用域和类的作用域。


块作用域
我们把用花括号括起来的一部分程序称为一个块。
在块内说明的标识符,只能在该块内引用,即其
作用域在该块内,开始于标识符的说明处,结束
于块的结尾处。
在一个函数内部定义的变量或在一个块中定义的变
量称为局部变量。


不同的函数可以使用相同名字的局部变量,它们在
内存中分属不同的存储区间,互不干扰。


具有块作用域的标识符在其作用域内,将屏
蔽其作用块包含本块的同名标识符,即
变量名相同,局部更优先。


文件作用域
在函数外定义的变量称为全局变量。
全局变量的作用域称为文件作用域,即在整个文件
中都是可以访问的。
其缺省的作用范围是:从定义全局变量的位置开始
到该源程序文件结束。
当在块作用域内的变量与全局变量同名时,局部变
量优先。


在同一个源文件中,外部变量与局部变量同名,则在局部
变量的作用范围内,外部变量不起作用。


在块作用域内可通过作用域运算符“::”来引用与局部变
量同名的全局变量。


静态存储:在文件运行期间有固定的存储空间,直到文件
运行结束。
动态存储:在程序运行期间根据需要分配存储空间,函数
结束后立即释放空间。若一个函数在程序中被调用两次,
则每次分配的单元有可能不同。


静态存储:在文件运行期间有固定的存储空间,直到文件
运行结束。
动态存储:在程序运行期间根据需要分配存储空间,函数
结束后立即释放空间。若一个函数在程序中被调用两次,
则每次分配的单元有可能不同。


动态局部变量未被赋值时,其值为随机值。其作用域的函
数或复合语句结束时,空间被程序收回。
程序执行到静态局部变量时,为其在静态区开辟存储空
间,该空间一直被保留,直到程序运行结束。
由于存储在静态区,静态局部变量或全局变量未赋初值
时,系统自动使之为0。


extern  存储类别

全局变量的默认方式,当在一个文件中要引用另一个文件
中的全局变量或在全局变量定义之前要引用它时,可用
extern作说明,相当于扩大全局变量的作用域。


静态(static)存储类别

它仅能在本文件中引用,即使在其它文件中用extern说明
也不能使用。相当于限制了全局变量的作用域范围。


静态局部变量:static 在函数内部定义,存储在静态存储
区,与auto对应,在别的函数中不能引用。
全局静态变量:static 在函数外部定义,只限在本文件中使
用,与extern对应。



内联函数的实质是用存储空间(使用更
多的存储空间)来换取时间(减少执行时
间).
内联函数的定义方法是,在函数定义
时,在函数的类型前增加修饰词inline。


1、C++中,除在函数体内含有循环,switch分支和复杂嵌
套的if语句外,所有的函数均可定义为内联函数。
2、内联函数也要定义在前,调用在后。形参与实参之间
的关系与一般的函数相同。
3、对于用户指定的内联函数,编译器是否作为内联函数
来处理由编译器自行决定。说明内联函数时,只是请求编
译器当出现这种函数调用时,作为内联函数的扩展来实
现,而不是命令编译器要这样去做。
4、正如前面所述,内联函数的实质是采用空间换取时
间,即可加速程序的执行,当出现多次调用同一内联函数
时,程序本身占用的空间将有所增加。如上例中,内联函
数仅调用一次时,并不增加程序占用的存储间。



所谓函数的重载是指完成不同功能的函数可以具
有相同的函数名。
C++的编译器是根据函数的实参来确定应该调用
哪一个函数的。

1、定义的重载函数必须具有不同的参数个数,
或不同的参数类型。只有这样编译系统才有可能
根据不同的参数去调用不同的重载函数。
2、仅返回值不同时,不能定义为重载函数。
即仅函数的类型不同,不能定义为重载函数



宏定义
不带参数的宏定义
用一个指定的标识符(即名字)来代表一个字符
串,以后凡在程序中碰到这个标识符的地方都用字
符串来代替。
这个标识符称为宏名,编译前的替代过程称为“宏
展开”。
# define    标识符     字符串


宏展开只是一个简单的“物理”替换,不做语法
检查,不是一个语句,其后不加分号“;”

#define命令出现在函数的外面,其有效范围为
定义处至本源文件结束。可以用# undef命令终止宏
定义的作用域。

对程序中用双引号括起来的字符串内容,即使
与宏名相同,也不进行置换。


带参数的宏定义
#define     宏名(参数表)       字符串


按#define命令行中指定的字符串从左至右进行置换
宏名,字符串中的形参以相应的实参代替,字符串
中的非形参字符保持不变。


带参数的宏与函数调用的区别
相同:有实参、形参,代入调用。
不同之处:
1、函数调用先求表达式的值,然后代入形参,而宏只是机
械替换。
2、函数调用时形参、实参进行类型定义,而宏不需要,只
是作为字符串替代。
3、函数调用是在运行程序时进行的,其目标代码短,但程
序执行时间长。而宏调用是在编译之前完成的,运行时已
将代码替换进程序中,目标代码长,执行时间稍快。
一般用宏表示实时的、短小的表达式。


文件包含
一个源文件可以将另外一个源文件的全部内容包含进来,
即将另外的文件包含到本文件之中。
#  include   “文件名”


注意:
1、文件名是C的源文件名,是文本文件,后缀名可
以任选。*.cpp *.h
2、一个#include语句只能指定一个被包含文件。
3、文件名用双引号或尖括号括起来。
4、包含后所有源文件编译为一个可执行文件。


条件编译
C语言允许有选择地对程序的某一部分进行编译。
也就是对一部分源程序指定编译条件。


1、 # ifdef      标识符
               程序段1
        # else
               程序段2
        # end if


2、 # ifndef      标识符
               程序段1
        # else
               程序段2
        # endif


3、  # if     表达式
               程序段1
        # else
               程序段2
        # endif




程序的多文件组织
而在设计一个功能复杂的大程序时,为了便于程序的设计和调
试,通常将程序分成若干个模块,把实现一个模块的程序或数据
放在一个文件中。当一个完整的程序被存放在多于一个文件中
时,称为程序的多文件组织。


内部函数和外部函数
内部函数:函数只限于在本文件中调用,其它文件不能调
用,用static 定义该函数。
static  float  fac( int  n)
{   ......      }
外部函数:函数的默认形式,可以被其它文件调用,用
extern 定义该函数。调用时,在文件中用extern 说明。
void main(void)
{  extern  enter_string( );
    char   str[80];
    enter_string(str);
    ..........
}

原创粉丝点击