8は無限大になるはずです[終了]


19

通常8つの反復を実行する典型的なループを見てみましょう。

for (int x=0; x<8; ++x);

あなたはそれを無限にしなければなりません!


このような形式のループをサポートするすべての言語のですfor。したがって、最高得点(マイナスからマイナス)のソリューションが勝ちます。

あなたの言語が他の形式のforループを持っているが、あなたが確信しているなら、あなたはそれで何かクールなものを作ることができます。私は利用可能な構造と言語の範囲を拡大する権利を留保しますが、縮小されることはありませんので、以前は正しいソリューションを落とすことを恐れないでください。


ソリューションとは何ですか?

ソリューションは2つのプログラムで構成されます。

最初のプログラムはクリーンプログラムです。これは、forループが8回繰り返される、お使いの言語の典型的なプログラムです。それは通常のプログラムでなければならず、開発者なら誰でも書くことができます。準備のための特別なハッキングはありません。例えば:

int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

2番目のプログラムが拡張されます。このプログラムには、クリーンなプログラムからのすべてのコードといくつかの追加コードが含まれている必要があります。拡張ポイントの数には限りがあります。詳細については完全なルールセクションをご覧ください。上記のクリーンなプログラムの拡張プログラムは

inline bool operator < (const int &a, const int &b)
{
  return true;
}

int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

これは、アイデアを示すための単なる例です(C ++ではコンパイルできません)。実際の正しい拡張プログラムは、コンパイル可能で、動作し、無限ループである必要があります。

完全なルール

両方のプログラム:

  • そのようなforループをサポートする言語はすべて大丈夫です。
  • ループ本体は空でなければなりません。より正確には、出力または他のコードをループに配置できますが、ループが空の場合のループの動作は同じである必要があります。

クリーンプログラム:

  • ループは整数または数値カウンターを使用して、8回の反復を実行します。

    for (int          x=0; x<8; ++x);   // C, C++, C#
    for (var          x=0; x<8; ++x);   // C#, Javascript
    for (auto         x=0; x<8; ++x);   // C, C++
    for (auto signed  x=0; x<8; ++x);   // C, C++
    for (register int x=0; x<8; ++x);   // C, C++
    
  • ユーザー定義型は許可されていません。

  • ループ変数の代わりにプロパティ(グローバル変数を除く)を使用することは許可されていません。
  • 変数の宣言は、ループの内側でも外側でもかまいません。次のコードは大丈夫です:

    int x;
    for(x=0; x<8; ++x);
    
  • プレフィックスインクリメントまたはポストフィックスインクリメントのいずれかを使用できます。

  • ループ制限8は、名前付き定数または変数に保存せずに、定数リテラルとして記述する必要があります。8に等しい変数または定数を宣言し、それを他の値で再割り当て、オーバーライド、またはシャドウイングすることに基づいたソリューションを防止するために作成されました。

    const double n = 8;
    
    int main()
    {
      const double n = 9007199254740992;
      for (double x=0; x<n; ++x);
      return 0;
    }
    

拡張プログラム:

  • クリーンなコードのすべてのコードを含める必要があります。
  • 限られた数の拡張ポイントでクリーンプログラムを拡張する必要があります。
  • 無限ループ自体と同じ forループを実行する必要があります。
    ループを別の無限構造に配置することはできません。
  • コードのテキスト表現が変更されていない限り、実行時またはコンパイル時にコードのパッチを適用できます。
  • 文字列に構造を配置して渡すことevalは許可されていません。

拡張ポイント:

  • 他のファイルまたは他のアセンブリを含む、クリーンなコードを含むフラグメントの外の場所。
  • forステートメント(単一のピースとして- for構造とその本体)は変更しないでください。
  • 変数宣言は同じに保つ必要があります。
  • 単純なステートメント間の任意の場所を拡張ポイントとして使用できます。
  • 変数がループ外で宣言され、値の即時割り当てが行われていない場合にのみ、そのような割り当てを追加できます。
/* extension point here */
int main()
/* extension point here */
{
  /* extension point here */
  int x /* extension point for assignment here */;
  /* extension point here */
  for (x=0; x<8; ++x);
  /* extension point here */
  return 0;
  /* extension point here */
}
/* extension point here */
int main() 
{
  /* BEGIN: No changes allowed */ int x = 0; /* END */
  /* extension point here */
  /* BEGIN: No changes allowed */ for (x=0; x<8; ++x); /* END */
  return 0;
}

PS:可能であれば、オンラインIDEへのリンクを提供してください。


2
@Oliver、私が知っているように、「最高のスコア(upvotesマイナスdownvotes)」のために、正確にデフォルトされた人気コンテストは、少なくとも、それはタグの記述で書かれている:「人気コンテストが最高得票の集計と答え競争であります(賛成マイナス反対)が勝ちます。」しかし、明示的に質問に追加できます。
Qwertiy

1
@Maltysen、これらの構造を持つ言語には多くの興味深い解決策があります。CとC ++(まったく異なるソリューションを使用)、C#、Java、Javascript、php、Perl、Groovyがあります。もっとたくさんあると思います。とにかく、私は質問を拡大するために開いており、それはルールで指定されています。他の言語で何か面白いものを作成できる場合は、投稿してください。肯定的な反応がある場合、ルールを拡大できます。
Qwertiy

4
これを人気コンテストとして行うのは、投票時に投票者がどの基準を選択すべきか(勝利条件を主観的にする)の説明がないため、少し厄介です。私はここで多くの人々がゴルフの解決策を面白いと思っているので、コードゴルフの解決策に取り組んでいました。それは挑戦のための実行可能な勝利条件であるように思われます。

2
1.「整数または数値カウンター」は少し曖昧です。たとえば、含まれていますjava.lang.Integerか?2.これは、適切な勝利基準があればより良いでしょう。
ピーターテイラー

1
1.はい、できます。2.勝利の基準は何ですか?PS:meta続けることができます。
Qwertiy

回答:


33

Python3

クリーンプログラム:

これは単なる標準的なカウントダウンwhileループです。

n = 8
while n != 0:
  n -= 1
print("done")

拡張プログラム:

import ctypes

ctypes.cast(id(8), ctypes.POINTER(ctypes.c_int))[6] = 9

n = 8
while n != 0:
  n -= 1
print("done")

これは、再定義するint型のキャッシュ使用する89効果的に行うものではありませんそのn -= 1ため、無操作、9-1 = 8ちょうど設定するnバックに9無限ループを引き起こし、再びを。

ここではオンライン intキャッシュを見ることができます (ただし、明らかに無限ループがないためオンラインです)。


onlinde IDEへのリンクをお願いします。ideone.com/aI3ZrI-動作していないようです。
Qwertiy

@Qwertiy、それをrepl.itで実行しようとしましたが、フリーズするだけです。これは無限ループになるため予想されることです。私はそこにintキャッシュのものが機能することを知っています、なぜならそこに設定8する方法を試したところです9
Maltysen

本当にそこで動作します。奇妙なことに、イデオンのような時間制限がありません(5秒)。彼らは示すPython 3.5.2 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux
-Qwertiy

ループのない@Qwertiyリンク:repl.it/E4fx/0
Maltysen

それは...面白い
Qwertiy

22

Python 3

クリーンプログラム:

Pythonで何かを8回行う標準的な方法は次のとおりです:

for i in range(8): 
    # Do something
    pass

拡張プログラム:

ただし、範囲ジェネレーター関数をオーバーライドして無限に1を生成すると、無限ループになります...

def range(x):
    while 1: yield 1

for i in range(8):
    # Infinite loop
    pass

これをさらに進めて、無限に1を生成するのではなく、永久にカウントアップするジェネレーター関数を作成できます。

def range(x):
    i = 0
    while 1: yield i; i+=1

for i in range(8):
    # Counting from 0 to infinity
    pass

repl.itでテストする


2
隠す巨大なモジュールの真ん中に...その
ベンジャミン

21

Perl

クリーン

for($i=0; $i<8; $i++) { }

拡張

*i=*|;
for($i=0; $i<8; $i++) { }

イデオネ


16
ああ、それは本当に賢い。Perlを知らない人のために:これは$i、ブール値のみを保持できる特別な変数のエイリアスになるためのエイリアスです。したがって、1に達するとインクリメントされなくなります。

10

ES5 +(Javascript)

編集:明示的な変数宣言を削除しました。それ以外の場合はホイストされ、設定不可能window.xプロパティが作成されました(REPLコンソールで1行実行しない限り)。

説明:

グローバルスコープの変数はウィンドウのプロパティでもあるという事実を利用します。オブジェクトの「window.x」プロパティを1の定数値を持つように再定義します。

クリーン

for(x=0; x<8; x+=1) console.log(x);

拡張

Object.defineProperty(window,'x',{value:1});
for(x=0; x<8; x+=1) console.log(x);

:Node.jsでこれを機能させるには、「window」「global」に置き換えます(Node.js 6.8.0でテスト済み)


1
ちなみに、それはES5ですよね?
Qwertiy

またvar、クロームでは動作しません。しかしvar、両方のプログラムから削除することができます-それは大丈夫です。
Qwertiy

@QwertiyこれはChrome for meの「var」で動作します(Linux /バージョン52.0.2743.82(64ビット))
zeppelin

>ところで、それはES5ですよね?確かに、今タイトルを修正します
zeppelin

1
問題はvarホイストであるため、それを使用definePropertyする時点ですでに最も優れています。ただし、これら2行を異なるスクリプトに配置すると(許可されます)、プロパティが最初に作成varされてから無視されるため、機能します。証明:i.stack.imgur.com/lSwbE.png
Qwertiy

10

C

クリーンプログラム

int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

拡張プログラム

#define for(ever) while(1)

int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

Must execute same for loop as an infinite loop itself. Placing of the loop into another infinite construction is not ok.
カールナップ16年

3
@KarlNapf「for」ループは、別の無限構造の中にありません。
コアダンプ

3
@KarlNapfこの答えはルールによって明示的に許可されていると思いました
オマー

「同じループを実行する必要があります」という文言ですが、はい、これはテキスト表現と矛盾します。
カールナップ16年

7

Java

クリーンプログラム:

public class Main {
    public static void main(String[] args) throws Exception {
        for (Integer i = 0; i < 8; i++);
    }
}

拡張プログラム:

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws Exception {
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field c = cache.getDeclaredField("cache");
        c.setAccessible(true);
        Integer[] intcache = (Integer[]) c.get(cache);
        intcache[129] = intcache[128];

        for (Integer i = 0; i < 8; i++);
    }
}

1を含むべき整数キャッシュの整数を0 i++に設定iし、事実上何もしません(1を含むキャッシュされた整数に設定しますが、その整数は実際には0を含むため、何も変更されません)。


私にそれを打つ、このソリューションは私自身のものと同一です。
ヒピノ

6
これは実際にはイディオムのJava forループではありません。おそらくint比較的重いのではなく、ボックス化されていないものを使用しIntegerます。


6

Python 3(3.5.0)

クリーンプログラム:

for i in range(8):
    print(i)

拡張

import sys

from ctypes import *

code = sys._getframe().f_code.co_code

cast(sys._getframe().f_code.co_code, POINTER(c_char*len(code))).contents[len(code)-4] = 113
cast(sys._getframe().f_code.co_code, POINTER(c_char*len(code))).contents[len(code)-3] = 160

for i in range(8):
    print(i)

このソリューションは、Pythonで記述された他のソリューションとは異なり、実際にその場でソースコードを変更します。forループ内のすべてのものは、必要なコードに変更できます。

コードは、最後から2番目のオペコードを113より読みやすいように変更しますJUMP_ABSOLUTE。オペランドを160-ループが始まる命令に変更し、実際にはプログラムの最後にGOTOステートメントを作成します。

拡張プログラムは、0..7スタックオーバーフローなどを発生させることなく、数を無限に印刷します。


6

PHP

これは拡張ポイントのルールに従っていると思います。ポイント4については完全に明確ではありません。@ primoのperlの回答と非常に似ているため、重要だと思います。

クリーン

for(;$i<8;$i++);

拡張

$i='a';
for(;$i<8;$i++);

PHPでは、次のように特定の文字列をインクリメントできます。

'a' -> 'b'
'b' -> 'c'
'z' -> 'aa'
'aa' -> 'ab'
'aab' -> 'aac'
etc

これらの文字列はすべて0と評価されるため、これは実質的に永久にループします(何らかの理由でメモリ不足になることはありません)。


それが競争の精神であり、非常に興味深い。実際には、最初のassignmnetの省略については何も言われていないので、それはいくつかのエッジケースです。実際には、0の割り当てと反復の間に拡張ポイントがないことが予想されていました。しかし、これに基づいていくつかの興味深いエッジケースの方法を見ているので、今それを禁止するつもりはなく、使いすぎるのは簡単ではありません。
Qwertiy

2
@Qwertiy「だからそれはいくつかのエッジケースだ」PHPの
概要

6

Perl

きれいなコード

for ($x = 0; $x < 8; $x++) {}

拡張コード

sub TIESCALAR {bless []}
sub FETCH {}
sub STORE {}
tie $x, "";

for ($x = 0; $x < 8; $x++) {}

ほとんどのPerl変数は単なる変数です。ただし、この言語にはtie機能があり、変数getterおよびsetterを効果的に指定できます。このプログラムでは、メインパッケージ(名前がnull文字列)をオブジェクト指向言語のクラスに相当するものにしますが、プログラムでもあります。これにより、forループカウンタをプログラム自体に結び付けることができます。実装がTIESCALAR可能に影響を与えませんし、それを読むための試みは、常に返す数値的に8以上です。tieことで成功。の戻り値はTIESCALAR、変数に関連付けて保持する必要がある内部状態への参照を意味しますが、必要がないため、プレースホルダーとして空の配列参照を返します。次に、ゲッターとセッターの可能な限り単純な実装を提供します。どちらも何もしないので、割り当てを試みます$xundef


5

WinDbg

クリーン

.for (r$t0 = 0; @$t0 < 8; r$t0 = @$t0 + 1) { }

拡張

aS < |;                                            * Create alias of < as |
.block {                                           * Explicit block so aliases are expanded
    .for (r$t0 = 0; @$t0 < 8; r$t0 = @$t0 + 1) { } * Condition is now @$t0 | 8, always true
}

このアプローチは<asのエイリアスを作成する|ため<、コード内でが検出される|と、エイリアスは展開され、ビット単位のORがより小さいのではなく行われます。WinDbgでは、ゼロ以外の値はすべてanything | 8真であるため、常に真です。

注:.block実際には場合に必要とされていないaSとは.for、ここで示したように、実際に二つの異なる行として入力された場合、それが唯一の必須ですaSし、.for同じライン上にあります。



5

Common Lisp

きれいなコード

(dotimes(i 8))

拡張

(shadowing-import(defmacro :dotimes(&rest args)'(loop)))
(dotimes(i 8))

keyword:dotimes、という名前のマクロ:dotimes11.1.2.3 KEYWORDパッケージを参照)が定義され、無限ループとして展開されます。defmacroに供給することができるマクロ名が定義されているマクロ戻りますshadowing-import。したがって、この新しいdotimesシンボルは標準のシンボルを隠します(再定義したり、移植可能なプログラムで別のマクロに字句的にバインドしたりすることはできません)。

拡張(2)

(set-macro-character #\8 (lambda (&rest args) '(loop)))
(dotimes(i 8))

文字8を読み取ると、それをに置き換え(loop)ます。つまり、上記のように読み取る(dotimes (i (loop)))ため、コードは上限の計算を終了しません。これは、ループ内の1つだけでなく、8のすべての発生に影響します。 言い換えれば、8は本当に無限を意味します。 好奇心が強い場合、readtableが上記のように変更されると、文字8が「終了」し、現在読み取られている他の数字/記号から自分自身を切り離します。

(list 6789)

...と読みます:

(list 67 (loop) 9)

あなたはIdeone上でテストを実行することができます:https://ideone.com/sR3AiUを


4

ルビー

クリーン

この種のforループはRubyではあまり使用されませんが、典型的なチュートリアルでは、これがその方法であることがわかります。

for x in 1..8
  # Some code here
end

拡張

forループ(1..8).eachは、指定されたコードブロックで呼び出すだけなので、そのメソッドを変更します。

class Range
  def each
    i = first
    loop { yield i; i+= 1 }
  end
end

for x in 1..8
  # Some code here
end

4

ハスケル

クリーンバージョン:

import Control.Monad (forM_)

main = forM_ [0..8] $ \i -> print i

拡張バージョン:

import Control.Monad (forM_)

data T = C

instance Num T where
    fromInteger _ = C

instance Enum T where
    enumFromTo _ _ = repeat C

instance Show T where
    show _ = "0"

default (T)

main = forM_ [0..8] $ \i -> print i

それは本当に、非常に基本的です:私たちは私たち自身のタイプを定義TそのようなenumFromToインスタンスが無限列で、その後、値を非タイプは、注釈付きそうこと不履行タイプを使用0し、8タイプとして採用されているがT


1
Haskellのオーバーロードされた数値リテラルのデフォルトタイプを変更することをお勧めします。
nimi

3

///

for///には明示的なループはありませんが、シミュレートできます(結局、チューリングは完了です)。

クリーン:

/1/0/
/2/1/
/3/2/
/4/3/
/5/4/
/6/5/
/7/6/
/8/7/
8

拡張:

/0/0/
/1/0/
/2/1/
/3/2/
/4/3/
/5/4/
/6/5/
/7/6/
/8/7/
8

どうしたの?

旧プログラムが8から0までカウントダウンしながら、後者の/0/0/ルールが置き換えられます0によって0永遠まで。


そして/0/1//1/2/.../7/8//8/8/8、代わりにカウントアップするようなことを実際に行うと思いました。
エリックアウトゴルファー16

3

Javascript ES6

OK、ES6 for ... ofループ構造を使用して動作するバージョンがあります。面白いビジネスがないことを確認するために、きれいな配列を提供します。

クリーン

for(a of [0,1,2,3,4,5,6,7]);

もちろん、だれかがArrayプロトタイプをいじるのを止めません...

拡張

Array.prototype[Symbol.iterator]=function(){return {next: function(){return {done: false}}}}
for(a of [0,1,2,3,4,5,6,7]);

これは、デフォルトのイテレータを上書きして終了しないようにすることで機能し、すべてを無限ループにロックします。コードには、ループ内で実行する機会すらありません。


「空のループの場合、ループの動作は同じである必要があります」
-Qwertiy

くそ、それを逃した-私は何かを把握する必要があります。
マーカスディル

私の知る限り、JavascriptでCスタイルのforループを使用して挑戦することは、ルールを破らない限り、その中に何か(私の解決策のように)あるか、ループを事前にマッサージすることによっては不可能です。クリーンコードでの宣言(Cedric Reichenbachの場合など)。
マーカスディル

実際にはいくつかの方法があります。グローバル変数を使用した方法はすでに投稿さvarれていますが、ループ内で許可するものがいくつかあります。
-Qwertiy

私が言ったように、私が知る限り。私はそのコメントをした後、グローバル変数の方法を見て、自分を蹴りました。
マーカスディル

2

C ++

2つの拡張ポイントを使用します。

struct True {
  True(int x){}
  bool operator<(const int&){
    return true;
  }
  void operator++(){}
};


int main() 
{
#define int True
  for (int x=0; x<8; ++x);
  return 0;
}

クリーンなプログラムは説明と同じです。


いいですが、「最適化」できます:) C ++には、別の答えを出すための興味深い組み込み関数がいくつかあります。
Qwertiy

2

ブレインファック

反復のカウントを簡単にするために、反復ごとに「0」を出力します。ただし、ループの動作を変更することなく、任意のコードをそこに挿入できます。

クリーン

>> ++++++ [-<++++++++>] <<                   b = '0' (value to be printed each iteration)

>> ++++++++ [-<< ++++++++ ++++++++ >>] <<    for (a = a plus 128;
[                                              a;
++++++++ ++++++++                              a = a plus 16 (mod 256)) {
>.<                                              loop body (print b)
]                                            }

オンラインで試す

拡張バージョンは、8ビットセルを使用する一般的なBrainfuck実装に依存しています。これらの実装では、「増分」は実際には「増分(mod 256)」です。したがって、クリーンバージョンで正確に8回、拡張バージョンで無限に反復するループを見つけるには、次の不等式の解決策を簡単に見つけることができます。

  • a + b * 8(mod 256)== 0(クリーンバージョンの場合)
  • c + a + b * n(mod 256)> 0すべてのn(拡張バージョンの場合)
  • a> 0

この場合、a = 128、b = 16、およびc = 1とします。明らかに128 + 16 * 8 = 256(および256(mod 256)= 0)および128> 0であり、bが偶数なので、c + a + b * nは、任意の奇数a + cに対して奇数であるため、このような場合、256の偶数倍になることはありません。簡単にするために、c = 1を選択します。したがって、必要な変更は1つだけです+は、プログラムの最初にです。

拡張

+                                            increment a (only change)
>> ++++++ [-<++++++++>] <<                   b = '0' (value to be printed each iteration)

>> ++++++++ [-<< ++++++++ ++++++++ >>] <<    for (a = a plus 128;
[                                              a;
++++++++ ++++++++                              a = a plus 16 (mod 256)) {
>.<                                              loop body (print b)
]                                            }

オンラインで試す

このエントリが競合しているかどうかを判断するためにOPに任せます。Brainfuckには明示的なforループはありませんが、私が使用したループ形式は、あなたが得る可能性のある限り近いものです。 ++++++++また、8取得できる限りリテラルに近い。それらの多くを含めました。

最も短い既知のBrainfuck Hello Worldでさえ、モジュール式の再帰関係に依存しているため、クリーンバージョンはこの言語で書かれた典型的なプログラムをほぼ確実に構成します。


2

ハスケル

クリーン

import Control.Monad (forM_)

main = forM_ [0..8] $ \i -> print i

拡張

import Control.Monad (forM_)

import Prelude hiding (($))
import Control.Monad (when)

f $ x = f (\i -> x i >> when (i == 8) (f $ x))

main = forM_ [0..8] $ \i -> print i

通常の関数適用演算子$を、ループが終了するたびにループを繰り返す演算子に置き換えます。クリーンバージョンを実行すると、0〜8が出力されて停止します。拡張バージョンは0〜8を出力し、次に0〜8を出力します。

forM_ [0..8] $ \i -> print iHaskellでそのループを記述するための「最もクリーンな」方法であるとは限らないため、少しごまかします。多くのHaskellerは、取得するループボディをeta-reduceし、オーバーライドする必要forM_ [0..8] printはありません$。私の防御では、そのプロパティを必要としないCactusの答えからきれいなコードをコピーしたので、少なくとも1人のHaskellプログラマーが実際にそのコードを書いたの$です。


1

C ++

int main() 
{
  int y;
#define int
#define x (y=7)
  for (int x=0; x<8; ++x);
  return 0;
}

ことができますx、それはassignementと増分で左辺値を必要とするので、Cには動作しません7に評価されます。


1

ニム

慣用的なバージョン、使用 countup

クリーン

for i in countup(1, 8):
  # counting from 1 to 8, inclusive
  discard

拡張

iterator countup(a: int, b: int): int =
  while true:
    yield 8

for i in countup(1, 8):
  # counting 8s forever
  discard

シンプルで、再定義するPythonの回答rangeに非常に似てます。再定義しますcountup1つのint(包括的)から別のintに反復する慣用的なNimの方法、8を無限に与えます。

範囲演算子を使用したより興味深いバージョン ..

クリーン

for i in 1..8:
  # counting from 1 to 8, inclusive
  discard

拡張

iterator `..`(a: int, b: int): int =
  while true:
    yield 8

for i in 1..8:
  # counting 8s forever
  discard

前のソリューションと非常に似て..いますが、範囲演算子を再定義します。これは通常[1, 2, 3, 4, 5, 6, 7, 8]、前からイテレータに配列を与えます。


1

GolfScript

クリーン

0{.8<}{)}while;

拡張

{.)}:8;
0{.8<}{)}while;

n + 1を返す関数を変数8に割り当てます


1

tcl

通常:

for {set i 0} {$i<8} {incr i} {}

拡張:

proc incr x {}
for {set i 0} {$i<8} {incr i} {}

考え方はincr、変数をインクリメントするために使用されるコマンドを再定義して、i実際にインクリメントしないようにすることです!

でテストできます:http : //rextester.com/live/QSKZPQ49822


1

x86_64アセンブリ

クリーンプログラム:

mov rcx, 8
loop_start:
sub rcx, 1
cmp rcx,0
jne loop_start
mov rax, 0x01
mov rdi, 0
syscall

アセンブリープログラマーが使用するループの種類。 jmp loop_start。その後に命令を。

拡張プログラム:

global start
section .text
start:
mov rcx, -1
jmp loop_start
mov rcx, 8
loop_start:
sub rcx, 1
cmp rcx,0
jne loop_start
mov rax, 0x01
mov rdi, 0
syscall

また、クリーンなプログラムにエントリポイントまたは section .text


整数オーバーフロー後に停止しませんか?
Qwertiy

1
ああ、多分... しかし、それは長い時間がかかりますか?I種類のものは、ほとんどの高級言語プログラマであること、起こりうることを忘れてしまった
goose121


0

C ++

クリーンプログラム

0から7までの数字を繰り返す、正常なループ。

#include <iostream>

int main() {

  for (short i = 0; i < 8; i++) {
    // Print `i` with a newline.
    std::cout << i << std::endl;
  }    

}

拡張プログラム

C ++のプリプロセッサは非常に危険な機能です...

#include <iostream>
#define short bool

int main() {

  for (short i = 0; i < 8; i++) {
    // Print `i` with a newline.
    std::cout << i << std::endl;
  }    

}

追加しなければならない唯一の行はでした#define short bool。これによりi、短整数ではなくブール値が作成されるため、増分演算子(i++)はi1 に達した後は何もしません。出力は次のようになります。

0
1
1
1
1
1
...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.