1 for循环
很多情况下都需要程序执行重复的任务,如将一首诗歌打印50遍。c++中的循环可以轻松地完成这种任务,解放了我们的重复性工作。
1.1 for循环的组成部分
for循环包括下面4个步骤:
- 设置初始值;
- 执行测试,看看循环是否应当继续进行;
- 执行循环操作;
- 更新用于测试的值;
/*
* init-expression:初始化表达式
* test-expression:测试表达式
* update-expression:更新表达式
* body:循环体
*/
for(init-expression;test-expression;update-expression)
body
注意点:
- 初始化表达式只执行一次
- for循环时入口条件循环,这意味这在每轮循环之前,都将计算测试表达式的值
- 测试表达式一般是关系表达式,当结果为true(真)时,执行循环体,反之当结果为false(假)时,跳出循环体。
- 更新表达式一般是在循环体执行完之后再执行,更新表达式可以是任何有效的表达式
1.2 知识点扩展
- 关系表达式的结果是bool类型。
- 任何值或任何有效的值和运算符的组合都是表达式,表达式加分号就转变成语句。
- c++程序在需要整数值的地方将把true和false分别转换为1和0,而在需要bool值的地方将把0转换为false,非0转换为true
#include <iostream>
int main()
{
using namespace std;
cout<<"Enter the starting countdown value:";
int limit;
cin >>limit;
int i;
for(i=limit;i;i--)
cout<<"i="<<i<<"\n";
cout<<"Done now that i="<<i<<"\n";
return 0;
}
1.3 计算前16个阶乘
/*
使用循环来计算并存储前16个阶乘
*/
#include <iostream>
const int ArSize = 16; //定义一个常量
int main()
{
long long factorials[ArSize];
factorials[1] = factorials[0] =1LL;
for(int i=2;i<ArSize;i++)
factorials[i] = i * factorials[i-1];
for(int i=0;i<ArSize;i++)
std::cout<<i<<"!= "<<factorials[i]<<std::endl;
}
1.4 修改步长
#include <iostream>
int main()
{
using std::cout;
using std::cin;
using std::endl;
cout<<"Enter an integer:";
int by;
cin >> by;
cout<<"Counting by"<<by<<"s:\n";
for(int i=0;i<100;i=i+by)
cout<<i<<endl;
return 0;
}
1.5 逆序打印字符串
#include <iostream>
#include<string>
int main()
{
using namespace std;
cout<<"Enter a word:";
string word;
cin>>word;
for (int i=word.size()-1;i>=0;i--) //size() 获取字符串长度
cout<<word[i];
cout<<"\nBye.\n";
return 0;
}
1.6 递增运算符(++)和递减运算符(--)
递增运算符和递减运算符等价于将变量加1或者减1,这两个运算符都有两种变体,前缀版本位于操作数前面,如++x;后缀版本位于操作数后面,如x++;两个版本对操作数的影响是一样的,但是影响的时间不一样。这就像对于钱包来说,清理草坪之前付钱和清理草坪之后付钱的最终结果是一样的,但支付的时间不同
#include<iostream>
int main()
{
using std:cout;
int a=20;
int b=20;
cout<<"a ="<<a<<" b ="<<b<<"\n";
cout<<"a++= "<<a++<<" ++b= "<<++b<<"\n";
cout<<"a ="<<a<<" b= "<<b<<"\n";
return 0;
}
a++ 意味着使用a的当前计算表达式,然后将a的值加1;而++b的意思是先将b的值加1,然后使用新的值来计算表达式
1.7 组合赋值运算符
+=运算符将两个操作数相加,并将结果赋值给左边的操作数
操作符 | 作用(L为左操作数,R为右操作数) |
---|---|
+= | 将L+R赋值给L |
-= | 将L-R赋值给L |
*= | 将L*R赋值给L |
/= | 将L/R赋值给L |
%= | 将L%R赋值给L |
1.8 复合语句(语句块)
两个花括号来构成一条复合语句(代码块)
#include <iostream>
int main()
{
using namespace std;
cout<<"The Amazing Accounto will sum and average";
cout<<"five numbers for you .\n";
cout<<"Please enter five values:\n";
double number;
double sum = 0.0;
for (int i=1; i<=5;i++)
{ //block starts here
cout<<"Value "<<i<<":";
cin>>number;
sum += number;
} //block ends here
cout<<"Five exquisite choices indeed!";
cout<<"They sum to "<<sum<<endl;
cout<<"and average to "<<sum/5<<".\n";
return 0;
}
如果在语句块中定义一个新的变量,则仅当程序执行该语句块中的语句时,该变量才存在。执行完该语句块后,变量将被释放。
#include <iostream>
int main()
{
using namespace std;
int x = 20;
{ //block starts
int y = 100;
cout<<x<<endl; //ok
cout<<y<<endl; //ok
} //block ends
cout<<x<<endl; //ok
cout<<y<<endl; //invalid,won't compile
return 0;
}
如果在一个语句块中声明一个变量,而外部语句块中也有一个这种名称的变量,则在声明位置到内部语句块结束的范围之内新变量将隐藏旧变量;然后旧变量再次可见
#include <iostream>
int main()
{
using std::cout;
using std::endl;
int x = 20; //original x
{ //block starts
cout<<x<<endl; //use original x
int x = 100; //new x
cout<<x<<endl; //use new x
} //block ends
cout<<x<<endl; //use original x
return 0;
}
1.9 逗号运算符
逗号运算符是将两个表达式合并成一个表达式,常用在for循环中,如i++,--j;但逗号不一定是逗号运算符,有时只是用来分割变量,如int i,j;
#include <iostream>
#incldue <string>
int main()
{
using namespace std;
cout<<"Enter a word";
string word;
cin>>word;
char temp;
int i,j;
for (j=0,i=word.size()-1;j<i;--i,++j)
{
temp = word[i];
word[i] = word[j];
word[j] = temp;
}
cout<<word<<"\nDone\n"
return 0;
}
注意点:
- 逗号运算符具有顺序的作用,如i = 10,j=2i;执行的顺序是先把10赋值给i,然后再把2*10赋值给j。
- 在所有运算符中,逗号运算符的优先级是最低的,如a = 10,20;它等价于(a=10),20;如果a = (10,20),则a的值为20,即逗号右侧表达式的值。
1.10 关系表达式
关系表达式的结果为布尔类型,比较结果为真,则为true;比较结果为假,则为false;
关系运算符 | 说明 |
---|---|
< | 小于 |
<= | 小于等于 |
== | 等于 |
> | 大于 |
>= | 大于等于 |
!= | 不等于 |
1.11 for进阶
在for循环中,三个表达式可以为空表达式,但是两个分号是必须的。
//下面for循环为死循环,会一直执行循环体
for(;;)
body
2 while循环
while循环的组成部分:
- while关键字
- 测试表达式
- 循环体
//如果测试表达式为真或者非0,则执行循环体;反之,测试表达式为假或者0,则不执行循环体
while(test-expression)
body
3 do while
前面的for和while都是入口循环,即必须要先测试入口条件是否为真,才能决定是否要执行循环体。
而do while则出口循环,即先执行循环体,然后再测试入口条件。
//do while循环,至少要执行一次循环体
do
body
while(test_expreesion);
//例子
#include <iostream>
int main()
{
using namespace std;
int n;
cout<<"Enter number in the range 1-10 to find ";
cout<<"my favorite number\n";
do
{
cin>>n;
}while(n!=7);
cout<<"Yes,7 is my favorite.\n";
return 0;
}