我正在编写一个编译器来将一些传统的VB6程序迁移到C ++。我需要将VB6语言中的for
语句翻译成C ++ for
语句:
For var = start To end Step S
...
Next var
天真的翻译不起作用,因为S
可能是否定的:
for (var = start; var <= end; var += S)
我已经想出了这个翻译,但条件中的三元if
很难看:
for (var = start; (S > 0) ? (var <= end) : (var >= end); var += S)
答案 0 :(得分:1)
这是一个生成的代码。调试代码生成器时,您只会看到它。如果丑陋的话,这完全无关紧要。只有它是正确的,然后生成越简单就越重要。
更新:但是,如果是迁移,尝试使代码可读确实有意义。然后我要么:
隐藏辅助定义中的逻辑,并使用基于范围的:
for(auto var : basic_range(start, end, S))
不幸的是boost::irange没有进入C ++ 11,并且它像C ++一样使用半开放范围定义,即在您想要包含它时不包括end
。所以你必须自己定义范围。基本上你只是隐藏它中的方向逻辑,所以它不会掩盖代码。请查看boost::irange获取灵感。
无论如何,最大的问题是对象生命周期。 VB6(与早期的BASIC不同)是受管理的。所以你可能最终会在大多数事情上使用智能指针而且这不是最有效的事情。
答案 1 :(得分:0)
如果将var
和end
乘以S
int sign = S>=0 ? 1 : -1;
for (int var = start; sign*var <= sign*end; var += S)
{
//...
}