C++语句

来源:互联网 发布:软件著作权版本号 编辑:程序博客网 时间:2024/06/07 07:16

简单语句和复合语句

1、  最简单的语句是空语句,空语句被用在“程序的语法上要求一条语句,而逻辑上却不需要的时候”,意外出现的多余空语句并不会产生编译错误。

2、  复合语句是由一对花括号括起来的语句序列,复合语句被视为一个独立的单元,它可以出现在任何单个语句可以出现的地方。复合语句不需要用分号作为结束,这是一种附加的语法上的便利,空复合语句和空语句等价。

声明语句

1、  在C++中,对象的定义,如:intw;被视为C++语言的一条语句(称作声明语句),一般它可以放在程序中任何允许语句出现的地方。

IF语句

1、  语法形式:if(条件)

           语句

条件可以是表达式或是一条具有初始化功能的声明语句,在条件中定义的对象,只在与if相关的语句或语句块中可见。

2、  在使用if语句时,一个普遍的错误是:当条件为true时,并且必须执行多条语句时,我们往往忘记提供复合语句。

3、  If-else语句引入一个二义性问题,称为空悬问题,这种问题出现在当if子句多于else语句时,在C++中规定:else子句与“最后出现的未被匹配的if子句”相匹配。

SWITCH语句

1、  深层嵌套的if else语句常在语法上是正确的,但逻辑上并没有正确表达程序员的意图。C++提供了switch语句,作为一种“在一组互斥的项目中的选择”的替代方法。

2、  为了解释switch的用法,我们考虑下面的问题:要求记录每个元音字母在随机的文本段中出现的次数。程序逻辑如下;

l  按顺序读取每个字符知道没有字符为止

l  把每个字符同元音字母集合作比较

l  如果字符同某个元音字母匹配,则该元音计数加1

l  显示结果

Switch语句由以下部分构成:

Ø  关键字switch,后面是一个要被计算的表达式,表达式被放在括号中。在本例中是被读取的字符。例如:

Char ch;

While (cin>>ch)

Switch ch

Ø  一组case标签,它由关键字case后接一个常量表达式及冒号构成。此常量表达式将被用来与switch表达式的结果作比较,在本例中,每个case标签代表一个元音字母。例如:

Case ‘a’:

Case’e’:

Case ‘i’:

Case ‘o’:

Case ‘u’:

Ø  与一个或一组case标签相关联的语句序列。例如,为了累加每个元音字母的出现计数,我们提供了将元音字母计数递增1的赋值表达式。

Ø  可选的default标签。Default标签也被看做一个else子句。如果switch表达式与任何一个case标签都不匹配,则default标签后面的语句被计算。如果我们希望知道非元音字母的个数,则可以增加如下default标签和语句:

Default:

++non_vowel_cnt;

关键字。case后面的值必须是一种整数类型的常量表达式。否则会导致编译出错。

Case 3.14:    // 错误:非整数

Case ival;    //错误:非常量

任意2个case标签不能有同样的值,否则会导致编译出错

3、 switch表达式可以是任意复杂的表达式,包括函数调用的返回值。它的值与每个case标签相关联的值作比较,直到某个匹配成功或全部标签比较完毕。如果匹配到某个标签,则程序从其后的语句继续执行,否则程序从switch语句后面的第一条语句继续执行。

4、 普遍的误解:只有被匹配的case标签相关联的语句才被执行。实际上,程序从该点开始执行并继续越过case边界直到switch语句结束。所以我们通过指定一个break语句来终止switch语句。然后控制权被转移到紧跟在switch结束花括号后面的语句上。

5、 在大多数情况下,故意省略break语句的case标签应该提供一个注释。如果两个或多个值由相同的动作序列来处理,允许程序执行多个标签,典型的作法是,我们把case标签一个接一个堆起来,例如,我们希望记录原因字母的总数。

Int vowelcnt=0;

Switch(ch)

{//任何一个原因字母出现都会递增1

Case ‘a’:

Case’e’:

Case ‘i’:

Case ‘o’:

Case ‘u’:

++ vowelcnt;

Break;

}

6、 声明语句也可以放在switch语句的条件中,如下所示、:switch(int ival =get_response())这里ival被初始化,并且该初始值成为与每个case标签作比较的值。Ival在整个switch语句中是可见的,但在其外面并不可见。

7、 把一条声明语句放在与case或default相关联的语句中是非法的,除非它被放在一个语句块中。例如以下代码会在编译时刻错。

Caseillegal_definition:

String file_name=get_file_name();

Break;

如果一个定义没有被包围在一个语句块中,那么它在case标签之间是可见的 ,但是只有定义它的case标签被执行时,它才能被初始化。因此需要一个语句块来保证名字是可见的,并且只有这个语句块才能够使用它。为了使程序通过编译,必须引入语句块,重新实现case标签如下:case OK:

                     { Stringfile_name=get_file_name();

                        Break;

}             

For循环语句

1、 for和while循环首先进行条件的真值测试。这意味着这2个循环都可以在相关语句还没有被执行的情况下就终止了。而do_whliez循环,保证语句或语句块至少被执行一次,在这些语句被执行之后才进行条件测试。

2、 for循环最普遍的用法是遍历一个定长的数据结构,如数组或vector。语法形式如下所示、:for(初始化语句;条件;表达式)

       语句

u  初始化语句:可以是声明语句或表达式,一般它被用来对一个再循环过程中递增的变量进行初始化,或者赋给一个起始值,如果不需要初始化或它已经在别处出现,可以省略。在这里可以定义多个对象,但只能出现一个声明语句,因此所有对象都必须是相同的类型。

u  条件语句:用作循环控制,条件语句计算结果为true多少次,则语句就执行多少次,如果条件的第一次计算结果为false,语句则从不被执行。它的最终计算结果必须为false,否则循环将永远不会停止。在for循环体条件中定义的对象的可视性局限在for循环体内。

u  表达式:在循环每次迭代后被计算,一般用它来修改在初始化语句被初始化的、在条件中被测试的变量。如果条件的第一次计算结果为false,则表达式从不被计算。

While语句

1、 while循环的语法形式:while(condition)

                        statement

condition(条件)计算结果为true多少次,则循环就迭代多少次,语句或语句块就执行多少次。如果condition第一次计算结果为false,则statement永远不会执行。While循环的condition可以是表达式、初始化定义。

Do while 语句

1、 语法形式:do

                Statement

          While(condition);

不像其他循环,do while 循环的条件部分不支持对象定义,声明语句,因为只有在语句或语句块首先被执行后,条件部分才被计算。

Break语句

1、 break语句终止最近的while、do while、for或switch语句。语句的执行权被传递给紧接着被终止语句之后的语句。如果一个break语句出现在if语句的内部,但是并不包含在switch或循环语句中,那么这样的break将导致编译错误,一般来讲,break只能出现在循环或switch语句中,当break出现在嵌套的switch或循环语句中,里层的switch或循环语句被终止并不影响外层的switch或循环。

Continue语句

Continue语句导致最近的循环语句的当前迭代结束,执行权被传递给条件计算部分。不像break语句终止的是整个循环,continue语句只终止当前的迭代。Continue语句只有出现在循环语句中才是合法的。

链表示例

1、 链表是一个数据项数列,每个数据项都包含一个某种类型的值和链表下一项的地址,地址可以为空,链表也可以为空,即链表中可以没有数据项,链表不可能为满,当程序的空闲存储区被耗尽时,试图创建一个新链表会失败。

2、 链表支持的操作:插入insert、删除remove、查找find、查询链表的长度size、显示display链表,比较2个链表是否相等equality、翻转reverse链表、连接concatenate2个链表。

3、 Size()最简单的实现是迭代链表,返回所遍历的元素的个数。复杂一点的实现是将长度作为一个数据成员储存起来。Size()的第二个实现效率很高,只是简单地返回相关联的成员。额外的复杂性是每次插入或删除一个元素时,都需要更新这个成员。我们选择第二个方案,把元素个数保存在数据成员_size中,并且在必要时更新这个数据成员。我们的假设是用户可能会频繁的查询size(),因此它必须足够用快。(把共有借口和私有实现分离的好处之一是,如果我们的假设被证明是错误的,那么可以给出一个新的实现,而不必改变size()的程序,只要保持同样的返回值类型和参数表。)

4、 Insert()操作有2个参数,指向一个已存在链表的指针,以及一个新值。新值被插入到这个已存在元素之后。例如给出链表:11238

如下调用:mylist.insert(pointer_to_3,5);将把链表修改为112358

为了做到这一点我们向用户提供一种方法来访问某个特定的数据项的地址,例如前面例子中的3.一种方法是通过find()操作。

pointer_to_3=mylist.find(3);

find把待搜索的值作为他的参数。如果这个元素存在,则find返回指向该元素的指针,否则返回0.

如果是链表头和链表尾插入,只需指定被插入的值:

Insert_front(value);

Insert_end(value);

5、 删除操作包括:删除单个值、删除最前面的元素、删除所有元素。

Remove(value);

Remove_front();

Remove_all();

6、 display()操作为链表提供一个格式化的输出,包括链表的长度以及每个元素,空链表显示如下:(0)()

有7个元素的链表显示为:(7)(0 1 1 2 3 5 8)

7、 reverse()只是翻转元素的顺序,例如在调用:mylist.reverse();之后,前面的链表显示为:(7)(8 5 3 2 1 1 0)

8、 连接操作,已知链表1为:(4)(0112)链表2为(3)(234)如果进行操作list1.concat(list2);之后,list1被修改为(7)(0112234)

 

0 0
原创粉丝点击