为什么Java,C#和C++没有范围?

2022-09-04 08:42:21

AdaPascal和许多其他语言支持范围,这是一种子类型整数的方法。范围是一个有符号整数值,其范围从一个值(第一个)到另一个值(最后一个)。在OOP中实现一个执行相同操作的类很容易,但我认为本机支持该功能可以让编译器进行额外的静态检查。

我知道不可能静态地验证在一个范围内定义的可变性不会“溢出”运行时,即由于输入不良,但我认为可以做一些事情。我想到了按合同设计的方法(Eiffel)和Spec#(C#合同),它们给出了一个更通用的解决方案。

有没有更简单的解决方案,至少在C++,C#和Java的编译时检查静态越界赋值?某种静态断言

编辑:我知道“范围”可以用于不同的目的:

  1. 迭代器
  2. 统计员
  3. 整数子类型

我会把重点放在后者上,因为前者很容易在C *语言上映射。我想到一组封闭的值,比如音乐音量,即从1到100的范围。我想按值递增或递减它。我希望在静态溢出的情况下出现编译错误,如下所示:

volume=rangeInt(0,100);
volume=101;  // compile error!
volume=getIntFromInput(); // possible runtime exception

谢谢。


答案 1

子范围类型在实践中实际上并不是很有用。我们不经常分配固定长度的数组,也没有理由使用固定大小的整数。通常,当我们看到固定大小的数组时,它们充当枚举,并且我们有一个更好的(尽管“更重”)解决方案。

子范围类型也使类型系统复杂化。在变量之间引入约束比在固定常量之间引入约束要有用得多。

(必须提及的是,在任何合理的语言中,整数都应该是任意大小的。


答案 2

当您可以简洁地在该范围内执行某些操作时,范围最有用。这意味着关闭。至少对于Java和C++,与迭代器相比,范围类型会很烦人,因为您需要定义一个内部类来定义您将在该范围内执行的操作。


推荐