当前位置: 首页 > 面试题库 >

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

岳宣
2023-03-14
问题内容

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

我知道无法静态地验证范围内定义的变量不会“溢出”运行时(即由于输入错误),但是我认为可以做些什么。我考虑了按合同设计方法(Eiffel)和Spec#(C#合同),它们给出了更通用的解决方案。

有没有更简单的解决方案,至少可以在C
++,C#和Java的编译时检查静态的带外分配?某种静态断言?

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

  1. html" target="_blank">迭代器
  2. 列举者
  3. 整数子类型

我将重点放在后者上,因为前者很容易在C
*语言上进行映射。我考虑一个封闭的值集,例如音乐音量,即从1到100的范围。我想按一个值递增或递减。我希望在静态溢出的情况下出现编译错误,例如:

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

谢谢。


问题答案:

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

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

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



 类似资料:
  • 问题内容: 在C ++中,可以在构造函数开始运行之前使用初始化列表来初始化类的字段。例如: 我很好奇为什么Java没有类似的功能。根据 Core Java:第1卷 : C ++使用这种特殊语法来调用字段构造函数。在Java中,因为对象没有子对象,而只有指向其他对象的指针,所以不需要它。 这是我的问题: “由于对象没有子对象”是什么意思?我不知道什么是子对象(我尝试查找它);它们是否意味着扩展超类的

  • 我对C#UTF8编码感到困惑... 假设这些“事实”是正确的: Unicode是定义每个字符的“协议” 根据C#参考,每个字符的可接受范围为0x0000到0xFFFF。我不明白另一个字符是什么,它在0xFFFF之上,在Unicode协议中定义的? 与C#相比,当我使用Python编写UTF8文本时-它涵盖了所有预期范围(0x0000到0x10FFFF)。例如: 这对C不起作用。此外,当我将Pyth

  • 问题内容: 以下方法不起作用,因为内部块声明的变量与外部块中的变量同名。显然,变量属于声明它们的方法或类,而不属于声明它们的块,因此,我无法编写一个简短的临时临时块进行调试,而恰好将外部作用域中的变量压入阴影只是片刻: 我使用过的几乎每种块范围语言都支持此功能,包括我在学校为解释器和编译器编写的琐碎小语言。Perl可以做到这一点,Scheme甚至C都可以做到。甚至PL / SQL也支持这一点! J

  • 问题内容: 我们注意到,用C#(或Java)开发的软件中的许多错误都导致NullReferenceException。 为什么在语言中甚至包含了“ null”? 毕竟,如果没有“ null”,那么我就不会有错误,对吧? 换句话说,如果没有null,该语言的什么功能将无法正常工作? 问题答案: “ C#父亲” Anders Hejlsberg在他的《计算机世界》采访中谈到了这一点: 例如,在类型系统

  • 本文向大家介绍C#和 .NET有什么区别相关面试题,主要包含被问及C#和 .NET有什么区别时的应答技巧和注意事项,需要的朋友参考一下 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。

  • 我是否遗漏了包装类中的某些细节? 我有以下程序,在其中我定义了一个类,它包装并提供运算符: 我以为这会编译成同样的东西--它在做同样的计算,所有的东西都是内联的。 编辑-如果我使用而不是,它将产生相同的输出。 编辑-我发布了错误的ASM版本(而不是),因此本节没有帮助。 我在我的Mac电脑上使用Xcode的gcc,在一个64位系统上。除了for-loop的主体之外,结果是相同的。