Language agnostic 是",;如果;语句被认为是一种方法?

Language agnostic 是",;如果;语句被认为是一种方法?,language-agnostic,if-statement,programming-languages,conditional-statements,Language Agnostic,If Statement,Programming Languages,Conditional Statements,我的同龄人之间发生了有趣的讨论,“如果”语句是否被视为一种方法?虽然“if”附加了word语句,但其行为仍然类似于简单的非返回值方法 例如: if(myValue) //myValue is the parameter passed in { //Execute } 同样,方法也可以执行相同的操作: public void MyMethod(myValue) { switch(myValue) { case true: //Log

我的同龄人之间发生了有趣的讨论,“如果”语句是否被视为一种方法?虽然“if”附加了word语句,但其行为仍然类似于简单的非返回值方法

例如:

if(myValue) //myValue is the parameter passed in
{
    //Execute
}
同样,方法也可以执行相同的操作:

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

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

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


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

您当然可以编写
If()
IfElse()
方法,但这并不意味着它们相同

if()。但在a.o.语法和优化可能性方面存在差异


因此:
if()
语句不是方法。例如,你不能不把它分配给一个委托。

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


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

如果通过方法我们理解了一个可以调用的代码块,并且控制流在方法结束时自动返回给调用方,那么
如果
不是方法。控制流在<代码> >“< /代码>”之后不会返回任何地方。例如,C++、C++、C语言、java、<代码>中的< < /P> < P> >如果< /COD>是作为保留词实现的语句,是语言的核心部分。在LISP系列的编程语言中(我想到Scheme)
如果
是一个表达式(意味着它返回一个值),并且作为一种特殊形式实现。另一方面,在纯面向对象语言(如Smalltalk)中,
IF
实际上是一种方法(更准确地说是一条消息),通常在
Boolean
类或其子类之一上实现


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

否。完成IF后,您不会返回。这只是一个控制语句

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


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

方法具有签名,其主要目的是可恢复的逻辑,而if只是控制执行流的条件。
如果你了解汇编,你就会知道即使在很低的层次上,两者都是不同的。

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

您不能创建
myIfStatement()
方法并期望以下操作正常:

...
myIfStatement(something == somethingElse)
{
   // execute if equal
}
else
{
   // execute if different
}
如果
是一条控制语句,并且不能由方法复制,也不能用if替换方法调用:

myVariable = if(something == somethingElse);
如果
不能重载

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

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

  • 包含块中的实体在“if”主体的范围内。但是一个方法不能访问其调用者的绑定环境
  • 在许多语言中,方法是某种东西的成员——可能是一种类型。声明不是成员
  • 在具有一流方法的语言中,方法可以作为数据传递。(在C#中,将它们转换为委托。)“如果”语句不是一流的
  • 等等。差异是巨大的
现在,将某些事情视为一种方法是有意义的,而不是“如果”语句。例如,许多运算符非常类似于方法。以下两者在概念上几乎没有区别:

decimal x = y + z;

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

一些操作员具有不寻常的特征,因此很难将其描述为方法:

bool x = Y() && Z();
不同于

boolx=和(Y(),Z())

在一种对方法参数进行求值的语言中;在第一种情况下,如果Y()为false,则不计算Z()。在第二种情况下,对这两种情况都进行了评估


你创造了一个“如果”方法,却回避了这个问题;实现比“if”语句更复杂。说你可以用开关模拟“如果”,就像说你可以用摩托车模拟自行车一样;用更复杂的东西取代简单的东西并不令人信服。更合理的说法是,switch实际上是一个奇特的“if”。

if语句是大多数语言中使用的条件构造特性,它根据布尔条件求值true或false执行路径流。除了
bool x = Y() && Z();
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" }
}
function _if_(condition, code) {
    condition && code();
}

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