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

时间:2011-12-29 21:37:05

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

在我的同行中,有关讨论是否将“if”语句视为一种方法?虽然“if”附加了单词statement,但它的行为仍然类似于简单的非返回值方法。

例如:

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

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

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

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

14 个答案:

答案 0 :(得分:106)

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

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

答案 1 :(得分:42)

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

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

现在,将某些事物视为一种方法确实是有意义的,而不是“if”语句。例如,许多运营商很像方法。以下几点之间的概念差异很小:

decimal x = y + z;

decimal x = Add(y, z);

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

有些运营商具有不同寻常的特征,但很难将它们描述为方法:

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

不同

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

用一种急切评估方法参数的语言;在第一个中,如果Y()为假,则不评估Z()。在第二部分,两者都进行了评估。

你创建一个“if”方法而不是问题;实现更复杂而不是“if”语句。说你可以用开关模仿“如果”,就像说你可以用摩托车模仿自行车;用更复杂的东西取代简单的东西并不引人注目。指出一个开关实际上是一个奇特的“如果”是更合理的。

答案 2 :(得分:14)

您无法创建myIfStatement()方法并希望以下方法有效:

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

if是一个控制语句,不能通过方法复制,也不能用if替换方法调用:

myVariable = if(something == somethingElse);

if无法超载。

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

答案 3 :(得分:8)

肯定取决于语言,但在C,java,perl,no中,它们是语言命令。保留字。如果它们是函数,你就可以重载它们并获得它们的指针,并完成你可以用函数做的所有其他事情。

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

答案 4 :(得分:4)

方法有签名,其主要意图是可恢复逻辑,而如果只是控制执行流程的条件。 如果您了解装配,您就会知道即使在非常低的水平上两者也是不同的。

答案 5 :(得分:3)

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

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

所以:不,if()声明不是方法。例如,您不能将其分配给代理人。

答案 6 :(得分:3)

在我看来,将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:

答案 7 :(得分:3)

  

“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!"); });

答案 8 :(得分:2)

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

我不会将它作为一个函数甚至是一个子程序,只是控制流程。

答案 9 :(得分:2)

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

答案 10 :(得分:2)

IF语句是大多数语言中使用的条件构造特性,它从布尔条件评估true或false执行路径流。除了分支预测的情况之外,这总是通过基于某些条件选择性地改变控制流来实现。

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

答案 11 :(得分:2)

if是某些语言的功能,即使它很少且用途有限。

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

例如,如果你使用Linq表达式,那么Mathematica会以这种方式运行,而甚至C#也可以这样做。看看System.Linq.Expressions.Expression.IfThenElse

答案 12 :(得分:0)

没有。完成if后,您不会返回。它只是一个控制声明。

答案 13 :(得分:0)

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

你的问题的答案是“不”。