Абсолютно СУХИЕ условные выражения на языке, который не позволяет переходить? - PullRequest
1 голос
/ 01 марта 2011

Как вы фальсифицируете условные выражения, которые не вкладываются в язык, который не позволяет переходить на goto? Я хочу сделать следующее:

if (condition1)
    action1;
if (!condition1 && condition2)
    action2;
if (!condition2 && condition3)
    action3;

Без:

  1. Излишне оценивать любое условие более одного раза.
  2. Нет необходимости хранить результат любой такой оценки в переменной.
  3. Нет необходимости указывать более одного раза, что любое действие должно быть выполнено.

Исходный фрагмент не соответствует требованию 1.

Следующий фрагмент не соответствует требованию 2:

if (condition1) {
    action1;
    c2 = false;
}
else if (c2 = condition2)
    action2;

if (!c2 && condition3)
    action3;

А следующий фрагмент не соответствует требованию 3:

if (condition1) {
    action1;
    if (condition3)
        action3;
}
else if (condition2)
    action2;
else if (condition3)
    action3;

EDIT:

  1. Невозможно, чтобы condition1 и condition2 были истинными одновременно.

  2. Невозможно, чтобы condition2 и condition3 были истинными одновременно.

Вот оригинальный код (в JavaScript):

// If only the array of elements was specified,
// wrap it inside an object.
if (info.constructor !== Object)
    info = {children: info};

// If no array of elements was specified, create
// an empty array of elements.
if (!info.children)
    info.children = [];

// If, instead of an array of elements, we have
// a single element, wrap it inside an array.
if (info.children.constructor !== Array)
    info.children = [info.children];

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Таблица правды

 C1 C2 C3  Action
 0  0  0   None
 0  0  1   A3
 0  1  0   A2
 0  1  1   A2
 1  0  0   A1
 1  0  1   A1+A3
 1  1  0   A1
 1  1  1   A1

Является ли переключатель / регистр против правил?:)

switch(C1*4 + C2*2 + C1) {
  case 7: case 6: case 4:  A1; break;
  case 5: A1; A3; break;
  case 3: case 2: A2; break;
  case 1: A3; break;
}
1 голос
/ 01 марта 2011

Так как же это сделать с goto?Это сразу приходит на ум, но не дает такого же результата:

if(condition1) {
    action1;
    goto a;
}
if(condition2) {
    action2;
    goto b;
}
a:
if(condition3) {
    //This will run if condition1 && condition2 && condition3
    action3;
}
b:

В любом случае, у вас есть несколько трюков, которые могут вырваться из вложенных «если».Попробуйте:

do {
    if(condition1) {
        action1;
    } elseif(condition2) {
        action2;
        break;
    }
    if(condition3) {
        action3;
    }
} while(false);

По сути, это goto, но ...

Эта версия будет дублировать конструкцию goto, которую я представлял, а не ту, что в OP.Обратите внимание, что «возврат» работает примерно так же, если он выглядит чище в вашем коде (и он может продвинуть хак дальше, вернув логическое значение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...