目录
1.for循环是入口条件(entry—condition)循环
2.递增运算符(increment operator)++:操作数的值加一
4.dowhile循环是出口条件(exit condition)循环。
程序需要执行重复操作和进行决策的工具
1.for循环是入口条件(entry—condition)循环
意味着每轮循环前,都计算测试表达式的值
表达式就是由一系列返回数字的东西和操作符组合而成的一段代码,其由于是由操作符组成的,故一定返回值。
for循环不能赋给变量
for循环没有花括号,编译器会忽略缩进,这样只有第一条语句位于循环中。如果在语句块中定义一个新变量,只有在程序执行该语句块中的语句时,变量才存在,执行完语句块,变量被释放。
for (int i=0;i<5;i++){
cout<<"hello"<<endl;
cout<<" value"<<endl;
}
先循环初始化(loop initialization),然后,循环测试(loop test)是否小于5,结果为true,执行循环体(loop body)输出。然后再循环更新(loop update)i再加一。直到测试失败。
循环只执行一次初始化
循环测试中,C++将结果强制转换为bool型,表达式值为0结果为false,循环结束;非零结果为true,循环继续。
#include <iostream>
using namespace std;
int main() {
int x ;
cout << (x = 100) << endl; //为判定,c++肯定会把100赋给x
cout << "x<3: " << (x < 3) << endl;
cout.setf(ios_base::boolalpha);
cout << "x<3: " << (x < 3) << endl;
}
//结果
x<3: 0
x<3: false
cout.setf()函数设置了一个标记,该标记命令cout显示true和false,不是0和1
基于范围的for循环,对数组(或容器类)的每个元素执行相同的操作,也可以修改数组元素。
double arrys[5] = { 21.1,32.8,23.4,2,47.4 };
for (double x : arrys) {
cout << x << endl;
}
for (double &x : arrys) {
x = x * 0.80;
cout << x << endl;
}
//结果
21.1
32.8
23.4
2
47.4
16.88
26.24
18.72
1.6
37.92
2.递增运算符(increment operator)++:操作数的值加一
区分++x 和 x++
x++意味着先使用x的值计算表达式,再将x+1;++x意味着先将x值加一,再使用新的值来计算表达式
对指针的递增或递减,自增或自减运算符是将指针指向增加或减少其指向的数据类型占用的字节数。
前缀递增、前缀递减、解除引用(取值)运算符优先级相同,以从右到左的方式进行结合
后缀递增、后缀递减运算符优先级相同,但比前缀运算符优先级高,以从左到右的方式进行结合。
a++返回值为a,而++a返回值为a+1,如果不需要返回值,推荐使用++a,运行速度会快一些。
*++pt:前缀,先将++应用于pt(因为++位于*的右边),然后将*应用于被递增后的pt
++*pt:前缀,先取得pt的值,再将值加一
(*pt)++:圆括号指出,对指针解除引用,得到取值,再将值递增
*pt++:后缀优先级更高,pt先拿出来用,再加一
double arr[5] = { 21.1,32.8,23.4,2,47.4 };
double* pt = arr;
cout << "*pt =" << *pt << endl;
cout << "*++pt =" << *++pt << endl;
cout << "++ * pt = "<< ++ * pt << endl;
cout << "(*pt)++ = " << (*pt)++ << endl;
cout << " * pt = " << *pt << endl;
cout << "*pt++= " << *pt++ << endl;
cout<< "*pt = " << *pt << endl;
*pt =21.1
*++pt =32.8
++ * pt = 33.8
(*pt)++ = 33.8
* pt = 34.8
*pt++= 34.8
*pt = 23.4
组合赋值运算符
关系表达式不能用于C-风格字符串,能用于string类对象
比较结果为真,值为true,否则为false
关系运算符优先级比算数运算符优先级低
< (小于)
<= (小于或等于)
>(大于)
>=(大于或等于)== (等于)
!= (不等于)
word == "mate";
如果word是数组名,该语句并不是判断两个字符串是否相同,而是查看他们是否存储在相同的地址上。 数组名是数组的地址,用引号括起的字符串常量也是其地址。
3.while循环是入口循环
int i=0;
while (i<10){
cout<<i<<endl;
i++;
}
//结果
0
1
2
3
4
5
6
7
8
9
首先,程序计算圆括号内的测试条件表达式,若为true,则执行循环体中的语句,执行完再评估条件,直到条件false为止。
clock()函数,返回开始执行后所用的系统时间,用来建立延时循环。但是,返回的单位和类型不一定。所以头文件ctime解决该方案。定义了一个符号常量CLOCK_PER_SEC,该常量等于每秒包含的系统时间单位数。秒数乘CLOCK_PER_SEC得到以系统时间单位为单位的时间。
C++建立类型别名的方式两种,一种使用预处理器 #define BYTE char 预处理器在编译程序时将所有的BYTE替换为char。另一种时使用关键字typeof,typeof char byte; byte是char的别名。
4.dowhile循环是出口条件(exit condition)循环。
先执行循环体,再判断测试表达式,决定是否继续执行循环,条件为false,循环终止。
int n;
do{
cin>>n;
}while(n !=7);
5.逐字读取文本
使用循环读取键盘的文本输入,需要知道何时停止读取。一种方法是选择某个特殊字符,也成为哨兵字符(sentinel character),将其作为停止标记。
char ch;
int count = 0;
cout << "#结尾:\n";
cin >> ch;
while (ch != '#') {
cout << ch;
++count;
cin >> ch;
}
cout << endl << count << " charcater read\n";
//结果
#结尾:
see ken run really# to quit;
seekenrunreally
15 charcater read
空格没显示,是因为cin读取时将忽略空格和换行符。
char ch;
int count = 0;
cout << "#结尾:\n";
cin >> ch;
while (ch != '#') {
cout << ch;
++count;
cin.get(ch);
}
cout << endl << count << " charcater read\n";
//结果
#结尾:
see ken run really# to quit;
see ken run really
18 charcater read
如果输入来自文件,则有一种技术——检测文件尾(EOF)。
cin方法检测到EOF时,将设置cin对象中一个指示EOF条件的标记,设置标记后,cin将不读取输入,再次调用cin也不管用。cin.clear()方法可能清楚EOF标记,使输入继续进行。
6.嵌套循环
二维数组既有行又有列,例如int name[4][5];是一个包含4各元素的数组,其中每一个元素都是由5个整数组成的数组。
for ( int i=0;i<10 ;i++){
for(int j=0;j<10;j++){
cout<<name[i][j]<<endl;
}
}