好学的C++第二版(3)

1.使用for循环的额外好处之一是,你可以用它来声明一个其作用范围仅限于for循环本身的变量。这个变量时“临时”声明的,它只能在for循环的内部使用。


2.for语句不要求你必须给出3个表达式(初始化,条件和递增表达式)。如果省略了他们当中的某几个,它们将被忽略。如果忽略了条件表达式,循环条件将被默认解释为“真”,从而创建一个无限循环。

for(;;)
{
//Infinite loop!
}

无限循环一般来说是不好的,但如果在其中安排了某种跳出它的(比如说,通过使用break语句),或许是你所需要的。


3.for(initializer;condition;increment)

   statement


Initializer;

while(condition)

{

   statement

   increment;

}

for循环的行为和之前的while循环几乎完全不一致,唯一的不同是:在一个for循环里,continue语句会在前进到下一个循环周期之前先对循环变量进行递增。


4.for语句的循环条件可以是任意合法C++表达式,其结果可以是TRUE\FALSE值或一个数值,任何非零值都将被解释为true。


5.函数由一组用来完成某种特定任务的相关语句构成。

一个函数可能会有零个或多个输入,并返回一个值。

程序在函数里的运行将一直持续到它遇上return语句为止。


6.按以下套路来创建和调用用户定义函数

(1)在程序的开头部分,声明函数

函数的声明(原型)只提供类型信息

return_type function_name(argument_list);

return_type是一个数据类型,用来表示函数返回值的类型。如果函数不返回任何值,使用void

argument_list是由零个或多个输入参数的名字构成的列表。如果有一个以上的输入参数,要用逗号把它们隔开,在每个输入参数的前面必须给出相应的数据类型。


(2)在程序的某个地方,定义函数

函数定义告诉函数应该做什么。

return_type function_name(argument_list)

{

   statements

}

与声明不同的是分号被替换成了两个花括号之间的零条或多条语句。

return语句将立刻推出函数,它表明这个函数将返回表达式的值;没有返回值的函数也可以使用return语句,但其作用只是提前退出函数。


(3)然后就可以在其他函数里调用这个函数。

函数调用是一个表达式,只要它的返回值不是void,就可以把它用在一个更大的表达式中。


虽然函数声明(原型)可以放在程序里的任何地方,但你应该把它安排在开头。这里的基本原则是在调用某个函数之前必须先声明它。在调用函数之前不必先对它进行定义,这使两个函数的相互调用称为可能。


7.这里使用了一条break语句来提供一种退出机制,一旦用户输入0,这个循环就会终止,而程序也将随之结束。

if(i == 0)
    break;


8.最好把所有的全局性声明都集中安排在程序的开头部分,让它们都出现在第一个函数之前。

任何一个变量的生命周期都是从它被声明的那一刻开始,然后一直延续到文件的结束。同一个类的函数可以共享该类的私有数据,但其他类的函数则不行。


全局变量使得函数可以共享公用数据,但这种共享有可能会导致一个函数对另一个函数产生干扰。因此,除非有明确的必要,否则不要把变量声明为全局变量。


9.函数对它自身的调用称为递归调用。为防止某个函数调用它自身不能停下来,需要提供一种能让它停下来的机制。


一系列的递归调用的情况将被记录到一个栈中。栈是由计算机负责管理的一段专用内存区域,它是一种后进后出的机制,跟踪记录着所有尚未返回的函数调用的相关信息,包括它们各自的输入参数和局部变量(如果有的话)


C++函数可以使用递归——这意味着函数可以调用自身。(两个或多个函数彼此相互调用属于递归的一种变体形式。)只要存在一种能够终结递归调用的最终情况,这个技巧就是合法的。


10.函数有一个void返回值,这意味着它不会返回任何值。但仍需要使用return语句来达到提前退出的目的。

rerurn语句也可以用在void函数里(没有任何返回值的函数),但只起到提前退出函数的作用。

函数将一直运行到它结束或是执行到一条return语句。


11.想通过计算机来生成随机数是一个困难的问题,通过生成一个伪随机序列,即设法获得一个数字并对它进行一系列复杂的转换。


NULL是一个C++预定义值,其含义是一个被设置“查无此处”的数据地址,

它在这里的作用是获取当前系统时间


使用系统时间作为一个种子,也就是伪随机系列里的第一个数

srand(time(NULL));


12.加法赋值操作符(+=)提供了一种简明的办法来把一个值加到一个变量上。

n += 50; // n = n + 50


13.引用你忘记对它进行初始化的变量会产生垃圾数据(无意义数据)。

你可以在声明变量的同时对它进行初始化,即使你在同一行声明了多个变量也是如此。


14.如果某个变量或数组是全局的,C++会默认地把它初始化为0。(对于数组,C++会把每一个元素都初始化为0。)但局部变量享受不到这种待遇,如果你没有初始化它们,它们将包含随机数(垃圾数据)


15.无论你如何声明一个数组,最大下标值永远是数组长度减去1.

C/C++里的数组下标值不是某种顺序编号(对应着某个位置),而是一个偏移量。也就是说,某给元素的下标值是该是该元素距数组起始点的距离量度。

从起始点算起,第一个元素的偏移量当然是零,所以第一个元素的下标值就是0。


在一个包含N个元素的C++数组里,下标是从0一直排到N-1


所有程序,无论它们是用什么语言编写的,最终都必须翻译成机器语言才能由CPU执行。

在机器级别,数组下标是通过偏移量来处理的。一个寄存器(CPU自带的一小块内存)存放着某个数组的地址,其实就是第一个数组元素的地址;另一个寄存器存放着一个偏移量,即到某给定数组元素的距离。

第一个元素的偏移量是0


16.数组被初始化为全零值是因为它有一个静态(static)存储类。

你也可以把某个函数的局部变量声明为静态的,这将使得它们在该函数的前、后两次调用之间保有它们的值,但它们在该函数的外部仍将是不可见的。


16.给下标等于r的那个数组元素加上1

  hits[r]++;

好学的C++第二版(3),布布扣,bubuko.com

好学的C++第二版(3)

上一篇:mysql的两张表有两个且两张表都有两个主键时,mybatis需要resultMap需要调整


下一篇:Centos 6.4下安装Python 3.3.4