問題タブ [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.
c - ダフのデバイス用のマクロを書く
Zed Shaw のLearn C the Hard Wayから、演習 23 で、彼は Duff のデバイスについて話します。参考までに、ダフのデバイスは次のとおりです。
彼は読者に次のように求めます。
「このような任意の長さのデバイスを作成できる一連のマクロを作成します。たとえば、32 個の case ステートメントが必要で、すべてを書き出したくない場合はどうすればよいでしょうか?時間?"
これは本当に私を困惑させ、私は正しい方向に微調整する必要があると感じています. どんな助けでも大歓迎です!
c - ダフデバイスが機能しない
Duff デバイスを実装しようとしましたが、うまくいきません。何もコピーしません。元のバージョンとより明確なバージョンを実装しました。
出力は次のとおりです。
何もコピーしません。元のバージョンでは、何らかの理由でポインターをインクリメントしませんが、インクリメントする必要があると思います(関数で行います)。
EDIT 報告されたように、私のコードにエラーがあります:私はそれを変更しました:
しかし、今の出力は次のとおりです。
EDIT 2 コードを機能させるための最後の編集:
c - Duff の Swift デバイス
ダフのデバイスは、次のようなフォールスルー スイッチとループの構造を組み合わせて使用することがわかっています。
現在、Swif 2.1 では、Swift のドキュメントで読んでいるように、 switch-case 制御フローに暗黙的にフォールスルーはありません。
暗黙的なフォールスルーなし
C および Objective-C の switch ステートメントとは対照的に、Swift の switch ステートメントは、デフォルトでは、各ケースの最下部から次のケースに移行しません。代わりに、明示的な break ステートメントを必要とせずに、最初に一致する switch ケースが完了するとすぐに、switch ステートメント全体が実行を終了します。これにより、switch ステートメントが C よりも安全で使いやすくなり、誤って複数の switch ケースを実行することを回避できます。
ここで、Swift でフォールスルーの副作用を明示的に持つフォールスルー句があるとします。
フォールスルー
Swift の switch ステートメントは、各ケースの最下部から次のケースに移行しません。代わりに、最初に一致するケースが完了するとすぐに、switch ステートメント全体が実行を完了します。対照的に、C では、フォールスルーを防ぐために、すべての switch ケースの最後に明示的な break ステートメントを挿入する必要があります。デフォルトのフォールスルーを回避することは、Swift の switch ステートメントが C の対応するステートメントよりもはるかに簡潔で予測可能であることを意味し、したがって複数の switch ケースを誤って実行することを回避します。
それはかなり似ています:
ウィキペディアが私たちに思い出させるように、デバイスは問題から出てくることを考慮して
Swift でのダフのデバイスの正確な実装はどれですか?
これは単なる言語とコーディングの問題であり、実際の Swift アプリケーションに適用することを意図したものではありません。
switch-statement - switch ステートメントの当惑
これは以前にハッシュ化されたことを知っています。スイッチに関するすべての質問と回答を読んだことがあります。私の質問は、ダフのデバイスの構文や機能に関するものではありませんが、一般的なスイッチについては、たまたま質問をよく説明しています。
n の値は反復ごとに減少します。また、緩やかなコンパイラ規則により、他のケースが do ループ内でジャンプできることも理解しています (奇妙ですが、理解しています)。
しかし、switch ステートメントは (count % 8) の関数であり、count の値に対して何も変更または作用していないため、最初に count が変更されてスイッチ内で異なるモジュロ剰余が生成されるのはなぜですか?
(count % 8) が最初のパスで 7 を生成すると仮定します。ケース 7 を処理した後: count の値は同じままであるため、(count % 8) の値は同じままである必要があるため、ケース 6: は true であってはならず、他のケースではなく、デフォルト n がなければデクリメントされるべきではありません。 do ループの次の繰り返しは、count の値を変更せずに開始する必要があります。そのため、ループは 0 まで終了し、count は決して変わらないように見えるため、すべてのパスでケース 7 のみが実行され、他のすべてのコードが無意味になります。
しかし、それが本当なら、ダフのデバイスは機能しません。なぜなら、count の値ごとに n の値の 8 回の繰り返しを生成するために明らかに int(n + 7)/8 に依存しており、(count % 8) と組み合わせると、count が実際にあることを意味するからです。デクリメントして、モジュロ剰余を 7 から 0 の間で減少させるループを生成します。
私の初心者の観点からは、これが機能するには、そのループのどこかに --count が必要なようです。したがって、私の結論は、スイッチの仕組みを理解していないということです。説明をいただければ幸いです。
c++ - if(false) ブロックへのジャンプに問題はありますか?
私はすでに数回読んだことがあります(たとえば、ここCompiler: What if condition is always true / false)まともなc ++コンパイラは次のようなものをオプトアウトします
if(false)
しかし、このブロックに意図的にジャンプした場合はどうなるでしょうか。このようなことを念頭に置いています
適切な C++ コンパイラはジャンプを尊重するのでしょうか、それとも最終的にはオプトアウトで問題が発生するのでしょうか?
c++ - c で switch ステートメント内で動作する方法
do while ステートメントが case0 の switch 条件内にあるコード スニペットがあります。デフォルトでは、case 値は case1 ですが、case0 を実行しているようです。プログラムprintの出力は6です。これはどのように可能ですか、誰かがここでコードの流れを説明できますか。ご回答ありがとうございます。