《C++ Primer Plus》读书笔记之三—循环与关系表达式
第五章 循环与关系表达式
1、表达式是值或者值与操作符的结合,每个C++表达式都有值。表达式到语句的转换只要加一个分号就可以完成。但是,反过来,从语句中删除分号,并不一定能将它转化成表达式。
2、前缀与后缀操作符:虽然选择使用前缀还是后缀对程序的行为没有影响,但执行速度可能有细微的差别。对于内置类型和当代编译器而言,这看似不是什么问题。然而,C++允许您针对类定义这些操作符,在这种情况下,用户这样定义前缀函数:将值加1,然后返回结果;但后缀版本首先复制一个拷贝,将其加1,然后将复制的拷贝返回。因此,对于类而言,前缀版本的效率比后缀版本高。
3、递增/递减操作符和指针:前缀递增、前缀递减和解除引用操作符(*)的优先级相同,以从右往左的方式进行结合。后缀递增和后缀递减的优先级相同,但比前缀操作符的优先级高,这两个操作符以从左往右的方式进行结合。例如:
*++p ;先将++应用于p,然后将*应用于被递增后的p
++*p;先取得p的值,然后将这个值加1,p指向不变
(*p)++;先对指针解除引用,然后将++应用于解除引用的这个值,p指向不变
*p++;后缀操作符优先级更高,这意味着将操作符用于p,而不是*p,因此对指针递增。然而后缀操作符意味着将对原来的地址而不是递增后的新地址解除引用,但语句执行完毕后,p的值将递增一个。
4、逗号操作符的优先级是最低的,逗号表达式的值是最后一个表达式的值;关系操作符的优先级比算术运算符低,所以有:
x+3>y-2等价于(x+3)>(y-2)
5、任何有效的表达式都可以用作for循环的测试条件,非零值为true,零值为false(用在for循环犯错了,死循环)
6、C-风格字符串的比较:strcmp()函数,该函数接受两个字符串的地址作为参数。这意味着参数可以是指针、字符串常量或者字符数组名。相同,返回0;第一个大,返回负数;第二个大,返回正数。
7、string类字符串的比较:使用关系操作符。因为类函数重载了这些操作符。
8、假如有char ch;然后用cin>>ch;输入了一个字符串,当用cin一个一个字符的读入的时候,cin将忽略空格和换行符接着往下读。但是!如果我们不想忽略空格呢?赶紧用cin.get(ch);来补救。具体地说,成员函数cin.get(ch);读取输入中的下一个字符(即便它是空格),并将其赋给变量ch。注:①发送给cin的输入被缓冲。这意味着只有用户按下回车键后,他输入的内容才会被发送给程序。②头文件iostream将cin.get(ch)的参数声明为引用类型,为的就是能在过程中修改ch的值!按值传递的话不能修改ch的值!!
9、文件尾条件(EOF):检测到EOF后,cin将两位(eofbit和failbit)都设置成1.可以通过成员函数eof()来查看eofbit是否被设置;如果检测到EOF,则cin.eof()将返回true,否则返回false。同样,如果eofbit或者failbit被设置成1,则fail()成员函数返回true,否则返回false。
while(cin.fail()==false) // test for EOF 或者while(!cin.fail()) 或者 while(cin) // while input is successful 这个更通用
注:cin.get();返回输入中的下一个字符;cin.get(ch)方法的返回值是一个cin对象。不过当cin出现在需要bool值的地方(如while循环的测试条件中)时,istream类调用可以将istream对象(cin)转换成bool值的函数!!