【问题标题】:must the imperative programming paradigm comply with the forward declaration rule?命令式编程范式必须遵守前向声明规则吗?
【发布时间】:2013-12-10 18:07:33
【问题描述】:

在我的语言编程课程的考试中是这样的问题:

下一个程序在命令式编程中有效吗?

   int a = 0;
   z = a + 2;
   int z = 3;

没有指定语法、语法或其他任何内容。我的回答是肯定的,因为最终可能会有一种语言、一种语法和一种语法设计来有效地使用 z 而无需声明它并稍后“重新声明”z。我的成绩是 0.0,但我仍然觉得不公平。可以帮助澄清这个问题吗?谢谢。

【问题讨论】:

  • 命令式语言有很多种;其中一些不需要显式声明,而另一些则需要提升声明(我相信还有更多方面需要考虑)。但是,请记住在课程材料的上下文中回答 - 即使说“是”。挥手(“最终可能会有”)不是一个足够有力的理由,也没有展示课程概念。

标签: paradigms imperative-programming


【解决方案1】:

你被不公平地标记了。

将以下代码 sn-p 粘贴到浏览器的调试器控制台中:

(function() {
    var a = 0;
    z = a + 2;
    alert(z);
    var z = 3;
    alert(z);
})()

【讨论】:

  • +1 表示反例,尽管这有点作弊,因为 JavaScript “提升”了“声明”,使 function () { return x; var x = 2; } 语义上相同function () { var x; return x; x = 2; }(请注意这两个函数总是返回undefined,因为分配没有发生!)
【解决方案2】:

考虑到您的课程名为“语言编程”,我想必须严格解释“命令式编程”。引用 的当前标签维基,我们有

命令式编程是一种表达计算机程序或计算逻辑的范式,它通过改变程序状态的语句显式地描述其控制流。

可以说,对给定的类 C 代码最合理的解释是 int z = 3; 是一个变量声明(和赋值),因此 z = a + 2; 行是声明之前的用法。假设这是一个合法的程序,它不遵循命令式范式,因为它的控制流没有明确描述,即它不是顺序的。


也就是说,你是对的,因为没有指定的语法或句法,程序实际上可以做任何事情,包括你指定的、计算 π 或在监视器上显示粉红色的大象。显然,我们需要在某处画一条线。鉴于您的课程名为“语言编程”,我认为批判性地评估您对可能语言的规范的合理性是一个不错的方法。

我们有很多语言可以简单地使用以前未知的变量来隐式声明它,所以这是很合理的。然而,它的“重新声明”部分,我觉得非常不寻常和令人困惑,并认为这将是一个糟糕的语言特性。我不知道有任何主要的编程语言允许它1

因此,我认为在这种狭隘的情况下,您对“是”的回答充其量应该是主要回答为“否”的答案中的旁注。


  1. 类似但不相关的情况是,不同的变量具有相同的名称但范围不同,并且可以为同一个变量分配不同类型的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多