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

Zen*_*Zen 10 c# c++ java typing spec#

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

我知道静态验证在一个范围内定义的变量不会"溢出"运行时,即由于输入错误,我无法进行验证,但我认为可以做一些事情.我想到了契约设计方法(Eiffel)和Spec#(C#Contracts),它们提供了更为通用的解决方案.

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

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

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

我会专注于后者,因为前者很容易在C*语言上映射.我考虑一组封闭的值,比如音乐音量,即从1到100的范围.我想用一个值递增或递减.我希望在静态溢出的情况下出现编译错误,例如:

volume=rangeInt(0,100);
volume=101;  // compile error!
volume=getIntFromInput(); // possible runtime exception
Run Code Online (Sandbox Code Playgroud)

谢谢.

Tom*_*ine 4

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

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

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

  • 我其实不同意。范围数值在某些应用程序中非常有用,特别是在嵌入式世界中,并且还允许进行一些静态的编译时检查。 (3认同)