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);

本来は後藤ですが…

そのバージョンは、OP のものではなく、私が想像した goto コンストラクトを複製します。コードでよりきれいに見える場合は、「return」もほぼ同じように機能することに注意してください(ブール値を返すことで、ハックをさらに進めることができる場合があります)。

于 2011-02-28T23:49:40.343 に答える