pátek 29. března 2013

Infinite Loop

Programuji si takhle pro .NET encodér pro kódování Kamenických a procházím pomocí For() nějakou Dictionary.

A ono se to chová nějak divně...

Zdrojový kód

Napřed poněkud osekaný zdrojový kód, ať si můžete zapřemýšlet a nematou vás opičinky stran toho encodingu.

using System;

namespace InfiniteLoop
{
    class Program
    {
        static void Main()
        {
            for (byte i = 0; i <= 255; i++)
                Console.WriteLine(i);
        }
    }
}


Otázky pro vás

  1. Co bude zobrazeno na konzoli?
  2. Proč?
  3. Proč o tom píši?

Odpověď 1

Budou zobrazována postupně čísla 0 až 255. A to až do konce světa, počítače nebo vaší trpělivosti. Podle toho, co přijde dřív.


Odpověď 2

Zakopaný pes je v třetím kroku vykonávání instrukcí:
  1. ověření (podmínka i<=255)
  2. příkaz/y uvnitř cyklu (výpis na konzoli)
  3. inkrementace iterátoru (i++)
Už ho vidíte? V kroku 3 je hodnota i (255) zvýšena o 1, tím dojde k přetečení iterátoru i (je to byte), který tak obsahuje zase 0. A následuje opět ověření v kroku 1, které je vyhodnoceno jako pravdivé (0<=255) a program tak může vesele jet dál...

Odpověď 3

Protože je milé být, i po tolika letech praxe, překvapen takovou rafinovanou chybičkou. A proč se o tu radost nepodělit, že...

Poučení

Pokud počítáme v oboru 8 bitových bytů (oktetů), tak platí:

255 + 1 = 0
Což dožere u bankovních operací, spoříme, spoříme a nic z toho. Ještě že funguje i podtečení:

0 - 1 = 255
A pak že na světě není krásně ;-)

Další informace

Bajt (wikipedia)
Kód Kamenických (wikipedia)

Žádné komentáře:

Okomentovat