49

Интересное обсуждение появилось среди моих сверстников относительно того, является ли выражение «если» считаться методом? Хотя «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; 
    } 
} 

ли правильно назвать (считают) «если» заявление простой предопределенный метод в программировании язык?

+35

Нет, 'if' является конструкцией логического потока, а не методом. – asawyer

+0

Нет, я бы никогда не подумал об этом. Это инструкция управления, встроенная в язык. Я буду удивлен, если кто-то другой согласится с вами. – duffymo

+3

public int five() {return 5; } // означает ли это, что 5 - метод? – yurib

ответ

106

В таких языках, как C, C++, C#, Java, IF есть оператор , реализованный как зарезервированное слово, являющееся частью ядра языка. В языках программирования семейства LISP (схема приходит в голову) IF - это выражение (что означает, что оно возвращает значение) и реализовано как специальная форма. С другой стороны, в чистых объектно-ориентированных языках, таких как Smalltalk, IF действительно is метод (точнее: a сообщение), как правило, реализуется в классе Boolean или одном из его подклассов.

Нижняя строка: истинный характер условной инструкции IF зависит от языка программирования и от парадигмы программирования этого языка.

+12

+1 для Smalltalk :) –

+7

@ noah1989: Согласен. Странно, что есть только один ответ, упоминающий Smalltalk. «Те, кто забывают свою историю, обязаны повторить это», я думаю ... –

+0

@NiklasB. на каком диалекте Лиспа? можете ли вы предоставить ссылку? Поскольку в Схеме это обычно специальная форма или макрос, она не может быть функцией - не все ее аргументы оцениваются как в нормальной функции: всегда оценивается только условие, и либо оценивается результат, либо альтернатива, никогда не –

8

В зависимости от языка, но в C, java, perl, no, это языковые команды. Зарезервированные слова. Если бы они были функциями, вы могли бы перегрузить их и получить указатели на них и сделать все, что вы можете делать с функциями.

Это скорее философский вопрос, чем вопрос программирования.

+1

также функции возвращают данные. если и переключатель нет. Если смотреть меньше и меньше, чем функция, тем больше я думаю об этом. Вы не можете передать его другой функции в качестве параметра. – stu

+0

Но метод, включающий void, также не возвращает значение. – loyalpenguin

+1

, что не делает его функцией. Это делает его функцией, которая ничего не возвращает. Во всех других отношениях это все еще функция (получение указателя и т. Д.), Тогда как команда языка - нет. – stu

3

Вы можете, конечно, написать If() и IfElse(), но это не делает их одинаковыми.

if() определяется как инструкция на языке, на том же уровне, что и вызовы методов. Но есть различия в a.o. возможности синтаксиса и оптимизации.

So: Нет, if() заявление не метод. Вы не можете, например, не назначать его делегату.

2

Если бы это было классифицировано как метод, то, несомненно, мы были бы в сферах ОО, однако мы этого не сделаем, поэтому я предполагаю, что мы работаем над функцией. Конечно, функция/подпрограмма может быть записана для репликации поведения if (я думаю, что это фактически функция в lisp/schem).

Я бы не классифицировал его как функцию или даже подпрограмму, а просто управлял потоком.

2

Если по методом мы понимаем блок кода, который можно было бы назвать и поток управления автоматически возвращается к вызывающему абоненту, когда метод заканчивается, то if s не методы. Управляющий поток не возвращает в любом месте после выполнения if.

0

No.Вы не вернетесь назад, когда закончите с if. Это всего лишь контрольная инструкция.

0

Обратите внимание, что в вашем примере вы заменили один «оператор выбора» (спецификация C# 4, раздел 8.7), , если оператор (раздел 8.7.1) с другим, оператор switch (раздел 8.7.2). Вы также реорганизовали инструкцию выбора в отдельный метод. Однако вы не заменили использование инструкции выбора методом.

Ответ на ваш вопрос - «нет».

+0

Почему downvote? – phoog

4

Способ имеет подпись и ее основной целью является resuable логика, в то время как, если это просто условие, которое управляет потоком исполнения. Если вы понимаете сборку, вы бы знали, что оба они отличаются даже на очень низком уровне.

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: 
14

Вы не можете создать метод myIfStatement() и ожидать следующие работы:

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

if является контрольным заявлением и не может быть реплицируются методом, не может заменить собой вызов метода, если:

myVariable = if(something == somethingElse); 

if не могут быть перегружены.

Это несколько признаков того, что if не метод, но есть и другие, которых я подозреваю.

42

Нет, оператор «if» не похож на метод на C#. Рассмотрим способы, которыми он не похож на метод:

  • Объекты в содержащем блоке находятся в области тела «если». Но метод не получает никакого доступа к среде привязки своего вызывающего.
  • Во многих языках методы членов что-то - типа, возможно. Заявления не являются членами.
  • В языках с первоклассными методами методы могут передаваться как данные. (В C#, путем преобразования их в делегаты.) «Если» утверждения не являются первоклассными.
  • и так далее. Различия - мириады.

Теперь имеет смысл думать о некоторых вещах как о каком-то методе, а не о «если». Многие операторы, например, очень похожи на методы.Там очень мало концептуальное различие между:

decimal x = y + z; 

и

decimal x = Add(y, z); 

И в самом деле, если вы разобрать добавление двух знаков после запятой в C#, вы обнаружите, что сгенерированный код на самом деле является метод вызов.

Некоторые операторы имеют необычные характеристики, которые делают его трудно охарактеризовать их как методы, хотя:

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

отличается от

BOOL х = А (Y(), Z());

на языке, который имеет нетерпеливую оценку аргументов метода; в первом случае Z() не оценивается, если Y() является ложным. Во втором - оба оцениваются.

Ваше создание метода «если» скорее задает вопрос; реализация более сложная, чем инструкция «if». Говорить, что вы можете эмулировать «если» с помощью переключателя, это сказать, что вы можете подражать велосипеду с мотоциклом; заменить что-то простое на нечто более сложное, не является убедительным. Было бы разумнее указать, что переключатель на самом деле является причудливым «если».

2

Оператор IF - это функция условного контура, используемая в большинстве lanuages, которая выполняет поток пути из оценки логического условия true или false. Помимо случая предикации ветвления, это всегда достигается путем выборочного изменения потока управления на основе некоторого условия.

Конструкция IF - самая простая и необходимая логика, используемая при программировании. Он позволяет создавать строительные блоки для функций.

3

Является ли утверждение «если» рассмотренным методом?

Нет, это не считается методом, каким вы, возможно, уже видели в других ответах. Однако, если у вас был вопрос: «Он ведет себя как метод?», Тогда ответ может бытьда в зависимости от языка. Любой язык, поддерживающий первоклассные функции, может обойтись без встроенной конструкции/оператора вроде if. Игнорируйте все пушистые вещи, такие как возвращаемые значения и синтаксис, поскольку в основном это просто функция, которая вычисляет логическое значение и , если это true, тогда он выполняет некоторый блок кода. Также игнорируйте OO и функциональные различия, поскольку следующие примеры могут быть реализованы как метод класса Boolean на любом языке, который используется, как это делает Smalltalk.

Ruby поддерживает блоки исполняемого кода, которые могут быть сохранены в переменной и переданы методам. Итак, вот пользовательская функция _if_, реализованная в Ruby. Материал в пределах { .. } является частью исполняемого кода, который передается функции. Он также известен как блок в 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!"); }); 
2

Да, if функция в некоторых языках, хотя это редко и использование ограниченно.

Обычно конструкция является чем-то вроде if(booleanCondition, functionPointerToCallIfConditionTrue, functionPointerToCallIfCondtionFalse) Это может быть использовано как делегат для других функций, если вы хотите.

Mathematica, например, ведет себя так, и даже C# может сделать это с небольшой работой, если вы используете Linq-выражения; Взгляните на System.Linq.Expressions.Expression.IfThenElse.

Смежные вопросы