①for循环:循环变量的初始化和修改都在语句头部分,形式较简洁,且特别用于循环次数已知的情况下;
②while循环:循环控制变量的初始化一般在while语句之前,而修改则一般在函数体中,形式上不如for简洁,较适用于循环次数不易预知的情况(用某一条件来控制循环)。
注:功能上是等价的,两者可以互换,即:for循环也可用于循环次数不易预知的情况下。(可参考2.)
①while循环实现
#include
int main()
{
int sum=0,value=0;
while(std::cin>>value)
sum+=value;
std::cout<<"Sum is"<<sum<<std::endl;
return 0;
}
注:
运行结果如下图:
输入流程为:1 空格 2 空格 3 空格 4 空格 5 Ctrl+Z Enter
输入流程为:1 空格 2 空格 3 空格 4 空格 5 空格 f Enter
程序运行过程为:待12345f都被输入到istream中后,按下Enter表示一个流就形成了。然后while循环才对流从头至尾单个检验,若遇到非int型数据或者文件结束,while循环体就结束循环,否则继续执行循环体。
②for循环实现
#include
int main()
{
int sum=0;
for(int value=0;std::cin>>value;)//注意分号不可少
sum+=value;
std::cout<<"Sum is"<<sum<<std::endl;
return 0;
}
统计在一串输入中每个值连续出现了多少次。
#include
int main()
{
//currVal是当前正在统计的数;将从流中读入的新值存入val
int currVal=0,val=0;
//读取第一个数到currVal中,并确保了确实有数据可以处理
if(std::cin>>currVal)
{
int count=1; //保存当前正在统计的数出现的次数,初始值为1
while (std::cin>>val) //读取第一个数后面的数
{
if(val==currVal) //如果值相同
count++;
else //否则,打印前一个值出现的次数
{
std::cout<<currVal<<"出现的次数为:"<<count<<std::endl;
currVal=val; //记住新值
count=1; //重置计数器
}
}
//记住打印输入流中最后一个值出现的次数。因为前一个数出现次数的显示是在识别了后一个数才进行的,
//但是最后一个值的后面可能是①文件结束符②其他类型的数据。这两种可能都不会进入while循环中,
//故不能打印最后一个值出现的次数。
std::cout<<currVal<<"出现的次数为:"<<count<<std::endl;
}
return 0;
}
对于三种不同的输入运行结果如下:
①输入流程为:1 1 1 1 2 2 2 3 3 4Ctrl+Z Enter
②输入流程为:1 1 1 1 2 2 2 3 3 4 e Enter
③输入流程为:1 1 1 1 2 2 2 3 3 4 Enter
此种输入方式未能输出最后一个值出现的次数,是因为流末尾的4被读入while循环后,进入了else分支,显示了它前一个数3出现的次数。显示完之后,程序又回到了while(std::cin>>val)处,但此时流已经被读取完了,但是又没有遇到文件结束符或者错误类型的符号,所以程序就堵塞在这里了。一直等到下一个流的输入或者等到文件结束符或者错误类型的符号。
①作为判断条件的是整个流,所以是先形成流,再判断。(当进行一串输入并按下Enter后才形成一段流)
②然后判断语句对流从头至尾根据值类型是否和定义类型相符进行判断,若相符则为真,否则为假。
③每进行一次cin>>val(val为某个已定义的变量),流内的数据就减少一个(从头至尾)。
④当最后一个数被cin>>val后,若最后一个数后面为文件结束符或者其他类型数据,cin>>val就为假;但是若最后一个数后面不是这两种情况,而是等待输入状态,此时则不能判断其真假。