【问题标题】:For loop inside its own curly braces在自己的花括号内循环
【发布时间】:2018-09-02 00:43:09
【问题描述】:

我遇到过这种for循环布局:

#include <iostream>
int main()
{
    {
        for (int i = 0; i != 10; ++i)
        {
            std::cout << "delete i->second;" << std::endl;
        }
    }

    {
        for (size_t i = 0; i < 20; ++i)
        {
            std::cout << "delete m_indices[i];" << std::endl;
        }
    }
    return 0;
}

我想知道这层额外的牙套是做什么用的?这在我们的代码库中出现了几次。

【问题讨论】:

  • 在您发布的代码 sn-p 中它们完全是多余的
  • 这段代码使用了哪些编译器?具体是 VS 6 被使用了吗?
  • @EdNorman 现在有了您的编辑,它变得更加清晰。似乎正确的答案是 UKMonkey 提供的答案。使用现代 C++ 编译器,您可以简单地删除花括号。
  • 或者,它可以生成代码(叹了口气,刚刚开始接触 Rhapsody)
  • 一个可能的原因是代码曾经有(或打算在将来有)OpenMP 并行指令。

标签: c++ for-loop scope


【解决方案1】:

这是一个block scope,用{} 大括号标记。通常用于标记automatic storage 的区域。在您的情况下,它似乎没有做任何事情,因为 for loop 在标准 C++ 中有自己的范围。

【讨论】:

    【解决方案2】:

    { 和} 将创建一个作用域,如果您在该作用域中定义了一些变量,您将无法从外部访问它们。但是for 已经创建了该范围。所以

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

    与

    相同
    for(int i = 0; i < count; ++i){}
    

    但如果你在它们之间定义一些东西,那就有区别了

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

    在此示例中,a 将无法从外部范围访问。

    【讨论】:

      【解决方案3】:

      在您的特定示例中,它们没有理由。

      有时您可能希望为变量创建范围:

      float average;
      // ...
      
      {
      int sum = 0;
      for (int i = 0; i < count; ++i)
      {
         sum += v[i];
      }
      average = (float)sum / count;
      }
      
      // use average
      // sum not in scope here
      

      但是我认为这是一种反模式。通常,如果您发现自己需要这样做,那么for 很可能应该是它自己的函数。

      【讨论】:

      • 好吧,如果你认为它应该在它自己的功能中(我可以想到很多次,这至少只会增加开销,但我不会去那里)一个假设的问题你:如果你需要一个特定的本地范围来切换案例怎么办?当然有时添加一个额外的范围(当然一个函数也是如此)(注意,对于你的例子,我根本不认为一个单独的函数是一个坏主意)是不必要的,但有时它并不是那么简单,即使还有其他方法。
      【解决方案4】:

      很久很久以前,VS6 存在并且很受欢迎。然而,它未能符合许多 C++ 标准。这在当时是合理的,因为它是在标准正式发布之前(同年)发布的;但据我所知,它确实遵守了标准草案。

      在草案和官方标准之间发生变化的标准之一是第一节中创建的 for 循环变量的生命周期;导致以下代码编译失败

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

      因为 i 被第二个 for 循环重新定义了。

      虽然其他编译器也遇到了这个错误;我强调 VS6 是因为它在标准发布后的几年里仍然是 Visual Studio 的唯一版本,但从未针对这个特定问题发布更新;意味着它产生了更显着的影响。

      对此的解决方案是强制整个 for 循环进入它自己的范围,如您所示。

      【讨论】:

      • 不用找VS6就能看到@bolov,在VS2015中将“For Loop Scope中的Force Conformance”设置为“No”,享受吧;-)
      • @alain "option 'Zc:forScope-' 已被弃用,将在未来的版本中删除" 并且编译没有问题......我很伤心
      • GCC 2.7 之前的版本也表现出这种行为。见docs.freebsd.org/info/g++FAQ/g++FAQ.info.for_scope.html
      • @Damon 这不是 VS6 首次发布的时候;但是,当标准发生变化时,从未发布过符合这些标准的更新。标准更改后,VS6 仍然流行了好几年。
      • 将此归因于旧的 Microsoft 编译器的罪过是虚假的。这种行为实际上是 C++ 标准草案的一个特性,许多编译器都这样做了(不仅是 Microsoft 编译器)。根据记忆,它在大约 1995 年的草案中进行了更改,以使变量成为循环的本地变量 - 大约在第一个 C++ 标准被批准之前三年。所以大多数早于(大约)1996 年的 C++ 编译器都是这样工作的。
      猜你喜欢
      • 2019-01-26
      • 2013-09-15
      • 2018-05-27
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2022-12-05
      • 2019-03-09
      相关资源
      最近更新 更多