第5章——循环和关系表达式

来源:互联网 发布:linux date格式化输出 编辑:程序博客网 时间:2024/06/05 06:15
 

l         for循环

for(initialization;text-expression;update-expression)

       body

C++将整个for看作一个语句。C++并没有将test-expression的值限制为只能为真或假。可以使用任意表达式,C++将把结果强制转换为bool类型。因此值为0的表达式将被转换为bool值false.

 

C++表达式是值或值与操作符的组合,每个C++表达式都有值。从表达式到值的转变是很小的一步,只要加一个分号就可以完成。

 

在C++中允许在循环的初始化部分中声明变量。即允许这样做:for(int i=0;i<5;i++)

使用for循环访问字符串:

string word;

cin>>word;

for(int i=word.size()-1;i>=0;i--)

 

副作用(side effect)指的是计算表达式时对某些东西(如存储在变量中的值)进行了修改;顺序点(sequence point)是程序执行过程中的一个点,进入下一步之前确保对所有的副作用都进行了评估。在C++中,语句的分号就是一个顺序点。任何完整的表达式末尾都是一个顺序点。完整的表达式:不是别一个更大表达式的子表达式。有如下语句:y=(4+x++)+(6+x++);表达式4+x++不是一个完整的表达式,因此以C++不保证x的值在计算子表达式4+x++后立刻加1.整条赋值语句是一个完整的表达值,而分号标记了顺序点,因此C++只保证程序执行到下一条语句之前,x的值将被递增再次。

 

x++与++x,虽然选择前缀格式还是后缀格式对程序的行为没有影响(for循环的更新表达式中),但是对执行速度有细微的差别。原因是在对类操作时,后缀格式会先拷贝一个类,然后将复制的拷贝返回。而前缀格式不存在拷贝。前缀的版本效率更高一些。

 

语句块允许把两条或更多语句放到按C++语句只能放一条语句的地方,逗号操作符完成对表达式同样的任务。如for循环中更新表达式中,同时放入i++,j++等。

l         关系表达式

关系操作符的优先级比算术优先级低。

如果word 为数组名,要知道字符数组word中的字符是否是mate用

       word==”mate”

这个式子实际上表达的是字符串mate的首地址与word数组首地址是否相同。答案是肯定不一样了。

因此不能用关系操作符来比较字符串,但可以比较字符。比较字符串可以用strcmp()函数。例如:strcmp(word,”mate”)!=0

字符串不相等,该语句的值为1(true),如果字符串相等,则该语句的值为0(false)。

如果在word==”mate”中,word为string类对象,则可以进行字符串比较。因为string类会重载==操作符。使用关系操作符比较字符串条件:至少有一个操作数为string对象,另一个操作数可以是string对象,也可以是C-风格字符串。

l         while循环

测试字符是否为空

while(name[i]!=’\0’)

和while(name[i])等效

 

ANSI和C++库中有一个函数clock(),返回程序开始执行后用的一个时间计数。在头文件ctime中,定义了一个符号常量CLOCKS_PER_SEC,该常量等于每秒钟包含的系统时间单位数。

例,clock_t start=clock();

while(clock()-start<delay);

 

建立别名方式有两种:

1.#define typename aliasname

2.typedef typename aliasname

用第一种建立的别名不能用来声明一系列变量,但是第二种可以。

l         循环和文本输入

cin读取char值时,与读取其它类型一样,cin将忽略空格和换行符。如果不想忽略可以使用cin.get(ch)。即只带一个参数的get()方法。

 

在C语言中,要修改变量的值,必须将变量值的地址传给函数。但是C++中只要将函数参数声明为引用即可。如cin.get(ch)中,在C中要传递&ch,而在C++中传递ch即可。

l         文件尾条件

在多数操作系统中,允许通过键盘来模拟文件尾条件。

DOS中:CTRL+Z、ENTER

UNIX:CTRL+D

WINDOWS:CTRL+Z、ENTER

检测到EOF后,cin将两位(eofbit和failbit)都设置为1.。可以通过cin.eof()查看eofbit位。如果eofbit或failbit为1,cin.fail()返回true.

cin.clear()可以清除EOF标记。

 

常见的字符输入做法

while(cin.fail()==false)

while(!cin.fail())

while(cin)

while(cin.get(ch))

 

 

cin总结:根据第4,5章对cin的介绍可以知道:单用cin处理输入流时,一般使用以下格式cin>>var,如果var是一个数组,将会只能接收一个单词。cin本身会去除输入流中的空格和换行符。如果使用get()方法,有参数的话,参数中需要指出输入流接收的位置,是字符,还是数组,是数组还要指明接收大小。因为cin会将换行符放到输入队列中,所以有时会引起再次输入的麻烦,可用不带参数get()方法,将换行符丢掉。

最后说明enter(换行)与eof,按下enter后,缓冲区中的字符才会交给程序去处理。表明字符只输入了一部分。eof是一个文件结尾标志,如果有了eof,缓冲区中的字符也会交给程序去处理,但是处理完后会转向其它的程序处理,表明字符输入完毕。 

原创粉丝点击