Как я могу написать как x == либо 1, либо 2 на языке программирования?

Возможный дубликат:
Почему в большинстве языков программирования есть только операторы сравнения двоичного равенства?

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

Я хотел бы написать как «если x равен 1 или 2 => ИСТИНА (иначе ЛОЖЬ)».

Но когда я пишу это на языке программирования, скажем, на C,

( x == 1 || x == 2 )

это действительно работает, но выглядит неудобным и трудным для чтения. Я полагаю, что можно было бы упростить такую ​​операцию или, поэтому, если у вас есть какие-либо идеи, сообщите мне. Спасибо, Натан


person Culip    schedule 06.10.2010    source источник
comment
Я думал, что такая функция могла быть доступна на любом языке, поскольку такого рода операции выполнялись очень часто.   -  person Culip    schedule 06.10.2010
comment
разработать собственный язык программирования?   -  person Andre Haverdings    schedule 06.10.2010
comment
Это необходимая часть изучения языка программирования, вам нужно научиться читать код и сразу понимать эти конструкции. Логическая логика - это лишь верхушка айсберга. Существенная проблема заключается в том, что люди не используют логические обозначения, например, принято говорить: если x = a или b, то ... где мы должны сказать: if x = a или a = b.   -  person JeffV    schedule 06.10.2010
comment
должно быть вики сообщества: это опрос / обсуждение   -  person SilentGhost    schedule 06.10.2010
comment
Тупой вопрос (по крайней мере, для данного случая), где x равно 1 или x равно 2, не более неуклюжий, чем x равно 1 или 2. Это более интересный вопрос, когда набор возможных значений больше и есть несколько разумных ответов.   -  person Murph    schedule 06.10.2010
comment
@Murph: Значит, лучше было бы (devsLike == pizza || devsLike == cake)?   -  person Ryan Ternier    schedule 07.10.2010
comment
@Ryan - возможно, я просто слишком долго этим занимаюсь ... Быть программистом - это отчасти значит откровенно говорить о значении и разработчиках, как пицца или торт - это просто сокращение от разработчиков, таких как пицца или разработчики, как торт, который работает на английском языке и если вы не видите двух сторон, то, как мне кажется, у вас как у разработчика проблемы. Возможно, это слишком агрессивно ... но это связано с мышлением.   -  person Murph    schedule 07.10.2010
comment
@Murph, Не то чтобы тупой ... Чем лаконичнее код, тем больше времени экономишь. Если язык поддерживает эти инструменты, тогда кодировщик владеет своим стилем, а не язык делает себя хуже.   -  person    schedule 07.03.2012
comment
@haibison вы когда-нибудь видели APL? Это кратко ... Точно так же довольно близко писать только код. И я был осторожен, чтобы отметить, что смотреть на отношения IN немного интереснее.   -  person Murph    schedule 07.03.2012


Ответы (22)


Python позволяет проверить принадлежность к последовательности:

if x in (1, 2):
person Ignacio Vazquez-Abrams    schedule 06.10.2010
comment
Вау, работает! Но нормально ли использовать массив? - person ; 06.10.2010
comment
Это не массив, это структура, называемая кортежом. И это нормально использовать до 5 или около того значений; кроме того, более эффективно использовать набор (тестирование включения в последовательности - O (n), тогда как тестирование включения в наборе - O (1)). - person Ignacio Vazquez-Abrams; 06.10.2010
comment
Я понимаю. Сегодня я многому научился у вас. Спасибо! - person ; 06.10.2010
comment
Один из многих примеров, показывающих python, дает вам красивый код по сравнению с некоторыми из более традиционных языков :). - person bastijn; 06.10.2010
comment
@ Игнасио Васкес-Абрамс: как это может быть O (1) с наборами? Нас учили, что в лучшем случае это будет O (log n) ... - person mike3996; 06.10.2010
comment
@progo: потому что наборы представлены в виде хэш-таблиц, которые имеют постоянное среднее время поиска. - person Martin Jonáš; 06.10.2010
comment
@Matajon: о, Python не перестает меня удивлять :) - person mike3996; 06.10.2010
comment
В Python кортеж - это просто неизменяемый список. - person kennytm; 06.10.2010
comment
Но разве создание набора не будет O (n)? - person configurator; 06.10.2010
comment
Итак, если бы я написал фрагмент кода (простите меня за то, что не знаю синтаксиса набора) if x is set(1, 2, 3, 4, 5, 6, 7, 8, 9, 10):, он будет создавать набор каждый раз, когда попадет в эту строку, так что кортеж в любом случае был бы быстрее. По крайней мере, мне так кажется. - person configurator; 06.10.2010
comment
Вы создаете набор заранее и обращаетесь к нему по имени каждый раз, когда это необходимо. - person Ignacio Vazquez-Abrams; 06.10.2010
comment
Такой же синтаксис в Паскале, плюс у вас может быть набор (1, 2, 3) или интервал (1..3). Это было одним из основных недостатков C для меня, когда я изучал его после Паскаля, сила переключателя / case по сравнению с case / of, который в Паскале позволяет тестировать наборы и интервалы. - person jv42; 06.10.2010
comment
Я не знаю никакого питона, но я полагаю, что это O (1) в среднем, если вы проверяете много значений по постоянному набору. Если вы тестируете одно значение, оно все равно O (n), потому что вам нужно создать набор ... - person Kobi; 06.10.2010
comment
@configurator: в Python 3 вы можете использовать набор, написав if x in {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}. - person endolith; 06.10.2010
comment
Коби: Доступ очень близок к O (1) даже при тестировании одного значения - но стоимость создания набора очень часто игнорируется. - person configurator; 06.10.2010
comment
Поиск по хеш-таблице - это не O (1), а O (k); т.е. это зависит от конкретной хеш-таблицы и хеш-функции, а не от количества элементов в таблице. - person ; 07.10.2010
comment
Если бы компилятор Python был умным, он бы построил набор констант один раз во время компиляции / синтаксического анализа и сохранил бы его навсегда. Однако так ли это умен? - person Zan Lynx; 11.10.2010
comment
@Zan: он не может знать, относится ли set к __builtins__.set или какому-либо модулю / локальному объекту, поэтому он выполняет вызов во время выполнения. - person Ignacio Vazquez-Abrams; 11.10.2010

Версия расширения на C #

шаг 1: создайте метод расширения

public static class ObjectExtensions
{
    public static bool Either(this object value, params object[] array)
    {
        return array.Any(p => Equals(value, p));
    }
}

шаг 2: используйте метод расширения

if (x.Either(1,2,3,4,5,6)) 
{
}
else
{
}
person Andre Haverdings    schedule 06.10.2010
comment
@ Пирс Майерс: Зачем создавать новый список ‹T›? - person Joh; 06.10.2010
comment
@Piers Myers Просто используйте (Array.IndexOf(values, value) > -1), чтобы не создавать новый список. - person Jess; 06.10.2010
comment
Вау, мне это очень нравится! Методы расширения настолько крутые! - person John Gietzen; 06.10.2010
comment
@Andrew Koester - да, это еще быстрее, спасибо - всегда хорошо узнавать что-то новое. - person Piers Myers; 07.10.2010

Хотя в этой ветке есть ряд довольно интересных ответов, я хотел бы отметить, что они могут иметь последствия для производительности, если вы выполняете такую ​​логику внутри цикла в зависимости от языка. Насколько компьютер понимает, if (x == 1 || x == 2), безусловно, легче всего понять и оптимизировать, когда он скомпилирован в машинный код.

person Darth Android    schedule 06.10.2010
comment
Но это зависит от языка. Я ожидал бы, что код, сгенерированный Python для x in (1, 2), будет по крайней мере так же хорошо оптимизирован, как код, сгенерированный Python для x == 1 or x == 2. Конечно, в C верно противоположное. - person intuited; 06.10.2010
comment
Верно, но, как упоминалось в интуитивно понятном, это сводится к базовой реализации. Но я не думаю, что это отвечает на вопрос ОП, даже если это правда и заслуживает упоминания. - person haylem; 06.10.2010
comment
@intuited - просто к сведению: в Python 3.1.2 производительность для обоих почти одинакова. Я просто time сделал это и получаю 0,042 секунды для in и 0,047 секунды для or, если x равно 1, и 0,08 секунды для обоих, если x равно 2 или 0. Итак, если вы выполняете микрооптимизацию в Python, посмотрите на порядок условия, которые вы тестируете ... - person Tim Pietzcker; 06.10.2010

Когда я начал программировать, мне тоже показалось странным, что вместо чего-то вроде:

(1 < x < 10)

Пришлось написать:

(1 < x && x < 10)

Но так работает большинство языков программирования, и через некоторое время вы к этому привыкнете.

Так что я считаю, что писать

( x == 1 || x == 2 )

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

Только более новые языки программирования, такие как Python, Ruby и т. Д., Позволяют писать проще и удобнее. В основном это связано с тем, что эти языки программирования предназначены для повышения продуктивности программистов, в то время как основной целью старых языков программирования была производительность приложений, а не продуктивность программистов.

person Florin    schedule 06.10.2010
comment
Вы можете сделать первый пример на Python! - person Grant Paul; 09.10.2010

Это естественно, но зависит от языка

Ваш подход действительно может показаться более естественным, но это действительно зависит от языка, который вы используете для реализации.

Обоснование беспорядка

C является язык системного программирования и довольно близок к аппаратному обеспечению (хотя забавно, поскольку мы привыкли рассматривать язык" высокого уровня ", а не писать машинный код), он не совсем выразительный.

Современные языки высокого уровня (опять же, спорно, шепелявость не такая современная, исторически говоря, но позволит вам делать это красиво) позволяет делать такие вещи, используя встроенные конструкции или поддержку библиотеки (например, с использованием диапазонов, кортежей или эквивалентов в таких языках, как Python, Ruby, Groovy, ML-языки, Haskell ...).

Возможные решения

Опция 1

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

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

/* returns non-zero value if check is in values */
int is_in(int check, int *values, int size);

Однако, как вы быстро увидите, это очень простой и не очень гибкий:

  • работает только с целыми числами,
  • он работает только для сравнения одинаковых значений.

Вариант 2

На ступеньку выше по лестнице сложности (с точки зрения языков) альтернативой было бы использование препроцессора макросы в C (или C ++), чтобы добиться аналогичного поведения, но остерегайтесь побочных эффектов.

Другие варианты

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

Следующим шагом будет реализация аналогичной вещи в C ++ с использованием шаблоны, чтобы сделать это для разных типов с помощью одной реализации.

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


Выберите правильный язык (или научитесь отпускать!)

Как правило, языки, предпочитающие функциональное программирование, по очевидным причинам имеют встроенную поддержку такого рода вещей. .

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

Возможно, библиотека уже реализует такую ​​вещь, о которой я не знаю.

person haylem    schedule 06.10.2010

было много интересных альтернатив. Я удивлен, что никто не упомянул switch ... case - так вот:

switch(x) {
case 1:
case 2:
  // do your work
  break;
default:
  // the else part
}
  1. он более читабелен, чем набор x == 1 || х == 2 || ...
  2. более оптимально, чем наличие массива / набора / списка для проверки членства
person kartheek    schedule 06.10.2010
comment
Я не согласен, что это выглядит более читабельным. х == 1 || На мой взгляд, x == 2 довольно просто по сравнению с переключателем. Это может быть более оптимальным, чем проверка массива, но, вероятно, не более оптимальным, чем исходный оператор. - person Patrick; 06.10.2010
comment
это может быть не так очевидно, когда у вас есть два сравнения, но когда вы говорите 10 сравнений, тогда выполняется x == 1 || ... x == 10 может быть подавляющим и подверженным ошибкам. хотя вы сравниваете один и тот же var x, вы повторяете его 10 раз - и вам нужно пройти все 10 htem, чтобы убедиться, что один из них не является y - person kartheek; 06.10.2010
comment
Тогда я бы все же определенно предпочел реализацию, повторяющую массив, а не случай переключения, который будет принимать много LOC каждый раз без значительного преимущества ни в удобочитаемости, ни в ремонтопригодности, но при этом подвержен ошибкам каждый раз, когда вы повторно реализуете Это. - person haylem; 06.10.2010
comment
решение итерации по массиву доступно для чтения только на языках сценариев. если задуматься, это то, что читается на C, C ++ или Java. вместо этого вы найдете swithc ... case более читабельным. Также switch ... case почти напрямую переводится в машинный код (инструкции перехода) и, следовательно, обеспечивает лучшую производительность, чем итерация по спискам. - person kartheek; 06.10.2010
comment
Это вряд ли более читабельно или лаконично; тем более для короткого списка элементов. - person haylem; 19.08.2011

Я сомневаюсь, что когда-либо сделаю это, но, чтобы ответить на ваш вопрос, вот один из способов добиться этого на C #, включающий небольшой вывод общего типа и некоторое злоупотребление перегрузкой оператора. Вы можете написать такой код:

if (x == Any.Of(1, 2)) {
    Console.WriteLine("In the set.");
}

Где Any класс определяется как:

public static class Any {
    public static Any2<T> Of<T>(T item1, T item2) {
        return new Any2<T>(item1, item2);
    }
    public struct Any2<T> {
        T item1;
        T item2;
        public Any2(T item1, T item2) {
            this.item1 = item1;
            this.item2 = item2;
        }
        public static bool operator ==(T item, Any2<T> set) {
            return item.Equals(set.item1) || item.Equals(set.item2);
        }
        // Defining the operator== requires these three methods to be defined as well:
        public static bool operator !=(T item, Any2<T> set) {
            return !(item == set);
        }
        public override bool Equals(object obj) { throw new NotImplementedException(); }
        public override int GetHashCode() { throw new NotImplementedException(); }
    }
}

Возможно, у вас может быть несколько перегрузок метода Any.Of для работы с 3, 4 или даже большим числом аргументов. Также могут быть предоставлены другие операторы, и сопутствующий класс All может делать что-то очень похожее, но с && вместо ||.

Глядя на разборку, можно заметить, что из-за необходимости вызывать Equals происходит изрядная часть бокса, так что в конечном итоге это оказывается медленнее, чем очевидная конструкция (x == 1) || (x == 2). Однако, если вы измените все <T> на int и замените Equals на ==, вы получите что-то, что выглядит хорошо встроенным, примерно с той же скоростью, что и (x == 1) || (x == 2).

person Wesley Hill    schedule 06.10.2010
comment
+1: потому что я сомневаюсь, что сделаю это, но это довольно хороший ответ. - person haylem; 19.08.2011

Эээ, что с этим не так? Ну что ж, если вы действительно используете его много и ненавидите внешний вид, сделайте что-то вроде этого в C #:

#region minimizethisandneveropen
public bool either(value,x,y){       
    return (value == x || value == y);
}
#endregion

и в местах, где вы его используете:

if(either(value,1,2))
   //yaddayadda 

Или что-то в этом роде на другом языке :).

person bastijn    schedule 06.10.2010
comment
Вы можете избежать условия в своей функции: return (value == x || value == y); - person Karel Petranek; 06.10.2010
comment
Шутки, так верно, ха-ха. Еще рано ;) - person bastijn; 06.10.2010
comment
Небольшой комментарий, если позволите - это немного сбивает с толку. Я ожидал, что value будет первым (но это только я), а x используется дважды, один раз как value и один раз как первый аргумент. - person Kobi; 06.10.2010
comment
@dark_charlie: Аарх, я не могу придумать, как :( Пожалуйста, намекни мне! - person legends2k; 06.10.2010
comment
ну, это было просто показать идею, но я исправил их для вас :). - person bastijn; 06.10.2010

В php вы можете использовать

$ret = in_array($x, array(1, 2));

person Joyce Babu    schedule 06.10.2010
comment
Святая мольба: выделение памяти, построение объекта, вызов функции, линейный поиск, уничтожение и сборка мусора для выполнения чего-то эквивалентного двум кодам операций сравнения и перехода. PHP снова оправдывает все мои ожидания. - person Crashworks; 06.10.2010
comment
@Crashworks. Удивительное последнее предложение от джентльмена такого высочества, как вы. - person Yehonatan; 06.10.2010

Насколько мне известно, в C. нет встроенного способа сделать это. Вы можете добавить свою собственную встроенную функцию для сканирования массива целых чисел для значений, равных x ....

Вот так:

inline int contains(int[] set, int n, int x)
{ 
  int i;
  for(i=0; i<n; i++)
    if(set[i] == x)
      return 1;

  return 0;
}

// To implement the check, you declare the set
int mySet[2] = {1,2};
// And evaluate like this:
contains(mySet,2,x) // returns non-zero if 'x' is contained in 'mySet'
person S.C. Madsen    schedule 06.10.2010

В T-SQL

where x in (1,2)
person adopilot    schedule 06.10.2010

В COBOL (прошло много времени с тех пор, как я даже бегло не взглянул на COBOL, так что здесь я могу ошибиться в некоторых деталях):

IF X EQUALS 1 OR 2
...

Так что синтаксис определенно возможен. Тогда вопрос сводится к тому, "почему он не используется чаще?"

Ну, дело в том, что разбирать подобные выражения - это своего рода сука. Не в таком одиночестве, ум, а в сложных выражениях. Синтаксис начинает становиться непрозрачным (с точки зрения разработчика компилятора), а семантика становится совершенно непонятной. IIRC, многие компиляторы COBOL даже предупредят вас, если вы используете такой синтаксис, из-за потенциальных проблем.

person JUST MY correct OPINION    schedule 06.10.2010
comment
И когда синтаксис становится непрозрачным с точки зрения разработчика компилятора, он также становится непрозрачным с точки зрения программиста. Обычно, если разумный синтаксический анализатор может что-то разобрать, то и человек тоже. - person David Thornley; 06.10.2010
comment
Люди могут разбирать более сложные выражения перед тем, как разбить их на части. Доказательства: почти все на естественном языке. : D - person JUST MY correct OPINION; 06.10.2010

В .Net вы можете использовать Linq:

int[] wanted = new int{1, 2};

// you can use Any to return true for the first item in the list that passes
bool result = wanted.Any( i => i == x );

// or use Contains
bool result = wanted.Contains( x );

Хотя лично я считаю, что базовая || достаточно проста:

bool result = ( x == 1 || x == 2 );
person Keith    schedule 06.10.2010
comment
Ооооо, вы изменили код, не обновляя комментарий. Непослушный =) - person demoncodemonkey; 06.10.2010

Спасибо, Игнасио! Перевожу на Ruby:

[ 1, 2 ].include?( x )

и это тоже работает, но я не уверен, будет ли это выглядеть ясно и нормально. Если вы знаете о Ruby, сообщите, пожалуйста. Также, если кто-нибудь знает, как написать это на C, скажите, пожалуйста. Спасибо. -Натан

person Culip    schedule 06.10.2010
comment
Для C вы создаете массив с указателем в конце и просматриваете массив в поисках совпадения или указателя. Если результирующий индекс содержит дозор, верните false, в противном случае верните true. - person Ignacio Vazquez-Abrams; 06.10.2010
comment
Это совершенно нечитаемо! - person UpTheCreek; 06.10.2010
comment
@UpTheCreek: Добро пожаловать в Ruby. Мощь Python, удобочитаемость Perl. - person Ignacio Vazquez-Abrams; 06.10.2010
comment
Я, вероятно, не стал бы делать это только для двух чисел, но это определенно не нечитаемо для программиста на Ruby. - person Jonas Elfström; 06.10.2010
comment
Что ж, в Ruby для этого нет синтаксического сахара, но он читается ... - person samuil; 25.02.2011

Perl 5 с Perl6 :: Junction:

use Perl6::Junction 'any';
say 'yes' if 2 == any(qw/1 2 3/);

Perl 6:

say 'yes' if 2 == 1|2|3;

Эта версия настолько удобочитаема и лаконична, что я бы использовал ее вместо оператора ||.

person zoul    schedule 06.10.2010

В Паскале есть (ограниченное) понятие наборов, поэтому вы можете:

if x in [1, 2] then

(не касался компилятора Паскаля десятилетиями, поэтому синтаксис может быть отключен)

person Ferruccio    schedule 06.10.2010
comment
Однако он ограничен порядковыми типами с ‹= 256 возможными значениями. Компилятор Delphi реализует наборы как одну или несколько 32-битных битовых масок. Затем для проверки членства использует бинарные операторы OR. - person Gerry Coll; 07.10.2010

Попробуйте использовать только один небитовый логический оператор (не рекомендуется, не тестировался):

if( (x&3) ^ x ^ ((x>>1)&1) ^ (x&1) ^ 1 == 0 )

Часть (x&3) ^ x должна быть равна 0, это гарантирует, что x находится между 0 и 3. У других операндов будет установлен только последний бит.

Часть ((x>>1)&1) ^ (x&1) ^ 1 гарантирует, что последний и предпоследний биты различны. Это будет применяться к 1 и 2, но не к 0 и 3.

person Benoit    schedule 06.10.2010
comment
+1. этот ответ следует принять. гений. - person Sanjay Manohar; 06.10.2010

Вы говорите, что запись (x==1 || x==2) "неудобная и трудная для чтения". Позволю себе не согласиться. Он отличается от естественного языка, но очень ясен и прост для понимания. Вам просто нужно думать как компьютер.

Кроме того, нотации, упомянутые в этом потоке, такие как x in (1,2), семантически отличаются от того, что вы действительно спрашиваете, они спрашивают, является ли x членом набора (1,2), а это не то, о чем вы спрашиваете. Вы спрашиваете if x equals to 1 or to 2, что логически (и семантически) эквивалентно if x equals to 1 or x equals to 2, что переводится как (x==1 || x==2).

person Nir Levy    schedule 06.10.2010

В java:

 List list = Arrays.asList(new Integer[]{1,2});
 Set set = new HashSet(list);
 set.contains(1)
person Gadolin    schedule 06.10.2010
comment
Вы можете сделать это одной строкой: if (new HashSet ‹Integer› (Arrays.asList (1, 2, 3)). Contains (2)) - person mavroprovato; 06.10.2010
comment
Хорошо, я бы хотел использовать 1.5 ›= версию с переменным количеством параметров. - person Gadolin; 06.10.2010
comment
@mavro, вы можете использовать еще меньше кода, пропустите HashSet: if (Arrays.asList(1, 2, 3).contains(2)) - person Sean Patrick Floyd; 06.10.2010

У меня есть макрос, который я часто использую, который несколько близок к тому, что вы хотите.

#define ISBETWEEN(Var, Low, High) ((Var) >= (Low) && (Var) <= (High))

ISBETWEEN(x, 1, 2) вернет истину, если x равно 1 или 2.

person Ricky Bennett    schedule 06.10.2010

Ни C, C ++, VB.net, C # .net, ни какой-либо другой подобный язык, который я знаю, не имеют эффективного способа проверки того, является ли что-то одним из нескольких вариантов. Хотя (x == 1 || x == 2) часто является наиболее естественным способом кодирования такой конструкции, этот подход иногда требует создания дополнительной временной переменной:

  tempvar = somefunction(); // tempvar only needed for 'if' test:
  if (tempvar == 1 || tempvar == 2)
    ...

Конечно, оптимизатор должен иметь возможность эффективно избавиться от временной переменной (засунуть ее в регистр на короткое время, когда она используется), но я все еще считаю этот код некрасивым. Кроме того, на некоторых встроенных процессорах наиболее компактным и, возможно, самым быстрым способом записи (x == const1 || x == const2 || x == const3) является:

  movf  _x,w             ; Load variable X into accumulator
  xorlw const1           ; XOR with const1
  btfss STATUS,ZERO      ; Skip next instruction if zero
   xorlw const1 ^ const2 ; XOR with (const1 ^ const2)
  btfss STATUS,ZERO      ; Skip next instruction if zero
   xorlw const2 ^ const3 ; XOR with (const2 ^ const3)
  btfss STATUS,ZERO      ; Skip next instruction if zero
   goto NOPE

Этот подход требует еще двух инструкций для каждой константы; все инструкции будут выполнены. Тесты с ранним выходом сэкономят время, если ветка будет занята, и потратят время впустую. Кодирование с использованием буквальной интерпретации отдельных сравнений потребовало бы четырех инструкций для каждой константы.

Если бы в языке была конструкция «если переменная является одной из нескольких констант», я бы ожидал, что компилятор будет использовать приведенный выше шаблон кода. Жаль, что такой конструкции не существует в обычных языках.

(примечание: у Pascal есть такая конструкция, но реализации во время выполнения часто очень расточительны как по времени, так и по пространству кода).

person supercat    schedule 06.10.2010

return x === 1 || x === 2 в javascript

person Amareswar    schedule 06.10.2010
comment
Не уверен, почему это было отклонено, хотя некоторые дополнительные объяснения могут помочь. В этом случае использование === гарантирует, что 1 или 2 пройдут, но "1" или "2" не пройдут, а == неявно скрывает строки и сравнивает значения. Вы можете захотеть сделать это любым способом на языке с динамической типизацией. - person Keith; 06.10.2010
comment
Это вообще не отвечает на вопрос. - person Paddy; 06.10.2010
comment
Я думаю, что он отвергнут, потому что он вообще не отвечает на вопрос. OP не хочет знать о способах выполнения эквивалентного оператора на других языках, но о способах его более выразительного написания. - person haylem; 06.10.2010