A " mágikus szám " fogalmának a programozásban három jelentése van:
A mágikus szám vagy aláírás egy egész szám vagy szövegállandó , amelyet egy erőforrás vagy adat egyedi azonosítására használnak . Egy ilyen szám önmagában nem hordoz semmilyen jelentést, és zavart okozhat, ha a megfelelő kontextus vagy megjegyzés nélkül fordul elő a programkódban , míg egy másik, akár közeli értékűre történő megváltoztatási kísérlet abszolút beláthatatlan következményekkel járhat. Emiatt az ilyen számokat ironikusan mágikus számoknak nevezik . Jelenleg ez a név szilárdan beépült kifejezés . Például bármely lefordított Java nyelvosztály hexadecimális "varázsszámmal" kezdődik . A második jól ismert példa, hogy bármely .exe kiterjesztésű Microsoft Windows futtatható fájl egy bájtsorozattal kezdődik (amely megfelel az MZ ASCII karaktereknek - Mark Zbikowski kezdőbetűinek , az MS-DOS egyik alkotójának ). Egy kevésbé ismert példa a Microsoft Visual C++ (a Microsoft Visual Studio 2005-ös verziója óta) inicializálatlan mutatója, amely hibakeresési módban a . 0xCAFEBABE0x4D5A0xDEADBEEF
UNIX-szerű operációs rendszereken a fájl típusát általában a fájl aláírása határozza meg, függetlenül a névkiterjesztéstől. Szabványos segédprogramot biztosítanak a fájl aláírásának értelmezéséhez file.
Ezenkívül a „varázsszámok” rossz programozási gyakorlat, ha a forrásszövegben numerikus érték szerepel, és annak jelentése nem nyilvánvaló. Például egy ilyen, Java nyelven írt részlet rossz lenne:
drawSprite ( 53 , 320 , 240 );Aki nem írt programot, annak nehéz megérteni, hogy mi az 53, 320 vagy 240. De ha ezt a kódot átírják, minden a helyére kerül.
végső int SCREEN_WIDTH = 640 ; végső int KÉPERNYŐ_MAGASSÁG = 480 ; final int SCREEN_X_CENTER = SCREEN_WIDTH / 2 ; final int SCREEN_Y_CENTER = SCREEN_HEIGHT / 2 ; végső int SPRITE_CROSSHAIR = 53 ; ... drawSprite ( SPRITE_CROSSHAIR , SCREEN_X_CENTER , SCREEN_Y_CENTER );Most már világos: ez a kód egy sprite -ot jelenít meg a képernyő közepén - a célkeresztet. A legtöbb programozási nyelvben az ilyen konstansokhoz használt összes értéket a fordításkor kiszámítják, és behelyettesítik azokra a helyekre, ahol az értékeket használják ( konstans hajtás ). Ezért a forrásszöveg ilyen változtatása nem rontja a program teljesítményét.
Ezenkívül a mágikus számok potenciális hibaforrások a programban:
Néha a mágikus számok bántják a platformok közötti kódot [1] . A lényeg az, hogy C -ben 32 bites és 64 bites operációs rendszerekben a char, shortés típusok mérete garantált long long, míg a int, long, size_tés mérete ptrdiff_tváltozhat (az első kettőnél a fordítófejlesztők preferenciáitól függően pl. az utolsó kettő, a célrendszer bitmélységétől függően). A régi vagy rosszul megírt kódban előfordulhatnak "bűvös számok", amelyek egy típus méretét jelzik – ha eltérő bitmélységű gépekre költözünk, ezek finom hibákhoz vezethetnek.
Például:
const size_t ELEMEK SZÁMA = 10 ; hosszú a [ NUMBER_OF_ELEMENTS ]; memset ( a , 0 , 10 * 4 ); // rossz - a long 4 bájtot feltételez, az elemek bűvös számú memsetjét használja ( a , 0 , NUMBER_OF_ELEMENTS * 4 ); // rossz - a long 4 byte -os memset ( a , 0 , NUMBER_OF_ELEMENTS * sizeof ( long )); // nem teljesen helyes - a típusnév megkettőzése (ha a típus megváltozik, itt is módosítani kell) memset ( a , 0 , NUMBER_OF_ELEMENTS * sizeof ( a [ 0 ])); // helyes, optimális a nullától eltérő méretű memkészlet dinamikus tömbjéhez ( a , 0 , sizeof ( a )); // helyes, statikus tömbökhöz optimálisNem kell minden számot konstanssá konvertálni. Például a Delphi kódja :
for i := 0 to Count - 1 do ...A 0 és 1 számok jelentése világos, és nincs szükség további magyarázatra.