在C+中模拟严格/不间断for循环+; 我写了一个玩具语言,编译成C++作为练习。我试图为循环添加一个OCaml/Pascal/Fortran样式的,其中包含一个索引变量、一个下限和一个上限

在C+中模拟严格/不间断for循环+; 我写了一个玩具语言,编译成C++作为练习。我试图为循环添加一个OCaml/Pascal/Fortran样式的,其中包含一个索引变量、一个下限和一个上限,c++,C++,然而,C样式的for循环比这更通用。它允许修改循环变量,并要求按顺序执行for循环体,因为您可能中断,返回,引发异常,调用转到&c,更不用说副作用了 我的理解是C++编译器很好地优化了使用C风格的例子,对于< /Cult>循环,但恰好发生在中断< /代码>或修改循环变量和C。我试图找到一种方法来编码< >代码> >我想进入C++,这样做的方式实际上是根据C++标准的未定义行为,并且理想地,以现有的C++实现方式可以利用。 我能举的最接近的例子是*: for (int i = 0; i <

然而,C样式的
for
循环比这更通用。它允许修改循环变量,并要求按顺序执行for循环体,因为您可能
中断
返回
,引发异常,调用
转到
&c,更不用说副作用了

<>我的理解是C++编译器很好地优化了使用C风格<代码>的例子,对于< /Cult>循环,但恰好发生在<代码>中断< /代码>或修改循环变量和C。我试图找到一种方法来编码< <代码> >代码> >我想进入C++,这样做的方式实际上是根据C++标准的未定义行为,并且理想地,以现有的C++实现方式可以利用。 我能举的最接近的例子是*:

for (int i = 0; i < 400; ++i) {
  [](const int i) noexcept {
    printf("%d\n", i);
  }(i);
}
for(int i=0;i<400;++i){
[](常量int i)无例外{
printf(“%d\n”,i);
}(i) );
}
但是
noexcept
不够严格。如果抛出异常,则调用
std::terminate
。。。这意味着重新安排机构的执行顺序并不是一种法律优化


*
const
在这里从技术上讲是不必要的。它只是为了使对“伪”循环变量的修改成为编译时错误。

在自己的语言的编译器中尝试检测这一点怎么样?对于索引变量,您的解析器可以尝试至少排除赋值、递增/递减、按引用传递以及可能获取它的地址。您的解决方案非常好。然而,在编译时并没有确定的方法来检测运行时异常。例如,您可以强制循环闭包成为常量表达式,因此它永远不会抛出