解析C++中的for循环以及基于范围的for语句使用_C 语言

for循环语句

重复执行语句,直到条件变为 false。

语法

for ( init-expression ; cond-expression ; loop-expression )
  statement;

备注
使用 for 语句可构建必须执行指定次数的循环。
for 语句包括三个可选部分,如下表所示。
for 循环元素

下面的示例将显示使用 for 语句的不同方法。

#include <iostream>
using namespace std;

int main() {
  // The counter variable can be declared in the init-expression.
  for (int i = 0; i < 2; i++ ){
    cout << i;
  }
  // Output: 01
  // The counter variable can be declared outside the for loop.
  int i;
  for (i = 0; i < 2; i++){
    cout << i;
  }
  // Output: 01
  // These for loops are the equivalent of a while loop.
  i = 0;
  while (i < 2){
    cout << i++;
  }
}
  // Output: 012
init-expression 和 loop-expression 可以包含以逗号分隔的多个语句。例如:

#include <iostream>
using namespace std;

int main(){
  int i, j;
  for ( i = 5, j = 10 ; i + j < 20; i++, j++ ) {
    cout << "i + j = " << (i + j) << '\n';
  }
}
  // Output:
  i + j = 15
  i + j = 17
  i + j = 19

loop-expression 可以递增或递减,或通过其他方式修改。

#include <iostream>
using namespace std;

int main(){
for (int i = 10; i > 0; i--) {
    cout << i << ' ';
  }
  // Output: 10 9 8 7 6 5 4 3 2 1
  for (int i = 10; i < 20; i = i+2) {
    cout << i << ' ';
  }
  // Output: 10 12 14 16 18

当 statement 中的 break、return 或 goto(转到 for 循环外部的标记语句)执行时,for 循环将终止。 for 循环中的 continue 语句仅终止当前迭代。
如果忽略 cond-expression,则认为其为 true,for 循环在 statement 中没有 break、return 或 goto 时不会终止。
虽然 for 语句的三个字段通常用于初始化、测试终止条件和递增,但并不限于这些用途。例如,下面的代码将打印数字 0 至 4。在这种情况下,statement 是 null 语句:

#include <iostream>
using namespace std;

int main()
{
  int i;
  for( i = 0; i < 5; cout << i << '\n', i++){
    ;
  }
}

for 循环和 C++ 标准
C++ 标准中提到,for 循环中声明的变量将在 for 循环结束后超出范围。例如:

for (int i = 0 ; i < 5 ; i++) {
  // do something
}
// i is now out of scope under /Za or /Zc:forScope

默认情况下,在 /Ze 下,for 循环中声明的变量在 for 循环的封闭范围终止前保持在范围内。
/Zc:forScope 无需指定 /Za 即可启用 for 循环中声明的变量的标准行为。
也可以使用 for 循环的范围差异,重新声明 /Ze 下的变量,如下所示:

// for_statement5.cpp
int main(){
  int i = 0;  // hidden by var with same name declared in for loop
  for ( int i = 0 ; i < 3; i++ ) {}

  for ( int i = 0 ; i < 3; i++ ) {}
}

这更类似于 for 循环中声明的变量的标准行为,后者要求 for 循环中声明的变量在循环完毕后超出范围。在 for 循环中声明变量后,编译器会在内部将其提升为 for 循环封闭范围中的局部变量,即使存在同名的局部变量也会如此。

基于范围的 for 语句
语句 statement 按顺序反复执行语句 expression 中的每个元素。
语法

  for ( for-range-declaration : expression )
statement

备注
使用基于范围的 for 语句构造一个必须执行的循环范围,可以定义为任意一个循环访问,例如 std::vector,或者其他任意用 begin() 和 end()定义的范围。命名在 for-range-declaration 语句是属于 for 的,不能在 expression 或 statement中再次声明。请注意 自动 关键字是在 for-range-declaration 中部分语句的首选。
这段代码展示了如何使用 for 范围的循环来遍历数组和向量:

// range-based-for.cpp
// compile by using: cl /EHsc /nologo /W4
#include <iostream>
#include <vector>
using namespace std;

int main()
{
  // Basic 10-element integer array.
  int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

  // Range-based for loop to iterate through the array.
  for( int y : x ) { // Access by value using a copy declared as a specific type.
            // Not preferred.
    cout << y << " ";
  }
  cout << endl;

  // The auto keyword causes type inference to be used. Preferred.

  for( auto y : x ) { // Copy of 'x', almost always undesirable
    cout << y << " ";
  }
  cout << endl;

  for( auto &y : x ) { // Type inference by reference.
    // Observes and/or modifies in-place. Preferred when modify is needed.
    cout << y << " ";
  }
  cout << endl;

  for( const auto &y : x ) { // Type inference by reference.
    // Observes in-place. Preferred when no modify is needed.
    cout << y << " ";
  }
  cout << endl;
  cout << "end of integer array test" << endl;
  cout << endl;

  // Create a vector object that contains 10 elements.
  vector<double> v;
  for (int i = 0; i < 10; ++i) {
    v.push_back(i + 0.14159);
  }

  // Range-based for loop to iterate through the vector, observing in-place.
  for( const auto &j : v ) {
    cout << j << " ";
  }
  cout << endl;
  cout << "end of vector test" << endl;
}

输出如下:

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
end of integer array test
0.14159 1.14159 2.14159 3.14159 4.14159 5.14159 6.14159 7.14159 8.14159 9.14159
end of vector test

一个基于 for 循环终止于 statement 执行完成: break, return,或者 goto 转到一个语句外的 for 循环 continue 与语句终止当前 for 循环的迭代。
记住这些关于范围 for 的事实
自动识别数组。
识别那些有 .begin() 和 .end() 的容器。
使用基于自变量的查找 begin() 和 end() 。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
for
c语言循环语句、r语言循环语句、c语言for循环语句、r语言for循环语句、c语言循环语句例题,以便于您获取更多的相关知识。

时间: 2024-08-04 09:24:49

解析C++中的for循环以及基于范围的for语句使用_C 语言的相关文章

解析C++中派生的概念以及派生类成员的访问属性_C 语言

C++继承与派生的概念.什么是继承和派生 在C++中可重用性是通过继承(inheritance)这一机制来实现的.因此,继承是C++的一个重要组成部分. 前面介绍了类,一个类中包含了若干数据成员和成员函数.在不同的类中,数据成员和成员函数是不相同的.但有时两个类的内容基本相同或有一部分相同,例如巳声明了学生基本数据的类Student: class Student { public: void display( ) //对成员函数display的定义 { cout<<"num: &qu

C语言编程中统计输入的行数以及单词个数的方法_C 语言

统计输入的行数 标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束.因此,统计行数等价于统计换行符的个数. #include <stdio.h> /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } 在该程序中,while 循环语句的循环体是一个 if 语句,它控

C语言循环结构与时间函数用法实例教程_C 语言

本文实例展示了C语言循环结构与时间函数用法,对于C语言的学习来说是非常不错的参考借鉴材料.分享给大家供大家参考之用.具体如下: 完整实例代码如下: /********************************************** ** <Beginning C 4th Edition> Notes codes ** Created by Goopand ** Compiler: gcc 4.7.0 *****************************************

C语言中对于循环结构优化的一些入门级方法简介_C 语言

一.代码移动 将在循环里面多次计算,但是结果不会改变的计算,移到循环外面去. 例子: 优化前: void lower1(char *s){ int i; for(i=0;i<strlen(s);++i) if(s[i]>='A'&&s[i]<='Z') s[i]-=('A'-'a'); } 优化后: void lower2(char *s){ int i; int len=strlen(s); for(int i=0;i<len;++i) if(s[i]>='

c语言中 基于随机函数的使用详解_C 语言

在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a). 可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,

基于VC中使用ForceInclude来强制包含stdafx.h的解决方法_C 语言

在使用VC编程中,为了加快编译,vc编译器提供了预编译的功能.即在cpp代码中包含stdafx.h,那么就可以使用到预编译.如下所示: 复制代码 代码如下: #include "stdafx.h"class Demo{public:    Demo(void);    ~Demo(void);}; 注意: #include "stdafx.h" 是自己手动写的,默认是没有的.因此,有时总会出现忘记写这个的事情,这时候编译器就会报一个错误: 复制代码 代码如下: Er

解析C++的线性表链式存储设计与相关的API实现_C 语言

基本概念链式存储定义: 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点: 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息. 数据结点: 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息. 尾结点: 链表中的最后一个数据结点,其下一元素指针为空,表示无后继. 链表技术领域推演 链表链式存储_api实现分析: 在C语言中可以用结构体来定义链表中的指针域,链表中的表头结点也可以用

详解C++编程中的嵌套类的声明与其中的函数使用_C 语言

可以在一个类的范围内声明另一个类.这样的类称为"嵌套类". 嵌套类被视为在封闭类的范围内且可在该范围内使用.若要从嵌套类的即时封闭范围之外的某个范围引用该类,则必须使用完全限定名. 下面的示例演示如何声明嵌套类: // nested_class_declarations.cpp class BufferedIO { public: enum IOError { None, Access, General }; // Declare nested class BufferedInput.

C++基于hook iat改变Messagebox实例_C 语言

本文实例讲述了C++基于hook iat改变Messagebox的方法,分享给大家供大家参考.具体方法如下: 步骤: 1. 定义原始函数类型的写法 复制代码 代码如下: //定义函数原型  typedef int (WINAPI *PFNMESSAGEBOX)(HWND hWnd,  LPCTSTR lpText,  LPCTSTR lpCaption,  UINT uType);  //保存原始的MessageBox地址,注意这里  PROC g_orgProc = (PROC)Message