循环是程序的主要操作之一,循环最主要的功能之一就是简化代码,另外就是通过嵌套啊什么的可以实现很多算法。c++ primer plus第五章介绍了循环和关系表达式的基本用法。
其实这一章非常简单,主要是介绍or循环,while循环和do while循环的用法和区别,外加if语句和switch语句。但是本章也涵盖了很多小知识,还是可以细细体味的。
首先从for循环开始,for循环的基本结构为:
for (initialization; test-expression; update-expression)
body;
这个没用过循环的看起来可能有点晕,举个例子
int a = 0;
for (int i = 0; i<5; i++)
{
a = i;
cout << a << endl;
}
可以理解为以下几个步骤
1. 设置初始值。上例中也可以把int a=0 放在(和第一个分号之间。循环之执行一次初始化,通常程序使用这部分来将变量(i)设置为起始值,然后用i来计算循环周期。
2.执行test-expression测试,看看循环是否应当继续进行。上例中就看i小不小于5,如果小于5,进行下一步
3.执行循环操作,即{ } 中的代码;如果{ } 只有一行代码,可以不写大括号。
4.{ }中的代码执行完之后,返回到update-expression,更新用于测试的值(本例中i自加一个1);也可以更新其他变量,比如上例也可以添加a++(这里添加这个语句没什么意义)
5.再次执行test-expression测试,如果返回值为true,接着循环,直到返回值为false(比如上例中循环五次之后,i变成了5,循环就到此结束了,程序开始执行}以后的代码。
像i<5这样的被称作关系表达式,区别与赋值表达式(例如x = 5;)。关系表达式将被判定为bool值true或者false。
上例中还有一个需要记住的是i这个变量只存在循环周期,如果循环结束,则i会自动消失,不能再被继续调用。
循环最常用的地方就是访问数组的每个元素,如:
int array[10];
for (int i=0;i<10;i++)
array[i] = i;
看到这里可能很多人会问++是啥呀。这里就要介绍递增运算符++和递减运算符--:将变量加1或者减1。 问题是这两种运算符即可以放在变量前面(++i),也可以放在变量后面(i++),两个版本还有点区别。
简单的说,i++意味着使用i当前值计算表达式,然后将i的值加1;++i则先将i的值加1,然后使用新的值来计算表达式:
int i = 5; int a = ++i; // a = 6; i = 6;
int i = 5; int a = i++; // a = 5, i =6;
但关键这只是简单的说,具体情况就很复杂了,比如x = 2 * x++ * (3- ++x)...这就很变态了,但好的是也没人会这么写。但是经常会出现这样的情况
for(n = lim; n>0; --n)
for(n = lim; n>0; n--)
这个时候是没有任何区别的,但执行速度可能有细微的差别。
总之这些差别要慢慢理解了,这里就不详讲了。
递增和递减运算符都可以运用到指针上,但运用是也要小心
int arr[5] = {1, 2, 3, 4,5};
int * p = arr; //这时候p指向arr[0];
++p; //这时候p指向arr[1];
(*p)++;//这时候指arr[1]自加1
x = *p++; //++运算优先级高,所以p首先指向arr[2],然后将arr[2]的值赋给x,所以x=3;
组合运算符+=, -+, *=, /=, %=, 举个例子估计大部人就懂了
i*=a; 和i = i*a效果一样,只是看起来比较简单而已。
前面介绍了关系表达式,既然是比较大小,肯定不止大于和小于了,下面是所以关系运算符
< 小于
<= 小于或等于
== 等于 (注意和赋值表达式等于的区别
> 大于
>= 大于或等于
!= 不等于
数字好理解,char也好理解,那么有的时候也需要比较那有怎么办呢?(比如判断一个名字是不是跟另外一个名字相同)
如果是c风格字符串,需要调用cstring中的strcmp(cstr1, cstr2)函数来比较cstr1 和cstr2是否相同。注意如果相等返回的是false,不同才返回true!
如果是string呢,则可以用==或者!= 来判断了