先上代码:
#include <iostream> using namespace std; int main() { double price[5] = { 1.1,2.2,3.3,4.4,5.5 }; for (double a : price) cout << a << endl; system("pause"); return 0; };
输出:
1.1 2.2 3.3 4.4 5.5 请按任意键继续. . .
总结:
①for (double a : price)这一行代码,
指的是初始化一个double类型的变量a,
这个变量a在数组price中,初始为price[0],即数组第一个元素,
然后执行一次循环后,a++,于是price[0]变price[1],即数组第二个元素;
每执行一次循环,都会往后推一位,直到成为数组最后一个元素;
当再次判断时,发现已经超出数组范围了,比如说5个元素,但他已经是数组第6个元素了,于是循环结束。
再简单理解就是,这个变量a在循环体第n次执行时,是price的第n个元素;
当n大于数组个数时(即不在数组成员范围内),循环结束。
无论数组中有没有这个数,这个变量a都会是数组中相应位置的元素。
这个循环相当于:
double a; //double a:pirce变成第一句是double a for (i = 0;i < 5;i++) //第二句是i=0;i<5;i++ 。注:<5的5,是数组的元素个数。 { a = price[i]; //第三句是a=price[i] cout << a << endl; //这行不变 }
即,一行double a:price是三行代码的缩写:
第一行是循环外的double a; ;
第二行是循环初始化+判断语句+循环更新,其中判断语句中的5,是数组元素个数;
第三行是a=price[i]; 即给a每轮赋值。
②double a:price 中的a,是不影响判断语句的,因此,a是可以进行操作的。比如对a进行加减乘除。
③对变量a进行操作,不影响原来数组的值。
④也可以通过地址,对原来数组中的值进行操作。如代码:
for (double &a : price) { *&a = 0.8*a; //或a=0.8*a cout << a << endl; }
在第一行代码中,因为price是一个数组,数组名实际是一个地址,
在之前,当a=price[0]的时候,a=price[0]的值,即1.1;
当&a=price[0]的时候,&a是price[0]所在的内存地址,而*&a是内存地址解除引用。实际上就相当于这个内存地址储存的值。
另外:也可以直接用a=0.8*a;来对数值进行操作。
在执行第一次循环的时候,&a=price[0]; a是操作price[0]的值。
当第二次循环的时候,&a=price[1]; a操作的是price[1]的值。
简单的记忆,就是在类型名和变量名中间加入地址符号&,
然后在操作的时候,使用*&变量名的形式进行操作。
⑤书上的解释:
for (double &a : price) { *&a = 0.8*a; //或a=0.8*a cout << a << endl; }
符号&表示a是一个引用变量。就这里而言,这种声明可以让接下来的代码可以修改数组的内容。
⑥变种:
代码可以改为:
for (double a : { 1.1,2.2,3.3,4.4,5.5 }) { a = 0.8*a; cout << a << endl; }
a=0.8*a;可以让下一行输出的a为0.8*数组中对应元素的值。