Может каждый если еще конструкция быть замененным эквивалентным условным выражением?

Стандартная реализация Python (общеизвестный как CPython, как это записано в C) использует потоки ОС, но так как существует Глобальная Блокировка Интерпретатора , только одному потоку за один раз позволяют выполнить код Python. Но в рамках тех ограничений, библиотеки поточной обработки устойчивы и широко используются.

, Если Вы хотите быть в состоянии использовать несколько ядер процессора, существует несколько опций. Нужно использовать несколько интерпретаторов Python одновременно, как упомянуто другими. Другая опция состоит в том, чтобы использовать различную реализацию Python, который не использует GIL. Две основных опции Jython и IronPython.

Jython записан в Java и теперь довольно зрел, хотя некоторые несовместимости остаются. Например, веб-платформа Django отлично еще не работает , но становится ближе все время. Jython большой для потокобезопасности , выходит лучше в сравнительных тестах и имеет развязное сообщение для тех, которые желают GIL.

IronPython использует платформу.NET и записан в C#. Совместимость достигает стадии, где Django может работать на IronPython (по крайней мере, как демонстрация) и существует руководства по использованию потоков в IronPython.

8
задан Ether 30 January 2010 в 18:44
поделиться

8 ответов

Можно ли заменить каждую конструкцию if-else эквивалентным условным выражением с помощью условного оператора?

Нет, вы задали этот вопрос задом наперед. "Тела" if / else содержат операторы, и невозможно превратить каждый оператор в выражение , такое как операторы try, while, break, а также объявления. Однако многие «операторы» на самом деле являются замаскированными выражениями:

++i;
blah = 42;
some_method(a,b,c);

Все они являются операторами, которые состоят из одного выражения (приращение, присваивание, вызов функции, соответственно) и могут быть преобразованы в выражения в условном выражении.

Итак , давайте перевернем вопрос, поскольку похоже, что вы действительно хотите знать, насколько операторы if / else эквивалентны тернарным условным выражениям: Можно ли заменить каждое условное выражение эквивалентными операторами if / else? Почти все, да. Типичный пример - операторы возврата:

return cond ? t : f;
// becomes:
if (cond) return t;
else return f;

Но также и другие выражения:

n = (cond ? t : f);
// becomes:
if (cond) n = t;
else n = f;

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

T obj (cond ? t : f);
// becomes:
SomeType temp;
if (cond) temp = t;
else temp = f;
T obj (temp);

Обратите внимание, что это гораздо более утомительно / громоздко и требует чего-то зависящего от типа, если SomeType не может быть по умолчанию -конструировано и назначено.

11
ответ дан 5 December 2019 в 07:58
поделиться

Вкл. на поверхности нет. Условный оператор - это выражение (то есть, у него есть значение), а if / else - это оператор (таким образом, не имеет значения). Они удовлетворяют различные «потребности» в синтаксисе языка.

Однако, поскольку вы можете игнорировать значения выражений и поскольку любое выражение можно превратить в оператор, добавив точку с запятой, вы можете по существу эмулировать if / else с помощью условного выражения и две вспомогательные функции:

// Original code:
if (condition) {
  // block 1
}
else {
  // block 2
}

// conditional expression replacement:

bool if_block() {
  // block 1
  return true;
}

bool else_block() {
  // block 2
  return true;
}

// Here's the conditional expression.  bool value discarded:
condition ? if_block() : else_block();

Однако, сказав это, я не уверен, что это нечто большее, чем любопытство ...

4
ответ дан 5 December 2019 в 07:58
поделиться
if( cond )
    break;
else
    a=b;

не всегда можно заменить оператором ?: . Вы можете часто (если не всегда) переосмыслить весь свой код, чтобы обеспечить эту замену, но обычно вы не можете поместить что-либо, что контролирует выполнение, в ?: . break , return , циклы, throw и т. Д.

1
ответ дан 5 December 2019 в 07:58
поделиться

Нет, конечно, нет. По уже указанным и другим причинам!

#include <cstdlib>
#include <iostream>

int main()
{
    if(int i = std::rand() % 2)
    {
        std::cout << i << " is odd" << std::endl;
    }
    else
    {
        std::cout << i << " is even" << std::endl;
    }
}

Узнайте, где это заявлено. Это не часто используемый метод, но его можно использовать в таких ситуациях, как COM, где каждый вызов возвращает HRESULT, который (почти всегда) равен нулю в случае успеха (S_OK), ненулевой в случае неудачи, поэтому вы можете написать что-то вроде:

if(HRESULT hr = myInterface->myMethod())
{
    _com_raise_error(hr);
}

Тернарный оператор не может делать ничего аналогичного.

2
ответ дан 5 December 2019 в 07:58
поделиться

In principle, yes:

if (A) B; else C

becomes

try {
  A ? throw TrueResult() : throw FalseResult();
  // or: throw A ? TrueResult() : FalseResult();
} catch (TrueResult) {
  B;
} catch (FalseResult) {
  C;
}

Compared to using procedures (which are more natural), this allows break, continue, return etc. It requires evaluation of A doesn't end with TrueResult/FalseResult but if you use those exceptions only to simulate if, it won't be a problem.

1
ответ дан 5 December 2019 в 07:58
поделиться

Условный оператор ожидает, что оба элемента, следующие за ? , будут r-значениями (поскольку результат условного оператора сам по себе является r-значением) - так что пока я я не совсем специалист по стандартам C / C ++, мне кажется, что следующее будет запрещено (или, если это не удастся, крайне плохой стиль кодирования ...):

(condition) ? return x : return y;

, тогда как версия if-else будет вполне стандартной:

if(condition) return x;
else return y;

Теперь, с учетом сказанного, могли бы вы взять любую программу и написать аналогичную программу, которая не использует if-else? Конечно, возможно. Но это не значит, что это была бы хорошая идея. ;)

1
ответ дан 5 December 2019 в 07:58
поделиться

Использование условного оператора приводит к выражению, и оба возможных результата условного оператора должны быть «совместимыми» (преобразовываться в один и тот же тип).

if - конструкция else не должна даже «возвращать» какой-либо тип, не говоря уже о том же самом из обеих веток.

1
ответ дан 5 December 2019 в 07:58
поделиться

GCC имеет выражение оператора , с его помощью вы можете переписать операторы if в эквивалентные ?: выражения:

if (<expression>)
  <statement1>
else
  <statement2>

РЕДАКТИРОВАТЬ: Приведения void служат двум целям. Подвыражения в ?: должны иметь один и тот же тип, и без приведения void компилятор может вывести предупреждение: оператор без эффекта .

(<expression>)? (void)({<statement1>}) : (void)({<statement2>});
0
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: