1

你如何伪造不嵌套在不允许 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;

编辑:

  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];
4

2 回答 2

3

真值表

 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/case 是否违反规则?:)

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;
}
于 2011-02-28T23:39:01.800 回答
1

那么无论如何,你如何使用 goto 来做到这一点?这立即浮现在脑海,但没有完全相同的结果:

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

不管怎样,你确实有一些技巧可以打破嵌套的“if”。尝试:

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

它本质上是一个 goto,但是......

该版本将复制我想象的 goto 构造,而不是 OP 中的构造。请注意,“return”的工作原理大致相同,以防您的代码看起来更清晰(并且它可能能够通过返回一个布尔值来进一步推动黑客攻击)。

于 2011-02-28T23:49:40.343 回答