【问题标题】:Is the "if" statement considered a method?“if”语句是否被视为一种方法?
【发布时间】:2012-01-30 05:16:19
【问题描述】:

我的同行们就“if”语句是否被认为是一种方法进行了有趣的讨论?虽然 "if" 附加了单词语句,但它的行为仍然类似于简单的非返回值方法。

例如:

if(myValue) //myValue is the parameter passed in
{
    //Execute
}

同样的方法可以执行相同的操作:

public void MyMethod(myValue)
{
    switch(myValue)
    {
        case true:
            //Logic
            break;
        case false:
            //Logic
            break;
    }
}

在编程语言中将“if”语句称为(考虑)一个简单的预定义方法是否准确?

【问题讨论】:

  • 不,我永远不会那样想。这是一个控制语句,内置在语言中。如果其他人同意你的观点,我会感到惊讶。
  • public int Five() { return 5; } // 这是否意味着 5 是一个方法?
  • 我什至不认为它是一个函数,更不用说等同于一个方法。这是在工作的啤酒塔知识分子。
  • 这就是我认为考虑写if(x)糟糕的编码风格的原因。它“看起来”很像一个函数调用,尽管它不是。 for(...)while(..) 相同。
  • 从你的逻辑来看,switch() 也应该是一个方法,毕竟你可以做一个执行相同操作的方法(也许使用if?:))

标签: language-agnostic if-statement programming-languages conditional-statements


【解决方案1】:

在 C、C++、C#、Java 等语言中,IF 是作为保留字实现的语句,是语言核心的一部分。在 LISP 系列的编程语言中(想到方案)IF 是一个 表达式 (意味着它返回一个值)并以特殊形式实现。另一方面,在诸如 Smalltalk 之类的纯面向对象语言中,IF 真的一个方法(更准确地说:一个消息),通常在@987654326 上实现@ 类或其子类之一。

底线:条件指令IF 的真正性质取决于编程语言以及该语言的编程范式。

【讨论】:

  • @Oscar:是的,这是一种特殊的形式,抱歉。我只是偶然发现了表达式这个词。几乎所有东西都是 LISP 中的表达式。但是,是的,这是 100% 正确的。
  • @Oscar: if-then-else 也可以表示为 Actor 模型中的消息传递 (en.wikipedia.org/wiki/Actor_model_and_process_calculi_history)。
  • 这是 Lisp 的“方言”,其中if 不是特殊形式:thimbleby.net/misc(提示:MISC 使用惰性求值。);-)
【解决方案2】:

不,“if”语句与 C# 中的方法完全不同。考虑它不像方法的方式:

  • 包含块中的实体在“if”的主体范围内。但是一个方法不能访问其调用者的绑定环境。
  • 在许多语言中,方法是某种东西的成员——可能是一种类型。声明不是成员。
  • 在具有一流方法的语言中,方法可以作为数据传递。 (在 C# 中,通过将它们转换为委托。)“if”语句不是一流的。
  • 等等。差异是无数的。

现在,将某些事物视为一种方法确实有意义,而不是“如果”语句。例如,许多运算符很像方法。两者在概念上几乎没有区别:

decimal x = y + z;

decimal x = Add(y, z);

而事实上,如果你在 C# 中反汇编两个小数的加法,你会发现生成的代码实际上一个方法调用。

一些运算符具有不寻常的特征,因此很难将它们描述为方法:

bool x = Y() && Z();

不同于

bool x = And(Y(), Z());

使用一种对方法参数进行热切评估的语言;首先,如果 Y() 为假,则不会评估 Z()。在第二个中,两者都被评估。

您创建的“如果”方法反而是在回避问题;实现比“if”语句更复杂。说你可以用开关模拟“if”,就像说你可以用摩托车模拟自行车;用更复杂的东西代替简单的东西并不引人注目。更合理地指出 switch 实际上是一个花哨的“如果”。

【讨论】:

    【解决方案3】:

    您不能创建 myIfStatement() 方法并期望以下方法起作用:

    ...
    myIfStatement(something == somethingElse)
    {
       // execute if equal
    }
    else
    {
       // execute if different
    }
    

    if是控制语句,不能被方法复制,也不能用if代替方法调用:

    myVariable = if(something == somethingElse);
    

    if 不能重载。

    这些迹象表明if 不是一种方法,但我怀疑还有其他一些迹象。

    【讨论】:

      【解决方案4】:

      当然取决于语言,但在 C、java、perl 中,不,它们是语言命令。保留字。如果它们是函数,您将能够重载它们并获取指向它们的指针,并执行您可以使用函数执行的所有其他操作。

      不过,这更像是一个哲学问题,而不是编程问题。

      【讨论】:

      • 函数也返回数据。 if 和 switch 没有。我越想它,看起来就越不像一个函数。你也不能将它作为参数传递给另一个函数。
      • 但是包含 void 的方法也不返回值。
      • 这并不意味着它不是一个函数。这使它成为一个不返回任何内容的函数。在所有其他方面,它仍然是一个函数(获取指针等),而语言命令则不是。
      【解决方案5】:

      一个方法有一个签名,它的主要意图是resuable逻辑,而if只是一个控制执行流程的条件。 如果您了解汇编,那么即使在非常低的级别上,您也会知道两者是不同的。

      【讨论】:

        【解决方案6】:

        您当然可以编写 If()IfElse() 方法,但这并不能使它们相同。

        if() 被定义为语言中的语句,与方法调用处于同一级别。但是a.o.有区别。语法和优化的可能性。

        所以:不,if() 语句不是方法。例如,您不能不将其分配给委托人。

        【讨论】:

          【解决方案7】:

          在我看来,将if 语句视为一种方法只会让人感到困惑。与方法调用的相似之处只是表面的。

          if 语句是控制执行流程的语句之一。当它被编译成本机机器码时,它会对表达式求值并进行条件跳转。

          伪代码:

          load myValue, reg0
          test reg0
          jumpeq .skip
            ; code inside the if
          .skip:
          

          如果你使用else,你会得到两次跳转:

          load myValue, reg0
          test reg0
          jumpeq .else
            ; code inside the if
            jmp .done
          .else:
            ; code inside the else
          .done:
          

          【讨论】:

            【解决方案8】:

            “if”语句是否被视为方法?

            不,它不被视为您可能已经在其他答案中看到的方法。但是,如果您的问题是 - “它的行为是否像一种方法?”,那么答案可能是 ,具体取决于所讨论的语言。任何支持一流函数的语言都可以不用像if 这样的内置构造/语句。忽略所有蓬松的东西,比如返回值和语法,因为基本上它只是一个计算布尔值的函数,if 它是true,然后它执行一些块的代码。还要忽略 OO 和功能差异,因为以下示例可以作为 Boolean 类上的方法实现,使用任何正在使用的语言,例如 Smalltalk。

            Ruby 支持可以存储在变量中并传递给方法的可执行代码块。所以这是一个用 Ruby 实现的自定义 _if_ 函数。 { .. } 中的内容是一段传递给函数的可执行代码。它在 Ruby 中也称为块。

            def _if_ (condition)
              condition && yield
            end
            
            # simple statement
            _if_ (42 > 0) { print "42 is indeed greater than 0" }
            
            # complicated statement
            _if_ (2 + 3 == 5) {
                _if_ (3 + 5 == 8) { puts "3 + 5 is 8" }
                _if_ (5 + 8 == 13) { puts "5 + 8 is 13" }
            }
            

            我们可以在 C、C++、Objective-C、JavaScript、Python、LISP 和许多其他语言中做同样的事情。这是一个 JavaScript 示例。

            function _if_(condition, code) {
                condition && code();
            }
            
            _if_(42 > 0, function() { console.log("Yes!"); });
            

            【讨论】:

              【解决方案9】:

              如果它被归类为方法,那么我们肯定会在 OO 领域,但我们不是,所以我假设我们在讨论一个函数。当然可以编写一个函数/子程序来复制 if 行为(我认为它实际上是 lisp/scheme 中的一个函数)。

              不过,我不会把它归类为函数甚至子程序,只是控制流。

              【讨论】:

                【解决方案10】:

                如果通过方法我们理解了一个可以被调用的代码块并且当方法结束时控制流自动返回给调用者,那么ifs 不是方法。执行if 后,控制流不会返回

                【讨论】:

                  【解决方案11】:

                  IF 语句是在大多数语言中使用的条件构造功能,它根据真或假的布尔条件评估执行路径流。除了分支预测的情况外,这总是通过根据某些条件选择性地改变控制流来实现的。

                  IF 构造是编程时使用的最基本和最需要的逻辑。它允许引入功能的构建块。

                  【讨论】:

                    【解决方案12】:

                    是的if 在某些语言中是一个函数,尽管它很少见且用途有限。

                    通常构造类似于if(booleanCondition, functionPointerToCallIfConditionTrue, functionPointerToCallIfCondtionFalse) 如果您愿意,它本身可以用作其他函数的委托。

                    例如,Mathematica 就是这样运行的,如果您使用 Linq 表达式,甚至 C# 也可以这样做。看看System.Linq.Expressions.Expression.IfThenElse

                    【讨论】:

                      【解决方案13】:

                      没有。当你完成一个 if 时,你不会返回。这只是一个控制语句。

                      【讨论】:

                        【解决方案14】:

                        请注意,在您的示例中,您将一个“选择语句”(C# 4 规范,第 8.7 节)if 语句(第 8.7.1 节)替换为另一个 switch 语句(第 8.7 节) .2)。您还将选择语句重构为单独的方法。但是,您并没有用方法替换选择语句的使用。

                        您的问题的答案是“否”。

                        【讨论】:

                          猜你喜欢
                          • 2011-04-08
                          • 1970-01-01
                          • 2021-07-08
                          • 2011-12-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-01-31
                          • 2012-01-23
                          • 2018-08-07
                          相关资源
                          最近更新 更多