C++ Primer Plus 笔记第五章

 

for循环的组成部分:

   1. 设置初始值。

   2. 执行测试,看看循环是否应当继续进行。

   3. 执行循环操作。

   4. 更新用于测试的值。

表达式和语句:

   表达式:任何值和任何有效的值和操作符的组合都是表达式。每个C++表达式都有值。

   语句:所有表达式加上分号,都可以成为语句。有的没有意义。

副作用和顺序点:

   副作用:指在计算表达式时对某些东西(存储在变量中的值)进行了修改。

   顺序点:程序执行过程中的一个点,进入下一步之前将确保对所有副作用都进行了评估。

前缀和后缀格式:

1 for (n = lim; n > 0; --n)
  . . .;
2 for (n = lim; n > 0; n--)
  . . .;

   因为表达式(--n和n--)中的值均为被使用,只存在副作用。两条语句最终效果相同。

   执行效率上有略微的差别,前缀版本效率较高。

递增/递减操作符和指针:

   前缀递增、前缀递减和解除引用操作符的优先级相同,以从右向左的方式进行结合;

   后缀递增和后缀递减的优先级高于前缀操作符 ,从左到右的方式结合;

double arr[5] = {21.1, 32.8, 23.4, 45.2, 37.4};
double *pt = arr;           // pt指向arr[0],to 21.1

++pt;              // pt指向arr[1],to 32.8    

*++pt;             // *(++pt) 23.4

++*pt;             // ++(*pt) 24.4

(*pt)++;            // 25.4 pt仍指向arr[2]

*pt++;             // 后缀操作符'++'的优先级更高,所以'++'的操作符用于pt,*pt++的值为25.4,pt指向arr[3]的地址

组合赋值操作符

   eg:   +=  /=  -=  *= :

    将结果赋给左侧操作数

关系表达式:

   C++提供6种关系操作符来对数字、字符(ASCII码)和string类对象进行比较(不能用于C-风格字符串):

    操作符      <       <=        ==     >       >=        !=            

    含义         小于        小于或等于    等于     大于       大于或等于     不等于

C-风格字符串比较:

   strcmp() 函数接收两个字符串地址作为参数,参数可以是指针、字符串常量或者字符数组名。

     strcmp(a,b) 头文件cstring:

      如果两个字符串相同,该函数返回零;

      如果a > b,返回一个正数;

      如果a < b,返回负数  

    char字符变量可以使用递增操作符和递减操作符,因为char类型实际上是整型。(ch++,ch--)

比较string类字符串:

   sting类字符串,类的设计能使用关系操作符进行比较;

While循环:

   while循环没有初始化和更新部分的for循环,只有测试条件和循环条件:

    while ( test_condition )

      body

   与for循环一样,while循环也是一种入口条件循环

for与while:

   for与while本质相同;

   使用for循环来为循环计数,for循环允许将所有相关信息—初始值、终止值和更新计数器放在一个地方;

   在无法预知循环将执行的次数时,程序员常使用while循环

等待一段时间:编写延时循环

   clock():返回程序开始执行后所用的系统时间,

    问题一:clock() 返回的时间不一定是秒;

    问题二:函数的返回类型下某些系统上可能是long,unsigned long或其他类型

   头文件ctime提供了这些问题的解决方法:

    解决问题一:定义符号常量:CLOCK_PER_SEC  每秒钟包含的系统时间单位数

    解决问题二:将clock_t作为clock() 返回类型别名,把变量声明为clock_t

   waiting.cpp

 1 #include <iostream>
 2 #include <ctime>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     cout << "Enter the delay time, in seconds: ";
 8     float secs;
 9     cin >> secs;            
10     clock_t delay = secs * CLOCKS_PER_SEC;    
11     cout << "staringa
";
12     clock_t start = clock();
13     while(clock() - start < delay)
14      .
15      .
16      .
17     cout << "done a
";
18     return 0;
19 }

   改程序以系统时间为单位(而不是秒)计算延迟时间,避免了在每轮循环中将系统时间转换为秒

类型别名:

   C++为类型创建别名的方式有两种:

   使用预处理器: #define BYTE char            // 将BYTE声明为char类型别名

   使用typedef:    typedef char byte;  

    通用格式:typedef typeName aliasName;  // 将aliasName声明为typeName类型的别名 

         typedef char* byte_pointer;       // 将byte_pointer声明为 char指针别名

   typedef是一种更加的选择——有时候也是唯一的选择

   注意:typedef 不会创建新类型,只是为已有的类型创建别名

do while循环:

   do while 是出口条件循环,先执行循环体,再判定测试表达式,决定是否继续执行循环;

    eg:

      do

      {

        cin >> n;

       } while( n != 7);

     程序必须先进入循环体获得输入。

循环和文本读取:

   使用原始的cin进行输入:

   程序清单    testin1.cpp

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char ch;
 7     int count = 0;
 8     cout << "Enter characters; enter # to quit: 
";
 9     cin >> ch;
10     while( ch != '#')
11     {
12         cout << ch;
13         ++count;
14         cin >> ch;
15     }
16     cout << endl << count << "characters read
";
17     return 0;
18 }

     cin在读取char值时(cin >> ch),与读取其他基本类型一样,忽略空格和换行符;

     操作系统回显输入:see ken run#really fast  <Enter>;

     测试程序回显输入:seekenrun;

      发送给cin的输入被缓冲,回车后,输入内容被发送给程序

使用cin.get(char)进行补救:

   字符读取程序要检查每个字符,包括空格、制表符和换行符。cin所属的iostream类中包含成员函数cin.get (ch) 读取输入中的下一个字符赋给变量ch;

   替换 textin1.cpp 中 cin >> ch :

   

 1 #include<iostream>
 2 using namespace std;
 3  
 4  int main()
 5 {
 6      char ch;
 7      int count = 0;
 8      cout << "Enter characters; enter # to quit: 
";
 9      cin.get(ch);
10      while( ch != '#')
11      {
12          cout << ch;
13          ++count;
14          cin.get(ch);
15      }
16      cout << endl << count << "characters read
";
17      return 0;
18 }

    头文件 iostream 将 cin.get (ch) 函数原型的参数声明为引用类型,因此该函数可以修改其参数的值

cin.get 函数重载:

   C++支持被称为函数重载的OOP特性——允许创建多个同名函数,参数列表不同

   cin.get ( name, ArSize ):编译器使用接受参数 char* 和 int 版本;

   cin.get (ch):编译器使用接收一个参数 char 版本 ,返回一个cin对象; cin.get(ch1) .get(ch2);

   cin.get():不接收任何参数的成员函数返回输入中的下一个字符,ch = cin.get (),将字符编码作为 int 值返回 

文件尾条件EOF:

   while ( cin.fail () == false )             // 检测EOF

   常见的字符输入做法:

    cin.get (ch);

    while ( cin.fail() == false)  or  while ( !cin.fail() )         or   while ( cin.get( ch) )

    {

      .  .  . 

      cin.get ( ch );

    } 

   cin.get( char ) 返回值是一个cin对象,iostream类提供一个将istream对象转换为bool值的函数

  

   

   

原文地址:https://www.cnblogs.com/kidycharon/p/9660407.html