2016-05-03 14 views
0

(お金など形式テキスト)私はCでダフのデバイスのこの種を持っており、それが正常に動作します:移植ダフのデバイス

#include <stdio.h> 
#include <string.h> 

char *money(const char *src, char *dst) 
{ 
    const char *p = src; 
    char *q = dst; 
    size_t len; 

    len = strlen(src); 
    switch (len % 3) { 
     do { 
      *q++ = ','; 
      case 0: *q++ = *p++; 
      case 2: *q++ = *p++; 
      case 1: *q++ = *p++; 
     } while (*p); 
    } 
    *q++ = 0; 
    return dst; 
} 

int main(void) 
{ 
    char str[] = "1234567890123"; 
    char res[32]; 

    printf("%s\n", money(str, res)); 
    return 0; 
} 

出力:

1,234,567,890,123 

しかし、私は問題を抱えていますJavaScriptで同じことを実現しようとしている:

function money(src, dst) { 
    var len = src.length; 
    var i = 0; 

    switch (len % 3) { 
     do { 
      dst += ','; 
      case 0: dst += src[i++]; 
      case 2: dst += src[i++]; 
      case 1: dst += src[i++]; 
     } while (src[i]); 
    } 
    return dst; 
} 

var str = "1234567890123"; 
var res = ""; 

console.log(money(str, res)); 

nodejsリターンをこのエラー:

 do { 
     ^^ 
SyntaxError: Unexpected token do 

私の質問です:javascriptは計算されたGOTO文をサポートしていますか?

P.D:私は代替を望んでいない、なぜ私はちょうどなぜ動作していないか知りたい。

関連質問:Does Duff's Device work in other languages?

答えて

1

My question is: Does javascript supports computed GOTO statements?

ない本当にを提供しません。

P.D: I don't want an alternative, I just want to know why is not working.

JavaScriptではswitch statements must only contain case blocksのため動作しません。

そして、あなたはは、回避策を探していない可能性がありますものの、他の誰かは1の検索でこの質問を見つけるかもしれないので、私は関係なく、1を提供します。
mnieperには、asm.jsでの提案があります。

基本的な考え方は、while(true)ループを最上位に、switch文をその内部に持つことです。

goto: 
while(true) 
{ 
    switch(where) 
    { 
     // no breaks 
     case 0: 
      // some code... 
     case 1: 
      // some other code... 
     // ... 
    } 
} 

ジャンプをシミュレートするためには、しかし、一つだけのループを外側の構造を確認する必要があり、且つ変数を使用するダフのデバイスをシミュレートするために

where = 1; 
continue goto; 

を使用します最初の反復の後にswitch文が最初のケースで開始するようにトリガする値に設定されているswitch文。

だからあなたの場合には、それはswitchdo...while()を交換しdefaultケースと制御変数を追加することを意味します:

var where = len % 3; 
do { 
    switch (where) { 
     default: dst += ','; 
     case 0: dst += src[i++]; 
     case 2: dst += src[i++]; 
     case 1: dst += src[i++]; 
    } 
    where = -1; 
} while (src[i]); 

一般的には、この方法の一つの巨大な欠点は、それがないということはもちろんですJavaScriptのどこでも使用されているコールバックを介して動作します。
ただし、単一のシーケンシャルコンテキストで使用されている限り、動作するはずです。

詳細については、the ticket posted on the asm.js repoを参照してください。

+0

ニース、意味があります。そして、リンクのおかげで、 –

+0

すみませんが、私は理解していません: 'それはコールバックを介して動作しません'、それはどういう意味ですか? –

+1

@AlterMann基本的には、機能間では機能しません。 JavaScriptでは、将来の値やイベントに反応する手段として関数オブジェクトを渡すのが一般的です。 100ms待つ: 'window.setTimeout(function(){/ * * /}、100);'。そのような関数がループの中で*宣言されていると、ループ内で印象を与えるかもしれません(したがって、 'break'、' continue'などを使うことができます)が、実行された場合はそうではありません非同期に。ちょうどGoogleの "JavaScriptの戻り値は動作しません"とあなたはちょうどその戻り値を代わりにその問題について正確に質問して初心者の質問のボート負荷を見つけるでしょう。 – Siguza

1

JavaScriptのswitch文がそのように動作しません。

switch (expr) { 
    case expr: 
    statements; 
    break; 
    case expr: 
    statements; 
    break; 
    default: 
    statements; 
    break; 
} 

しかし、JavaScriptが​​あなたのループを制御する

Example from MDN

var itemsPassed = 0; 
var i, j; 

top: 
for (i = 0; i < items.length; i++){ 
    for (j = 0; j < tests.length; j++) { 
    if (!tests[j].pass(items[i])) { 
     continue top; 
    } 
    } 

    itemsPassed++; 
} 

Another example from MDN

var allPass = true; 
var i, j; 

top: 
for (i = 0; items.length; i++) 
    for (j = 0; j < tests.length; i++) 
    if (!tests[j].pass(items[i])){ 
     allPass = false; 
     break top; 
    }