问题标签 [duffs-device]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
451 浏览

c - 为 Duff 的设备编写宏

来自 Zed Shaw 的Learn C the Hard Way,在练习 23 中,他谈到了 Duff 的设备。这是达夫的设备供参考:

他要求读者:

“创建一组宏,让您可以像这样创建任何长度的设备。例如,如果您想要拥有 32 个 case 语句并且不想写出所有这些语句怎么办?您可以创建一个包含 8 个的宏吗?一次?”

这真的难倒我,我觉得我只需要朝着正确的方向轻推。任何帮助将不胜感激!

0 投票
1 回答
375 浏览

c - C中的混合'switch'和'while'

我最近阅读了这个关于奇怪的 C 代码段的页面。他们中的大多数是可以理解的。但我无法理解这一点:

谁能帮我弄清楚这段代码背后的逻辑是什么?它是如何工作的?

0 投票
2 回答
80 浏览

c - 达夫设备不工作

我试图实现 Duff 设备,但它不起作用。它不会复制任何东西。我已经实现了原始版本和更清晰的版本:

输出是:

它不会复制任何东西。在原始版本中,由于某种原因它不会增加指向的指针,但我认为我应该增加它(我在我的函数中这样做)。

编辑 据报道,我的代码中有一个错误:我已经更改了它:

但现在输出是:

编辑 2 最后一次编辑使代码工作:

0 投票
2 回答
510 浏览

c - Duff 在 Swift 中的设备

我们知道Duff 的设备利用交错结构的贯穿开关和循环,例如:

现在,在 Swif 2.1 中,switch-case 控制流并没有像我们在 Swift 文档中所读到的那样隐式地失败:

没有隐式失败

与 C 和 Objective-C 中的 switch 语句相比,Swift 中的 switch 语句默认情况下不会落入每个案例的底部并进入下一个案例。相反,整个 switch 语句在第一个匹配的 switch case 完成后立即完成执行,而不需要显式的 break 语句。这使得 switch 语句比在 C 中更安全、更容易使用,并且避免了错误地执行多个 switch case。

现在,鉴于在 Swift 中有一个 fallthrough 子句具有明确的 fallthrough 副作用:

穿越

Swift 中的 Switch 语句不会从每个案例的底部落入下一个案例。相反,一旦第一个匹配的 case 完成,整个 switch 语句就完成了它的执行。相比之下,C 要求您在每个 switch 案例的末尾插入显式 break 语句以防止失败。避免默认失败意味着 Swift switch 语句比 C 中的对应语句更简洁和可预测,因此它们避免了错误地执行多个 switch 案例。

这很像:

考虑到 Wikipedia 提醒我们,这些设备来自问题

哪个是Swift 中 Duff 设备的确切实现?

这只是一个语言和编码问题,并不打算应用于真正的 Swift 应用程序。

0 投票
1 回答
36 浏览

switch-statement - switch 语句令人困惑

我知道这之前已经讨论过了,我已经阅读了我能找到的关于 switch 的所有问题和答案。我的问题不是关于 Duff 设备的语法或功能,而是关于 switch,这恰好很好地说明了这个问题。

我理解这样做,n 的值随着每次迭代而递减。我也明白宽松的编译器规则允许其他情况跳入 do 循环(很奇怪,但我理解)

但是由于 switch 语句是 (count % 8) 的函数,并且没有任何变化或作用于 count 的值,为什么 count 首先会发生变化以在 switch 内产生不同的模余数?

假设 (count % 8) 在第一遍产生 7。处理完案例 7:count 的值保持不变,因此 (count % 8) 的值应该保持不变,因此案例 6:不应该为真,任何其他情况也不应该是没有默认值的 n 应该递减,并且do 循环的下一次迭代应该以 count 的值不变开始。所以看起来循环会结束到 0,count 永远不会改变,所以它只会执行 case 7,每次通过都使所有其他代码毫无意义。

但如果这是真的,那么 Duff 的设备将无法工作,因为它显然依赖于 int(n + 7)/8 来为每个 count 值产生 8 次重复 n 值,并且与 (count % 8) 配对意味着 count 确实是递减以产生一个在 7 和 0 之间递减的模余数循环。

从我的新手的角度来看,这似乎需要一个 --count 在那个循环中的某个地方。所以我的结论是我不明白 switch 是如何工作的。我会很感激任何解释。

0 投票
2 回答
1003 浏览

javascript - 将 duff 的设备从 C 移植到 JavaScript

我在 C 语言中有这种 Duff 的设备,它工作正常(将文本格式化为钱):

输出:

但是我在尝试在 Javascript 中实现相同的功能时遇到了问题:

nodejs 返回此错误:

我的问题是:javascript 是否支持计算的 GOTO 语句?

PD:我不想要替代方案,我只想知道为什么不起作用。

相关问题:Duff 的设备是否支持其他语言?

0 投票
0 回答
71 浏览

c++ - if/else 与 switch/case 交互如何工作?

在关于 switch 和 goto 的问题中,此答案使用此代码来完全避免使用 goto:

这段代码是如何工作的?我知道案例会自动失败,所以我不需要解释 when coloris YELLOW,但是 when colorisGREEN呢?C++else从未遇到if. 这段代码甚至会编译吗,它会是运行时错误,还是会忽略else?

0 投票
1 回答
1112 浏览

gcc - 达夫的设备还有用吗?

我看到 Duff 的设备只是在 C 中进行循环展开。

https://en.wikipedia.org/wiki/Duff%27s_device

我不知道为什么它现在仍然有用。编译器不应该足够聪明来进行循环展开吗?

0 投票
1 回答
170 浏览

c++ - 跳入 if(false) 块有什么问题吗?

我已经读过几次(例如,这里的Compiler: What if condition is always true / false)任何体面的 c++ 编译器都会选择退出类似

但是如果有人故意跳进这个if(false)区块怎么办。我有这样的想法

是否有任何像样的 c++ 编译器会尊重这种跳转,或者最终会出现一些选择退出的问题?

0 投票
3 回答
127 浏览

c++ - 如何在switch语句中使用while在c中工作

我有一个代码片段,其中 do while 语句位于 case0 的 switch 条件内,默认情况下,case 值为 case1,但它似乎正在执行 case0。程序打印的输出是6。这怎么可能,谁能解释一下这里的代码流程。提前感谢您的回答。