第一章 C++基本知识
本章主要介绍了C++基本的数据类型与表达式,面向过程的基本设计,函数与预处理命令,数组,指针,结构体,类和对象,继承与派生和多态性与虚函数。主要的总结均来自于谭浩强老师的《C++程序设计》,在每一小节的背后,给出了一些在网上总结的面试题,以加强我们对C++的理解。并且每一小节均给出了典型的C++程序代码,理解这些代码是读懂文章的关键。
1.1 C++的初步认识
C++的特点:类与对象、封装、继承和多态。
一个C++程序通常由以下部分组成:预处理命令,全局声明部分,函数。函数由函数首部和包含局部声明和执行的函数体构成。C++的语句分为声明语句和执行语句,执行语句用于实现用户指定的操作。一个C++程序总是从main函数开始执行的,不论main函数在整个程序中的位置如何。
1.2 数据类型与表达式
1.2.1 C++数据类型
整形(int):可以分为长整型(long int)和短整型(short int),长整型和整形的复制范围是一样的,但是整形和短整型只占2字节,长整型占4字节。整形数据的存储方式为2进制。Signed和unsigned表示有符号和无符号,若为有符号,则数据以补码形式存放,无符号的存储范围比有符号大一倍。
浮点型(float):分为单精度,双精度和长双精度。字母e表示其后数字都是以10为底,即e12表示1012。浮点型在内存中均已指数形式存储,存储单元分为存放数字的存储单元和存放指数的存储单元。
字符常量:用单撇号括起来的一个字符就是字符型常量,如’a’,但只能包含一个字符,且区分大小写。转义字符中有几个关键的需要掌握,如下表:
表 1.1比较重要的的转义字符
\n | 换行 | \b | 退格 | \’ | 输出单撇号字符 |
\t | 跳到下一个tab位置 | \\ | 输出反斜杠字符”\” | \0 | 空字符 |
字符数据是以ASCII码存储的,A的ASCII码是65,a的是97,中间差了32。
字符串常量会在最后自动加一个’\0’作为字符串结束标志,但它并不是字符串的一部分,不会被输出,但是在内存中会多占用一个字节。字符串常量通过字符数组进行存放。
用来标识变量、符号常量、函数、数组和类等实体名字的有效字符序列称为标识符。标识符只能由数字、字母和下划线3种字符组成。
1.2.2 常变量
Eg:
const int a=3;
const int a; a=3; (×)//常变量不能被赋值
在定义变量时,如果加上关键字const,则变量的值在程序运行期间不能改变,这种变量称为常变量。且常变量必须在声明时进行初始化,此后其值不会再改变。
1.2.3 C++运算符
&&与,||或,!非。sizeof求字节运算符(后面要重点讲一下)。%取余运算符。运算符的结合方向为自左向右。且在进行运算时,不同类型的数据需要先转化为同一类型,然后再进行运算,转化规则如下图所示:
图 1.1 运算时的数据转换
++i:使用i之前,先给i加1。(--i同理)
i++:在使用i之后,使i的值加1.(i--同理)
自增自减运算符只能用于变量,结合是自右向左的。如-i++相当于-(i++)。
例1.1.1 下列语句输出结果是什么。
int i=3;
cout<<i++<<i++;
输出为4和3.,因为输出是自右向左处理的。
例 1.1.2 下列语句什么意思:(程序员面试宝典)
x=3;y=3;z=(x&y);
则z为3,&表示二进制按位与运算
1.2.4 C++赋值表达式
一般形式:变量 赋值运算符表达式
赋值运算符按照自右向左顺序结合
C++的输入和输出是通过“流”的方式实现的。cout是输出流对象的名字,cin是输入流对象的名字。
cout/cin语句的一般格式为:
cout<<表达式1<<表达式2<<……<<表达式n;
cin>>变量1>>变量2>>……>>变量n;
关于输入输出流,有几个关键的控制符需要知道,见表1.2。调用他们需要包含头文件:表 1.2 输入输出流的控制符
setprecision(n) | 设置浮点数的精度为n位 |
setw(n) | 设置字段宽度为n位 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示 |
setiosflags(ios::left) | 输出数据左对齐 |
1.3 程序设计初步
1.3.1 putchar和getchar
putchar()函数的作用是向终端输出一个字符,当然也可以输出ASCII码。
getchar()函数是从终端输入一个字符。
1.3.2 关系运算符和逻辑运算符
优先级高的关系运算符(它们之间优先级相同):<.<=,>,>=。优先级低的关系运算符(它们之间优先级相同):==,!=。
三种运算符之间的优先级关系:算术运算符>关系运算符>与和或>赋值运算符。
优先级:非>与>或
关系表达式的值是一个逻辑值,即“真”或“假”。1表示真,0表示假。
逻辑型变量要用标识符bool来定义,故又称布尔变量。
同或:相同为1,不同为0。a⊙b=ab+a'b'(a'为非a,b'为非b)。
异或:不同为1,相同为0。a⊕b=ab'+a'b。
1.3.3 选择结构
if 语句 | switch语句 |
if(表达式1) 语句1 else if (表达式2) {语句2} …… else 语句n | switch(表达式) { case 常量表达式1:语句1; case 常量表达式2:语句2; …… default: 语句n+; } |
一、if语句
if语句中,else总是与它上面最近的、且未配对的if配对。
条件运算符,又称三目运算符(?:),形式如下:
表达式1? 表达式2:表达式3;
Eg:max(a>b)? a:b; //若括号内条件为真,则取a,否则取“:”后面的值,即b。
二、switch语句
switch后面括号内的“表达式”允许为任何类型。case表达式的值不能相同,且case和default出现的顺序不影响执行结果。每执行完一个case子语句,流程就转移到下一个case子语句继续执行,会连续输出,若想跳出switch结构,需要在每个case子语句后加“break;”
1.3.4 循环结构
一、几种循环类型
①
while(表达式) {语句}
当满足括号内表达式条件时,执行循环体,上式称为当型循环。
②
do
语句
while (表达式)
先执行循环体,然后判断表达式。
③
for (循环变量赋初值;循环条件;循环变量增值) {语句}
Eg: for (i=1;i<=100;i++)sum=sum+i;
for语句的第一个表达式可以省略,但需在for语句之前给循环变量赋初值、省略第2个表达式表示死循环。若想省略第三个表达式,需在循环体中做修改。
for(;;)相当于while(1)。for语句功能更强,凡能用while循环的均可用for实现。
二、break和continute
break语句不仅可以跳出switch结构,在循环体内,还可以跳出循环体。continue语句作用为结束本次循环,接着进行下一次循环的判定。即continue语句只结束本次循环,break语句结束整个循环过程。
例 1.3.1找出100~200间的全部素数
判别m是否为素数的算法是这样的:让m被2~除,若m不能被其中的任一个整数整除,就可以确定m是素数。
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
int m,k,i,n=0;
bool prime; //定义bool变量prime,以判定m是否为素数
for (m=101;m<=200;m=m+2)
{
prime=true;//prime为真,即先默认m为素数
k=int(sqrt(m));//k表示 的整数部分
for (i=2;i<=k;i++)//让m被 除,检查是否能整除
{
if (m%i==0)//若能整除,表示m不是素数
{
prime=false;
break;
}
if (prime)//若m为素数,则打印
{
cout<<setw(5)<<m;//字段宽度为5
n=n+1;//n用来统计素数个数
}
if (n%10==0) cout<<endl;//输出10个数换一次行
}
cout<<endl;
return 0;
}