C++ 如何使用C++;for循环处理在for循环的init语句中声明的变量?

C++ 如何使用C++;for循环处理在for循环的init语句中声明的变量?,c++,for-loop,C++,For Loop,我知道有很多答案,但没有一个能消除我的疑虑。。。 C++标准说: 用于语句的 for ( init-statement condition ; expression ) statement 相当于 { init-statement while ( condition ) { statement expression ; } } 除了init语句中声明的名称与条件中声明的>位于同一

我知道有很多答案,但没有一个能消除我的疑虑。。。 C++标准说:

用于语句的

   for ( init-statement condition ; expression ) statement 
相当于

   {
       init-statement 
       while ( condition ) {
           statement 
           expression ;
       }  
   }
除了init语句中声明的名称与条件中声明的>位于同一声明区域之外(这也是语句的范围)

这意味着,如果我在init语句中声明一个变量,那么该变量将与语句的作用域相同,并且该语句在每次迭代中执行。。。 现在,我的问题是:

  • init语句中的变量声明是否也在每次迭代中执行
  • 例如:

        for(int i = 0; i < 5; i++){
            int number = 2;   // this will be executed in each iteration
        }
    
    for(int i=0;i<5;i++){
    int number=2;//这将在每次迭代中执行
    }
    
    现在,正如标准所说,“i”变量也将在“number”的相同范围内,那么它是否也会像“number”一样在每次迭代中销毁和声明

    PS:但这不可能,因为标准还规定init语句在condition语句之前只执行一次。。我只是想知道原因和事情是怎么回事

    编辑

    for(int i=0; i<10; i++){
        int num = 2; 
    }
    
    

    用于(int i=0;i正如标准所说,
    i
    将在与
    number
    相同的范围内,但如果您查看标准提供的代码,
    i
    将只初始化一次。
    number
    将在每次迭代中初始化。

    请参阅等价的
    while
    循环。在t中声明的变量发起者会在循环中列出所有变量的实例。但是一旦
    for
    循环结束,初始变量就会超出范围并消失(被销毁)。 需要注意的是,
    if
    也可以在条件部分定义变量:

    if(bool x=foo()) /*...*/;
    if(int x=bar(); x>3) /*...*/; 
    
    类似的规则也适用;如果
    /
    while
    语句中出现
    的隐式作用域。但是
    while
    for
    之间有区别。与
    for
    相比,对象在
    while
    条件中启动:

    while(bool x=foo()) /*...*/;
    
    实际上是在循环中确定范围的,并且每次迭代都会被破坏/构造

    请记住术语scope。粗略地说,scope是构成块语句的任意一对大括号(
    {}
    )。但是也有隐式作用域,就像
    /
    周围的作用域一样,而
    /
    if
    。任何退出的作用域都会杀死其嵌套对象

    问候,,
    FM.

    例外情况主要是指出这一点

    for (int i = 0; i != 42; ++i)
    {
        int i = 3; // error: redeclaration of i
    }
    
    鉴于

    {
        int i = 0;
        while (i != 42) {
            int i = 3; // "Ok", hide outer i
    
            ++i; // actually modify inner i
        }
    }
    

    这不会影响变量的生存期或初始化位置。

    为什么您认为位于同一声明性区域的两个变量会影响它们的初始化时间?请注意,异常指的是声明名称的位置,而不是创建或销毁对象的位置。@molbdnilo但通常在声明名称的位置,对象是c在同一个地方创建。不是吗?异常的意思是声明的名称(不是必需的变量)的作用域在循环内,但任何声明的变量都有一个生存期,就好像它是在循环外的单独作用域(外部大括号)中声明的一样。(名称有作用域,对象有生存期。)但例外情况是,init语句中声明的变量和loop语句中声明的变量位于同一范围内……但等效代码(我认为是编译器生成的循环)有两个不同的范围(一个外括号范围和一个内括号范围)的2个“I”变量……但standard说它们都具有相同的范围。(这就是为什么我们不能在循环语句中声明另一个同名变量)我已经编辑了我的问题(添加了最后一段)你能澄清我的疑问吗..根据正常范围,这是一个例外,他们认为他们在不同的范围内(对于生存期/创建期),它们在命名时充当相同的作用域。您的意思是最后一段中的代码将生成此while循环…
    {
    while(条件){
    int num=2;
    //因为我应该与num处于相同的作用域。
    }`