【问题标题】:How To Convert C++ loops into C style loops? [closed]如何将 C++ 循环转换为 C 风格的循环? [关闭]
【发布时间】:2020-11-25 18:30:35
【问题描述】:

如何将像下面这样的循环转换为 C 风格?

for (auto element : vector) {
   Do_Somethin();
}

【问题讨论】:

  • Is there a tool...
  • 建议:不要将代码从一种语言翻译成另一种语言。即使代码确实有或多或少的字面翻译,在新程序的上下文中总体上也可能没有意义。了解原始程序的可观察行为,并使用新语言的习语并遵循其最佳实践在新语言中实现相同的行为。然后详尽地测试这两个程序以确保可观察到的行为是相同的。为此,您需要很好地理解这两种语言。
  • @HazemAbaza -- C 和 C++ 是两种不同的语言。
  • @HazemAbaza -- 但是为什么需要对基于范围的for 进行边界分析?它已经内置了边界分析。
  • 有没有办法将它用于 C++ 代码? 没有。询问工具供应商是否有类似的工具,但用于 C++ .

标签: c++ c loops code-translation


【解决方案1】:

您首先将其转换为基于非范围的 for 循环。

{
  auto&& range = Chains;
  using std::begin; using std::end; // possibly cbegin/cend
  auto it = begin(range); // possibly cbegin
  auto end = end(range); // possibly cend
  for(; it!=end; ++it) {
    auto block = *it;
    // body of loop
  }
}

然后你将每个部分分开。

首先推断auto 变量是什么。猜猜你是否必须,然后做一个static_assert( std::is_same_v< decltype(begin), your_guess > ); 来确认。确认后更换。不要猜测和交换类型并假设“它编译,我做对了”;这可能会导致细微的错误。

然后将beginend 替换为等效表达式。您必须做一些研究(可能是指向数组的原始指针,也可能是 .begin 方法,也可能是范围表达式命名空间中的免费 begin 函数)。

接下来会发生什么取决于您的迭代器在这里。它们是简单的指针吗?如果是这样,问题可能很简单。如果没有,您还有更多工作要做。

最后,删除所有引用,然后整理一下。

理想情况下,您希望将这些步骤中的每一个都作为 git 提交执行,并通过单元测试确认行为没有变化。未经此类测试,您似乎没有资格进行这些更改。没关系,单元测试将有价值。


另一方面,有 C++ 到 C 的翻译器。它们在实践中会生成不可读和不可维护的代码。

但输出可以由 C 编译器编译。

【讨论】:

    【解决方案2】:

    是的,您可以随时将 ranged-for 替换为经典的 for 循环。

    要使 ranged-for 工作,Chains 必须是实现迭代器接口的类型,或者必须是数组。

    如果是数组,你就知道该怎么做了。

    否则,你可以把循环写成:

    for (auto it = Chains.begin(), end = Chains.end(); it != end; ++it)
    {
       auto block = *it;
       Do_Somethin();
    }
    

    (不过,如果只有一个 const 接口可用并且begin() 由于某种原因没有const 重载,您可能需要cbegin()。)

    如果Chains的类型支持operator[]的随机访问,你也可以试试这样:

    for (std::size_t i = 0; i < Chains.size(); ++it)
    {
       auto block = Chains[i];
       Do_Somethin();
    }
    

    ...尽管您需要查看文档以了解 .size() 的实际含义。

    当然,C 没有迭代器或auto,但它也没有类。如果您愿意,您也可以选择替换这些功能。

    【讨论】:

    • 除非是带有operator[]的随机访问容器。
    • @sweenish 好吧,我想这看起来更像 C。但我的意思是,您仍然会使用非 C 功能,例如 operator[]
    • C 没有 auto 类型。 c 中的初始化也曾经发生在循环之外
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多