小编典典

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

java

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

谢谢。


阅读 211

收藏
2020-11-23

共1个答案

小编典典

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

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

(必须提及整数在任何明智的语言中都应为任意大小。)

2020-11-23