我正在编写一个编译器,将某些旧版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)
最佳答案
这是生成的代码。调试代码生成器时,您只会看到它。因此,如果它丑陋,则完全无关紧要。仅当它正确时才重要,然后生成的越简单越好。
更新:但是,如果是迁移,则尝试使代码可读即可。然后我要么:
尽可能确定操作员在翻译器中使用的步骤,因为步骤几乎总是恒定的。
隐藏辅助定义中的逻辑,并将基于范围的用于:
for(auto var : basic_range(start, end, S))
不幸的是boost::irange并没有达到C ++ 11的要求,它是像C ++一样使用半开范围定义的,即,当您想包含
end
时不包含它。因此,您必须自己定义范围。基本上,您只是将方向逻辑隐藏在其中,因此不会混淆代码。查看boost::irange以获得灵感。无论如何,最大的问题是对象生命周期。 VB6(与早期的BASIC不同)被管理。因此,您可能最终会在大多数事情上使用智能指针,但这并不是最有效的事情。