C++ Primer Plus 笔记 Part#2

第二部分 – 复合语句:分支与循环 – C++ 提纲

第二部分 – 复合语句:分支与循环

第二部分 复合语句:分支与循环

一、for循环

·组成

for(初始化语句;测试表达式;更新表达式)

语句

C++把整个for看作一条语句,for后可以跟上一条语句或用花括号扩起的代码块

如:

for(i=0;i<=5;i++) cout<

for(i=0;i<=5;i++){cout<<”i=”;cout<

·for循环的执行过程

(1)设置循环变量的初始值

(2)进行测试,检测循环是否应当继续执行

(3)执行循环语句

(4)更新循环变量

·控制部分后面的语句叫做循环体。

·测试表达式决定了循环体是否被执行。其通常为关系表达式,如果值为true则程序将继续执行循环体

·for是入口条件循环。在每轮循环前会计算测试表达式的值

·更新表达式在每轮循环结束时执行。

二、表达式

▲·任何值或任何有效值和运算符的组合都是表达式,每个表达式都有值。赋值表达式的值定义为左侧成员的值。如m=20值为20.所以可以把几个等于号连用,如a=b=c=0

·<和>的优先级比<<小,在使用cout时注意

·关系运算符的意义:<小于,>大于,==等于,>=大于等于,<=小于等于,!=不等于

关系表达式为的值为bool类型

·cout.setf(ios_base::boolalpha);用于设置cout在显示bool值时使用true或false,而不是0或1.

·为判定表达式x=100的值,C++进行了赋值操作。当判定表达式的值的操作改变了内存中数据的值时,则该表达式有副作用(side effcet)

·任何表达式加上分号成为语句,反过来就不对了。表达式加上分号成为表达式语句

·返回语句、声明语句和for、while、do-while等语句都不是表达式语句,其没有值。

如int total其不是表达式,没有值。判断语句是否为表达式看是否有值

·可以在for循环的初始化部分声明变量。该变量会在离开for后消失。for循环的第一个语句可以是表达式语句,也可以是声明语句。

·更新表达式的更新的量有时也叫做步长

▲▲·递增(++)和递减(–)运算符:每次增减1

用法:前缀 ++变量 –变量 先修改再使用变量的值(此时已修改)

后缀 变量— 变量++ 先使用变量的值再修改变量

警告:在编写程序时,请严格遵守标准,否则程序会出现难以预知的错误。不能在同一条语句上运用多次递增递减运算符,如x=(++n)+(n++)会在不同的系统上生成不同的结果。

·副作用和顺序点

副作用:计算表达式时对某一些东西进行了修改

顺序点:程序执行过程的一个点,任何完整表达式后都有一个顺序点,在进入下一步前将确保对所有副作用都进行了评估。即在执行下一条语句前,赋值、递增、递减运算符执行的所有修改都必须完成。

完整表达式:不是另一个更大的表达式的子表达式

y=(4+x++)+(6+x++);

以上语句中4+x++不是完整表达式,其后没有顺序点,所以其所有的修改无法进行保证

则x不一定加1,所以该表达式会产生未定义行为。

Note:在部分计算机教育中,有一个经典问题:i=1,则表达式n=(i++)+(++i)值为多少,这是与上面的问题相似,在上面已经明确指明此会导致不同编译器输出不同的结果。所以无论如何都不能写这样的程序。且在C++和C标准中已经明确指出此为未定义行为!!

*对于用户定义的类型,若定义了递增递减运算符,则前缀格式的效率更高

·递增递减与指针

前缀格式与解除引用的优先级相同,从右向左结合;后缀格式比前缀格式优先级高,从左向右结合。*++pt表示先将++应用于pt后再应用*,++*pt意味着先取得pt指向的值,然后递增,*pt++先应用++再应用*。

#include<iostream>

using namespace std;

int main()

{

cout<<“——循环结构递增与解除引用测试——\n“;

int arr[10]={1,2,3,4,5,6,7,8,9,10};

int *pt=&arr[0];

cout<<“*pt=”<<(*pt)<<endl

<<“*++pt=”<<(*++pt)<<endl

<<“*pt++=”<<(*pt++)<<endl;

return 0;

}

——循环结构递增与解除引用测试——

*pt=1

*++pt=2

*pt++=2

·组合赋值运算符:L为左操作数,R为右操作数

+= 将L+R赋给L -= 将L-R赋给L *= 将L*R赋给L

/= 将L/R赋给L %= 将L%R赋给L

三、复合语句(语句块)

复合语句(代码块)由一对花括号和它包含的语句组成,被视作一条语句。

在代码块中定义的变量只在其中有效。若外部定义了同名变量,则先隐藏,在代码块执行完毕后代码块中的变量消失,外部的变量重新出现。

#include<iostream>

using namespace std;

int main()

{

int x=100;

cout<<“x_out=”<<x<<endl;

{

int x=114514;

cout<<“x_in=”<<x<<endl;

}

cout<<“x_out=”<<x<<endl;

return 0;

}

x_out=100

x_in=114514

x_out=100

▲·逗号运算符:表达式的值为右侧(第二部分)的值。

a=(114,514);

该表达式值为514.

·bool值提升为int:只有0(false)和1(true)两种情况

▲▲·C风格字符的比较

注意:用引号引起的字符串常量也是其地址,word==”mate”比较的是它们地址是否一致

▲▲▲▲▲cstring文件中的strcmp()函数:接受两个char*

如果两个字符串相同,则返回0

以下为对其的解释的2个版本:

①如果第一个字符串按字母排序排在第二个字符串后面,strcmp()返回正数值。(也说按系统排列顺序)在ASCII码中,大写编码都比小写小,大写字母排在前面。

②strcmp()函数是根据ACSII码的值来依次比较 str1 和 str2 的每一个字符直到出现不到的字符,或者到达字符串末尾;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。

如:”Zoo”比”aviary”排在前面,”Physics”与”physics”不一样

检测相等或排列顺序

以下表达式为true的条件:

①str1与str2相等 strcmp(str1,str2)==0

②str1与str2不相等 strcmp(str1,str2)!=0

strcmp(str1,str2)

③str1在str2的前面(此时str1 strcmp(str1,str2)<0

//str1中的字符比str2的字符数值小

④str1在str2的后面(此时str1>str2) strcmp(str1,str2)>0

//str1中的字符比str2的字符数值小

#include<iostream>

#include<cstring>

using namespace std;

int main()

{

char a[]=“Everything”;

char b[]=“Every”;

cout.setf(ios_base::boolalpha);

cout<<“strcmp(a,b)==0 “<<(strcmp(a,b)==0)<<endl;

cout<<“strcmp(a,b)>0 “<<(strcmp(a,b)>0)<<endl;

char c[]=“Anything”;

char d[]=“anything”;

cout<<“strcmp(c,d)==0 “<<(strcmp(c,d)==0)<<endl;

cout<<“strcmp(c,d)>0 “<<(strcmp(c,d)>0)<<endl;

cout<<“strcmp(a,c)>0 “<<(strcmp(a,c)>0)<<endl;

return 0;

}

strcmp(a,b)==0 false

strcmp(a,b)>0 true

strcmp(c,d)==0 false

strcmp(c,d)>0 false

strcmp(a,c)>0 true

·比较string字符串:至少有一个操作数为string

string重载了所有关系运算符

四、while循环

·while循环只有测试条件和循环体:

while (测试条件)

循环体

首先,出现先计算测试条件,如果为true执行循环体。执行完循环体后,程序返回测试条件,若条件为true,继续执行,直到为false退出

·while为入口条件循环

·for循环可以省略括号中的表达式,只需要两个分号,此时括号中有空表达式(语句)。省略测试表达式测试结果为true.

即for(;;) body 和while(true) body 都是死循环。

·实用实例 编写延时循环

头文件:ctime(c语言中为time.h)

// waiting.cpp — using clock() in a time-delay loop

#include <iostream>

#include <ctime> // describes clock() function, clock_t type

int main()

{

using namespace std;

cout << “Enter the delay time, in seconds: “;

float secs;

cin >> secs;

clock_t delay = secs * CLOCKS_PER_SEC; // convert to clock ticks

cout << “starting\a\n“;

clock_t start = clock();

while (clock() – start < delay ) // wait until time elapses

; // note the semicolon

cout << “done \a\n“;

// cin.get();

// cin.get();

return 0;

}

Enter the delay time, in seconds: 2

starting

Done

——————————–

Process exited after 3.258 seconds with return value 0, 3564 KB mem used.

Press ANY key to exit…

Note:上面的斜体加横线是输入的字符,较浅的区块为调试器输出的信息。输入用了1秒多

clock()函数返回程序开始执行后所用的系统时间,返回clock_t类型

CLOCKS_PER_SEC常量是每秒钟包含的系统时间单位数,将系统时间除以该值得到秒数。

即 系统时间/每秒钟系统时间单位数(CLOCKS_PER_SEC)=秒数

所以 秒数*CLOCKS_PER_SEC=系统时间,为以上的实现

类型别名:关键字typedef:格式: typedef 类型名 类型的别名;

此时可以用声明的别名来替代原来的类型名使用。如 typedef char* B_pointer;

使用#define时,若声明了一系列变量,则在文本替换时会出现一些问题:

#define QWORDptr long long*

QWORDptr a,b;

等价于

long long* a,b;

此时a为long long*,b为long long

五、do-while循环

do-while循环是出口条件循环。循环体先执行再判定测试表达式。当测试表达式为假时,退出循环。语法:

do

循环体

while(测试表达式);

注意不要漏了语句后的分号

六、基于范围的for循环(C++11)

示例:

double prices[5] = {4.99, 10.99, 6.87, 7.99, 8.49};

for (double x : prices)

cout << x << std::endl;

该循环显示数组中的每一个值(从prices[0]到prices[4])

能够结合使用初始化列表

for (int x : {3, 5, 2, 8, 6})

cout << x << " ";

cout << ‘\n’;

七、循环和文本输入

1.使用原始的cin

(1)传统停止输入方法:使用哨兵字符,将其作为停止标记.

(2)cin在读取char值时忽略空格和换行符。输入的空格不能回显

(3)cin的输入被缓冲,按下回车键后才会发送内容。

#include<iostream>

using namespace std;

int main()

{

char ch=0;

int total=0;

while(ch!=‘$’)

{

cin>>ch;

total++;

cout<<ch;

}

return 0;

}

What can I do for you?$

WhatcanIdoforyou?$

2.补救

(1)cin.get(ch);读取输入中的下一个字符,包括空格、制表符、换行符。其返回istream&类型的cin(是cin对象的引用,可以继续调用cin的方法)。

注:cin所属的istream类包含了成员get(ch),其子类都有这个方法。

(2)C++中可以有多个同名函数,是函数重载

(3)文件尾条件

①制造文件尾:Ctrl+Z (^Z)

②C++在检测到EOF(END OF FILE,即文件尾),cin将两位(eofbit和failbit)设为1.

cin.eof() 检测到eofbit被设为1,cin.eof()返回true,否则返回false.

cin.fail() 如果eofbit或failbit设为1,则fail()成员返回true

两个函数报告最近读取的结果

cin.clear() 重置输入

③istream对象在需要bool值的地方可以转为bool值(调用转换函数)。若最后一次读取成功,返回true,失败返回false。其比两个成员函数更通用。

④不接受任何参数的cin.get()成员函数返回输入中的下一个字符。该函数到达EOF时返回符号常量EOF,其值被定义为-1.

⑤cout.put(ch)显示一个字符

八、嵌套循环和二维数组

1.二维数组

·定义:每个元素本身就是数组的数组

·声明方法: 元素类型 二维数组名[元素个数][元素个数];

如:int example[2][8];表示example包含两个元素,是两个数组,每个数组中又有8个int

#include<iostream>

using namespace std;

int main()

{

int marks[5][5]=

{

{100,99,100,90,99},

{120,119,117,101,118},

{140,135,145,147,150},

{0,0,1,2,3},

{28,28,30,35,37}

};

for(int i=0;i<5;i++)

{

for(int j=0;j<5;j++)

{

cout<<marks[i][j]<<” \t“;

}

cout<<endl;

}

return 0;

}

100 99 100 90 99

120 119 117 101 118

140 135 145 147 150

0 0 1 2 3

28 28 30 35 37

·初始化:由一系列逗号分隔的一维数组初始化(用花括号括起)。

·嵌套for循环:算法中常见,有内外层循环。可用于输入、打印高维数组。

示例#1:输入二维数组:

for(int i=0;i<5;i++)

for(int j=0;j<5;j++)

cin>>arr[i][j];

示例#2:计算1+(1+2)+(1+2+3)+(1+2+3+4)+……+(1+2+3+……+20)+5

#include<iostream>

using namespace std;

int main()

{

int total=0;

for(int i=1;i<=20;i++)

{

for(int j=1;j<=i;j++)

{

total+=j;

}

}

total+=5;

cout<<total;

return 0;

}

输出:1545______

九、if语句、if-else语句、if-else if-else结构

1.if语句

·语法:

if(测试表达式)

语句

如果测试条件为true,则程序执行语句,如果测试条件为false,程序跳过语句。

测试条件会强制转换为bool值。

整个if语句通常被视为1条语句

1. if-else语句

·语法:

if(测试表达式)

语句1

else

语句2

如果测试条件为true,程序执行语句1,如果测试条件为false执行语句2。整个if-else语句被视作一条语句。

注:在处理字符时,ch++的值仍是char,ch+1却是int

注意:中间如有多条语句,记得使用括号。单独出现else会被认为是错误。

2. if-else if-else结构(if-else语句嵌套)

由if-else扩展而来。如

if (ch == ‘A’)

a_grade++; // alternative # 1

else

if (ch == ‘B’) // alternative # 2

b_grade++; // subalternative # 2a

else

soso++; // subalternative # 2b

如果ch不是’A’,则判断ch是不是’B’,如果不是执行最后的else.

由于C++格式自由,

else可以直接接if。

该结构的常用形式和逻辑如下:

if(条件0)

语句0

else if(条件1)

语句1

……

else if(条件n)

语句n

else

语句n+1

最后一个else可以没有。

十、▲逻辑表达式

·三种逻辑运算符:或or(||)、且and(&&)、非not(!)

1. or(||)

用||将两个表达式连接在一起时,整个表达式的值为真当且仅当其中有一个表达式为真。

关系运算符的优先级比||高。

||是一个顺序点。先修改左侧的值再判定右侧的值。(C++11中说法为左边的子表达式先于右边的子表达式)回顾:分号和逗号也是顺序点。

2. and(&&)

用&&将两个表达式连接起来时,仅当原来的两个表达式都为true得到的表达式才为true.&&的优先级低于关系运算符,且&&也是顺序点。首先判定左侧。

3. 用&&设置取值范围:例:11

注意:1

4. not(!)

!运算符将它后面的表达式的真值取反。即当expression为true,则!expression为false,

当expression为false,则!expression为true.

5. 三种运算符的运算优先级从小到大排列分别为!、&&、||

or、and优先级都低于关系运算符,!的优先级高于任何关系和算术运算符。

note:这些规定与离散数学中的部分规定相似,逻辑运算符优先级参照了命题联结词。

部分示例:

x>5&&x<10判断x是否在5~10之间,!(x>5)判断是否x<=5,!x>5判断!x是否大于5.

age>30 && age<45 || weight>300判断age>30 && age<45或者weight>300是否成立。

6. 其他表达方式:&&可用and替换,||可用or替换,!可用not替换。and、or、not都是C++保留字,在C语言中要引入iso646.h(C语言中不是保留字)

十一、字符函数库CCTYPE

程序示例:右侧是程序输入输出,红框是输入

#include<iostream>

#include<cctype>

using namespace std;

int main()

{

char ch;

int order=0;

while(cin.get(ch))

{

order++;

cout<<“char#”<<order<<endl;

if(isalnum(ch))cout<<“是数字字母”<<endl;

if(isalpha(ch))cout<<“是字母”<<endl;

if(isdigit(ch))cout<<“是数字”<<endl;

if(iscntrl(ch))cout<<“是控制字符”<<endl;

if(islower(ch))cout<<“小写字母”<<endl;

if(isupper(ch))cout<<“大写字母”<<endl;

if(isxdigit(ch))cout<<“是十六进制数字”<<endl;

}

return 0;

}

十二、?:运算符:?:被称作条件运算符,是唯一需要三个操作数的运算符(三目运算符)

通用格式:

条件? 表达式1:表达式2

当条件为真时,整个表达式的值为表达式1;条件为假时,整个表达式的值为表达式2。

该运算符常嵌套进其他语句,可以用来简化if else

十三、switch语句

switch(integer-expression)

{

case label1:statement(s)

case label2:statement(s)

…

default:statement(s)

}

执行switch语句时,程序跳转到integer-expression的值标记的那一行。

注意:①integer-expression必须是一个结果为整数值的表达式。

②每个标签(case后的就是标签)必须是int或char常量(如128或’W’)或是枚举量。如果其不与任何标签匹配,跳转到default处。

③default标签是可选的,若没有匹配的标签和default标签,程序跳转到switch语句的下一条语句。

④case标签只是行标签,不是选项之间的界限。跳转到某一处标签后会执行完下面的所有语句。程序并不会直接在下一个case标签停下⑤使用break语句可以结束switch语句的执行。

note:程序的跳转只是程序跳到了某一位置的语句,然后继续依次执行语句,并不会无缘无故停下。

常用用法:①多标签跳转到同一位置 ②常用“菜单”选定格式

switch(integer-expression)

{

case label1a:

case label1b:

statement(s)

case label2a:

case label2b:

case ……

statement(s)

….

}

switch(integer-expression)

{

case label1:

statement(s)

break;

case label2:

statement(s)

break;

…

default:

statement(s)

break;

}

·使用匿名枚举(用枚举定义常量):enum {枚举量0,枚举量1,……};

十四、break和continue语句

1. break语句结束循环

2. continue语句用于循环当中,跳过循环体余下的代码,开始新一轮循环。

~3.goto语句:跳转到指定标签。即goto 标签名;

标签的用法: 标签名: 语句

note:大部分情况下很少用goto,有些人认为这破坏程序的可读性。只有在一次性跳出多重循环时使用。

3. break和continue示例:

// jump.cpp — using continue and break

#include

const int ArSize = 80;

int main()

{

using namespace std;

char line[ArSize];

int spaces = 0;

cout << "Enter a line of text:\n";

cin.get(line, ArSize);

cout << "Complete line:\n" << line << endl;

cout << "Line through first period:\n";

for (int i = 0; line[i] != ‘\0’; i++)

{

cout << line[i]; // display character

if (line[i] == ‘.’) // quit if it’s a period

break;

if (line[i] != ‘ ‘) // skip rest of loop

continue;

spaces++;

}

cout << "\n" << spaces << " spaces\n";

cout << "Done.\n";

return 0;

}

Enter a line of text:

Let’s do lunch today. You can pay!

Complete line:

Let’s do lunch today. You can pay!

Line through first period:

Let’s do lunch today.

3 spaces

Done.

十五、复合语句应用举例:读取数字的循环

·输入数字发生类型不匹配时会出现的情况:

①变量的值保持不变

②不匹配的输入被留在输入队列中

③cin对象中的一个错误标记被设置

④对cin方法的调用返回false

十六、简单文件输入输出

1. 使用cin输入时,程序把输入视作一系列字节,每个字节都被解释为字符编码。

2. 输入都是字符数据,cin负责将其转换为其他类型,以达到提供输入的结果。

①使用char数据:将输入队列中的第一个字符读取,

②使用int类型:不断读取,直到非数字字符,

③使用double类型:不断读取,直到遇到第一个不属于浮点数的字符

④常规cin输入char数组:不断读取,直到空白字符

⑤cin.getline()输入char数组:不断读取,直到空白字符

3. 输出时,操作相反。浮点数可能转为e表示法

4. 输入一开始为文本,控制台输入为文本文件。

5. 文本文件:每个字节都存储了一个字符编码的文件

6. 不是所有的文件都是文本,数据库、电子表格(excel)以数值格式存储数据。

7. 字处理文件(word)中除了文本信息,可能还有其他信息。

8. 控制台I/O(cmd是控制台)仅适用于文本文件。源代码文件属于文本文件。

·写入文本文件(类比cout)

工具

cout

文件输出

头文件

iostream,定义了一个用于处理输出的ostream类。cout是一个ostream对象(变量)

·引入fstream

·需声明ofstream(由ostream派生而来)对象。方式:ofstream 文件输出流对象名;

名称空间

std

std

使用

使用运算符<<

需要将ofstream对象与文件关联起来,使用的是open()方法。使用完文件后使用方法close()方法关闭。可以像cout那样使用运算符<<

示例:ofstream fout;

fout<<"31 miss Cai"<

fout<<28<<"miss W"<<'\n'<<"fantastic "<<"sing well "<

关联文件时使用open()方法,该方法接受一个C风格字符串作为参数。

boy_which_is_handsome.open(“45_PERSONAL.txt”);

letter.open(“Mr.WuZhehao_to_Miss_Cai.txt”);

fout.close();

▲所有可用于cout的操作都可用于ofstream对象,包括setf()等格式化

在打开文件时,若文件不存在,方法open()新建文件。打开原有的文件时,截断该文件,将其长度变为0,丢弃原有的内容,再输出新的内容。

·读取文本文件(类比cin)

工具

cin

文件输出

头文件

iostream,定义了一个用于处理输出的istream类。cin是一个istream对象(变量)

·引入fstream

·需声明ifstream(由istream派生而来)对象。方式:ifstream 文件输出流对象名;

名称空间

std

std

使用

使用运算符>>

需要将ifstream对象与文件关联起来,使用的是open()方法,该方法接受一个C风格字符串作为参数。使用完文件后使用方法close()方法关闭。可以像cin那样使用运算符>>,可以使用一切cin能用的方法,包括eof()、将其作为测试条件。

示例:ifstream fin;fin>>girlname>>keywords;

检测文件是否成功被打开:使用is_open()方法。成功打开返回true,失败返回false.

·函数exit()的原型是在头文件cstdlib中定义的。exit(返回值)终止程序。cstdlib中的EXIT_FAILURE表示程序失败的返回值。

·good()方法也可以检测文件是否打开[包括eof和文件是否正常输入]。但是检测的问题没有is_open()广。

note:Windows文本文件每行都以回车字符和换行符结尾,通常会在读取时进行转换。部分文本编辑器不在最后一行末尾加上换行符。

·程序读取文件不超过EOF(文件尾)。最后一次读取数据遇到EOF,方法eof()返回true.最后一次读取数据发生内存类型不匹配的情况,方法fail()返回true(有EOF时该方法也返回true).最后一次读取出现意外的问题时,方法bad()返回true。good()方法在没有任何错误时返回true。

·★实用方法:用good()预防输入意外:在循环前(执行循环测试前)放置输入语句,在下次执行循环测试之前放置另一条输入语句。

// standard file-reading loop design

inFile >> value; // get first value

while (inFile.good()) // while input good and not at EOF

{

// loop body goes here

inFile >> value; // get next value

}

或者如下:

while (inFile >> value) // read and test for success

{

// loop body goes here

// omit end-of-loop input

}

第二部分总结

1. for循环的格式

for(初始化语句;测试表达式;更新表达式)

语句

特别地,for(;;)用于编写死循环

2. while循环的格式

while (测试条件)

循环体

特别地,while(true)或while(1)用于编写死循环

3. do-while循环

do

循环体

while(测试表达式);

注意不要漏了语句后的分号

4. 基于范围的for循环(C++11):示例:

for(int x:{3,5,2,8,6}) cout<” ”;

5. 表达式的定义:任何值或任何有效值和运算符的组合,特点:每个表达式都有值。

6. 赋值表达式的值定义为左侧成员的值.应用:几个等号连用.

7. cout.setf(ios_base::boolalpha);用于设置cout在显示bool值时使用true或false,默认情况下bool值显示为数字。

8.当判定表达式的值的操作改变了内存中数据的值时,则该表达式有副作用(side effcet)

9.表达式语句的定义:任何表达式加上分号成为表达式语句,反过来就不对了。

10.判断语句是否为表达式看是否有值,返回语句、声明语句和for、while、do-while等语句都不是表达式语句,因为其没有值。

11.在for循环的初始化部分声明的变量会在离开for后消失。for循环的第一个语句可以是表达式语句,也可以是声明语句。

12.顺序点:程序执行过程的一个点,任何完整表达式后都有一个顺序点,在进入下一步前将确保对所有副作用都进行了评估。即在执行下一条语句前,赋值、递增、递减运算符执行的所有修改都必须完成。

13.完整表达式:不是另一个更大的表达式的子表达式

14.递增递减与指针:前缀格式与解除引用的优先级相同,后缀格式比前缀格式优先级高

15.复合语句(代码块)由一对花括号和它包含的语句组成,被视作一条语句。

16.逗号运算符:表达式的值为右侧(第二部分)的值。

17.字符串的比较和cstring常用函数的总结:

strcpy(目标,源字符串) 复制字符串,

strcat(目标,源字符串) 附加一个字符串到另一个字符串末尾。

strncat()、strncpy()前两个参数同上,第三个参数指出最大复制多少字符

检测相等或排列顺序:strcmp()

如果两个字符串相同,则返回0

如果第一个字符串按字母排序排在第二个字符串后面,strcmp()返回正数值。

以下表达式为true的条件:(可以从按字母排序、按ASCII码排序理解)

①str1与str2相等 strcmp(str1,str2)==0

②str1与str2不相等 strcmp(str1,str2)!=0

strcmp(str1,str2)

③str1在str2的前面(此时str1 strcmp(str1,str2)<0

//str1中的字符比str2的字符数值小

④str1在str2的后面(此时str1>str2) strcmp(str1,str2)>0

//str1中的字符比str2的字符数值小

strchr()的用法:

strchr(字符串,字符);

返回指定字符在字符串中第一次出现的地址。若没有该字符,返回NULL

18. ctime的用法:见正文

19. cin的用法(二)

在检测到EOF(END OF FILE,即文件尾)后,cin将两位(eofbit和failbit)设为1.

方法

说明

cin.eof()

检测到eofbit被设为1,cin.eof()返回true,否则返回false.

cin.fail()

如果eofbit或failbit设为1,则fail()成员返回true

两个函数报告最近读取的结果

cin.clear()

重置输入

istream::operator bool()

转为bool值.若最后一次读取成功,返回true,失败返回false。其比两个成员函数更通用。

cin.get()

返回输入中的下一个字符.到达EOF时返回符号常量EOF(-1)

cout.put(char ch)

显示一个字符

20. cctype:见正文

21. if语句

if(测试表达式)

语句

22.if-else语句

if(测试表达式)

语句1

else

语句2

23.if-else if-else结构(if-else嵌套)

if(条件0)

语句0

else if(条件1)

语句1

……

else if(条件n)

语句n

else

语句n+1

最后一个else可以没有。

24. switch语句结构

switch(integer-expression)

{

case label1:statement(s)

case label2:statement(s)

…

default:statement(s)

}

25.break语句结束循环

continue语句用于循环当中,跳过循环体余下的代码,开始新一轮循环。

25. 文件输入输出:见正文。

发表评论

滚动至顶部