Porting duff's设备从C语言转换为JavaScript
Porting duff's device from C to JavaScript
我在C中有这种Duff的设备,它运行良好(将文本格式化为货币):
#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语句吗?
第页。D: 我不想有其他选择,我只想知道为什么不起作用。
相关问题:达夫的设备在其他语言中工作吗?
我的问题是:javascript支持计算GOTO语句吗?
不是真的。
第页。D: 我不想有其他选择,我只想知道为什么不起作用。
它不起作用,因为在JavaScript中,switch
语句必须只包含case
块。
尽管你可能没有寻找解决方案,但其他人在寻找解决方案时可能会发现这个问题,所以我无论如何都会提供一个
这要归功于mniper,他在asm.js.上提出了这个建议
其基本思想是在顶层有一个while(true)
循环,其中有一条switch
语句
goto:
while(true)
{
switch(where)
{
// no breaks
case 0:
// some code...
case 1:
// some other code...
// ...
}
}
为了模拟goto,可以使用
where = 1;
continue goto;
然而,为了模拟duff的设备,只需要将循环作为外部结构,并在switch语句中使用一个变量,该变量在第一次迭代后被设置为一个值,该值将触发switch语句在其第一种情况下开始。
因此,在您的情况下,这意味着交换switch
和do...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中几乎无处不在
不过,只要它是在一个单一的、连续的上下文中使用的,它就应该起作用。
有关更多信息,请参阅asm.js repo上发布的票证。
JavaScript switch
语句不能这样工作。
switch (expr) {
case expr:
statements;
break;
case expr:
statements;
break;
default:
statements;
break;
}
但JavaScript确实提供了标签来控制你的循环
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++;
}
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;
}
- 如何在JavaScript中将字符串转换为函数引用
- 如何在Javascript中将JSon对象转换为数组
- 使用JS将数组转换为json对象
- 如何使用json将对象列表从java转换为javascript
- 偶尔结结巴巴地说“;堆叠的”;translate()上的转换(v4.0.0-alpha40)
- Porting duff's设备从C语言转换为JavaScript
- 将日期字符串转换为另一种语言
- 是否有一种功能齐全的范式语言可以转换为JavaScript
- 为什么微软开发了一种名为Typescript的新语言,而不是创建C#到Javascript的转换程序
- 将数字转换为印度本地语言格式
- 弱类型语言类型转换的意思在哪里,为什么使用.例如JavaScript
- 根据特定语言的格式将日期转换为长
- 将语言代码转换为(dojo)区域设置代码
- 有没有一种工具可以从一种编程语言转换为另一种编程
- 如何在JavaScript中将语言代码转换为语言名称
- 将简单的javascript程序转换成C语言
- 可以将常规的JavaScript转换为asm.js吗,还是只是为了加速静态类型的低级语言?
- 数字字符转换成另一种语言的数字
- 将对象文字javascript转换为通用语言c#
- Javascript转换'转换为URL语言