Bei der ungarischen Notation handelt es sich um eine von Programmierern verwendete Namenskonvention zur Wahl von Bezeichnern für Variablen und Konstanten, Funktionen und Methoden sowie anderen Objekten.

Ihren Namen verdankt die ungarische Notation dem in einem (englischen) Programmtext exotisch anmutenden Aussehen der durch bestimmte Regeln zustande gekommenen Bezeichner und der ungarischen Herkunft ihres Erfinders Charles Simonyi.

Die von Simonyi entwickelte Konvention wurde bei Microsoft in der Application Group (Microsoft Office) mit großem Erfolg angewandt und in der Folge von der Systems Group (Windows) übernommen, wobei es zu einem grundlegenden Missverständnis kam. Simonyi spricht in seinem Paper vom „type“ einer Variablen, was vielfach als „Datentyp“ interpretiert wurde. Gemeint ist vielmehr die Art der Aufgabe einer Variablen im spezifischen Kontext einer Applikation. Es geht also nicht darum, ob eine Variable eine Ganz- oder Bruchzahl speichert, sondern, ob sie einen Zähler, eine Koordinate auf dem Bildschirm, oder einen Index in einem Array repräsentiert. Aus dem Variablennamen sollte man also die Bedeutung und nicht ihren Speichertyp erschließen können.

Durch diese Doppeldeutigkeit existieren zwei Strömungen der Ungarischen Notation, das Apps Hungarian, welches die echte Notation im Sinne Simonyis ist, und das Systems Hungarian, welches durch die Fehlinterpretation der Microsoftschen Betriebssystemabteilung entstanden ist. Letzteres ist für den schlechten Ruf der Konvention verantwortlich, weil die Benennung einer Variablen nach dem Datentyp wenig zum Verständnis des Inhalts beiträgt und trotzdem viel Aufwand verursacht.

Kern der ungarischen Notation ist es, die Aufgabe und den Typ (Apps Hungarian) bzw. nur Typ (Systems Hungarian) einer Variable (oder Methode) in deren Namen zu verdeutlichen.

Apps Hungarian Zusammensetzung eines Variablennamens Charles Simonyis Ungarische Notation beschreibt den kompletten Namen einer Variablen. So will er vor allem wenig aussagekräftige Variablennamen wie var hilf: Integer; ausschließen.

Zu diesem Zweck ist klar definiert, welche Attribute ein Variablenname enthalten darf; {Präfix} {Datentyp} {Bezeichner} Dabei werden Präfix und Datentyp konsequent klein geschrieben, und der erste Buchstabe des Bezeichners groß. Der Unterstrich (_) sollte grundsätzlich vermieden werden. Beispiel: var idFirst: Byte; // Pascal byte idFirst; // C

In diesem Beispiel ist i das Präfix (für den Index in einem Array), d der Datentyp (für Double, s. u.) und First der Bezeichner (für das erste [englisch first = deutsch das erste] Element eines Arrays). Wichtig ist, dass die Variable idFirst ein Integer ist, obwohl im Datentyp ja ein d für Double notiert ist. Dies liegt daran, dass es sich um eine Laufvariable zu einem Array von Double-Werten handelt. Der physische Datentyp der Variable selbst wird in dem Namen der Variablen gar nicht aufgeführt, weil er für ihre Aufgabe irrelevant ist.

In den meisten Fällen reichen sogar nur ein Präfix und ein Datentyp, da alle Attribute optional sind. So kann man eine Laufvariable in einer for-Schleife auch einfach id nennen und erreicht damit eine aussagekräftigere Kennzeichnung als mit einem Variablennamen wie lauf.

Präfixe Das am strengsten sinn-bezogene Attribut des ungarischen Variablennamens ist das Präfix. Es nimmt nur Bezug auf die Funktion der Variablen im Programm, in dem sie verwendet wird.

Die nachstehend aufgeführten Präfixe sind die bereits vereinbarten. Man kann allerdings jederzeit neue (eigene) verwenden, um neue Aufgaben zu spezifizieren. In der Regel erweisen sich die folgenden Präfixe allerdings als absolut ausreichend.

Präfixabgeleitet vonBedeutungppointerEin Zeiger zu einer Adresse.kEine Konstante.hhandleEine (eindeutige) Kennziffer, die indirekt eine Ressource referenziert. Sehr oft findet h im Kontext der Betriebssystem-Kommunikation Verwendung.rgrangeEin Array, welches durch „normale“ Integer indiziert wird. Das Array rg kann als Intervall einer mathematischen Funktion verstanden werden, bei der jeder ganzen Zahl ein Element zugeordnet wird. Ein rgd etwa ist ein Array, das Gleitkommazahlen doppelter Genauigkeit enthält.mpmapEbenfalls ein Array, mit dem Unterschied zu rg, dass hier zum Indizieren beliebige Datentypen verwendet werden, zum Präfix mp werden also zwei Datentypen notiert, nämlich zunächst der Datentyp des Index, und dann der Datentyp des Inhalts. Ist x ein beliebiger Datentyp, so ist mpix äquivalent zu rgx.dndomainNoch ein Präfix für ein Array: Die Besonderheit von dn ist, dass dieses Präfix betont, dass das Wichtige nicht die Elemente des Arrays, sondern die Indizes selbst sind, was dieses Präfix sehr selten macht.iindexEines der wichtigsten Präfixe im Zusammenhang mit Arrays. Z. B. indiziert id ein rgd. Bei einem mpfr, also einem Array von Gleitkommawerten, indiziert von einem booleschen Datentyp, kann man den Index als ifr oder schlicht ir deklarieren (obwohl er einen booleschen Datentyp haben muss).bbaseEin sehr seltenes Präfix, das jedoch ähnlich wie i ist, nur, dass b den direkten Offset eines Elementes in einem Array beschreibt. Ist das Array vom physischen Datentyp Byte, so sind b und i sogar gleich. Ist dch die physische Länge der Elemente eines Arrays rgx, dann gilt für den Index ix (beginnend bei 0): bx = dch * ix.eelementDas Pendant zu i. e kennzeichnet ein Element eines Arrays und wird meistens in Verbindung mit dn genutzt und ist dementsprechend selten. Dennoch kann auch ein Element des Arrays rgd mit ed bezeichnet werden, auch wenn dies in den meisten Fällen nicht zweckdienlich ist.ccountEine Anzahl von Elementen, etwa in einem Array. Die Größe eines rgul kann als cul angegeben werden.ddifferenceEin Unterschied zwischen zwei Variablen, meistens in einem Array. Dabei sollte man nicht den Fehler machen, d mit c zu verwechseln: d bezieht sich immer auf eine Differenz zwischen Indizes.grgroupNicht mit rg zu verwechseln: gr bezeichnet einen Verbund von mehreren Variablen. Dabei handelt es sich jedoch nicht um ein Array, sondern eine Anordnung von unterschiedlichen Variablen. gr kann bei einem struct, record oder einer class benutzt werden.fflagEin Bit in einer Variablen. Nicht zu verwechseln mit dem Datentyp f oder bit, der sich auf die ganze (physische) Variable bezieht. Das Präfix f bezeichnet ein Bit in einer Variablen des physischen Datentyps byte, word, etc., das Flaggencharakter hat.shshift amountDer Index zu einem Bit (f) in einer Variablen (keinem Array). Ist nur f gesetzt, hat die Variable den Wert .uunionEine unspezifische Variable, die unterschiedliche (ungarische) Datentypen beinhalten kann (wenn dies auch sinnvoll ist). Daher ist dieses Präfix äußerst selten, denn zwei sinnverschiedene Variablen sind selten kompatibel.aallocationEine Zuordnung, kein Array. a wird als Komplement zu p oder auch h verwendet, da in a die Dereferenzierung gespeichert wird. Damit ist apl äquivalent zu l, da es die Variable an der Adresse von l ist, also l selbst.vEine globale Variable. Etwa zum Austausch von Daten. Sollte in der Praxis sparsam bis gar nicht eingesetzt werden, da es dazu verleitet, den Sinn der Variablen auszulassen. Wenn die Variable keinen strengen Zweck hat, ist es meist besser, das Präfix einfach wegzulassen, als ein konstruiertes v zu notieren.

Datentypen Um eine bessere Austauschbarkeit von Quellcode zu erreichen, hat man (bzw. Simonyi) sich auf einige Datentypen oder Basetypes, geeinigt. Dabei stellt man einen leichten „C-Geschmack“ fest, was die Benennung betrifft (zum Beispiel l wie long für einen 32-Bit-Integerwert).

Datentypabgeleitet vonBedeutungfflagBoolesche Datentypen (gemeint ist wieder die Bedeutung, nicht der physische Datentyp) bzw. Variablen mit Wahrheitswert. Der Bezeichner sollte den wahr-Zustand der Variablen beschreiben, wenn sie also true ist.chchar(acter)Ein Ein-Byte-Zeichen. Meistens in einem nicht vorzeichenbehafteten (unsigned) Byte oder einem Char gespeichert.ststringEine Zeichenkette, die ähnlich derer in der Programmiersprache Pascal ist, also eine Zeichenkette, deren erstes Zeichen die Länge des Strings enthält.szstring zero terminatedEin nullterminierter String, wie er in C implementiert ist (Zeigerbasiertes char-Array)fnfunctionMeistens ein Zeiger auf eine Methode.flfileEine Datei bzw. eine Datenstruktur, meistens vom Betriebssystem übergeben.wwordEin Maschinenwort, meistens zwei Byte groß und vorzeichenbehaftet. Gemeint ist allerdings nicht zwingend die Implementation im physischen Datentyp word. Wie bei der AppsUN üblich, ist der Zweck gemeint. Etwa eine generische Benutzung der Variablen mit entsprechenden Methoden kann ein w rechtfertigen.bbyteEin Byte, welches ebenfalls nicht an den gleichnamigen physischen Datentyp gebunden ist, diesem allerdings aufgrund der vorzeichenlosen 8 Bit meistens entspricht (siehe w).llongEin Doppelwort, also vier Byte, ebenfalls nicht an long (C) oder Integer (Pascal) gebunden (siehe w).uwunsigned wordNicht vorzeichenbehaftetes Maschinenwort.ulunsigned longNicht vorzeichenbehaftetes Doppelwort.rrealGleitkommawert mit einfacher Genauigkeit. In C meist float.ddoubleGleitkommawert mit doppelter Genauigkeit. In C meist double.bitEin einzelnes Bit. Kann meist besser mit einem ‚f‘ (flag) bezeichnet werden.vvoidTheoretisch eine leere Variable ohne Datentyp. Wird nur in Verbindung mit einem Zeiger verwendet, um typenunabhängig auf Werte zu zeigen.envenvironmentWird für Labels, also Sprungziele verwendet (Pascal: goto envLoop;).sbsegment baseEin Segmentzeiger auf den Speicher (siehe Assemblersprache).ibindivisible base oder index byteZunächst kann die Variable als Index (i) zu einem Array von Bytes (b) angesehen werden. Allerdings kann man ib auch von indivisible base ableiten.

Bezeichner Oft reichen Präfix und Datentyp völlig aus, um eine Variable zu benennen und zu erklären. Die Variable zum Durchlaufen eines Arrays rgch ist durch var ich: Integer; // Pascal int ich; // C ausreichend beschrieben. Jedes Beiwort erscheint überflüssig, "nicht-ungarisch" oder schlicht falsch. Zum Beispiel: ichLauf, ichIndex, ichArray etc.

Trotzdem benötigt man gelegentlich einen Bezeichner, der die Variable konkret an eine Aufgabe bindet. Dazu kann man ein beliebiges (selbstverständlich sinnvolles) Wort anhängen. Man muss nur beachten, keine Unterstriche (_) zu benutzen und das Wort nach der Form „Xxxxx“ zu notieren (also nur den ersten Buchstaben groß zu schreiben). Zu diesem Zweck gibt es bereits einige vereinbarte Wörter, die man aufgrund ihrer häufigen Verwendung eingeführt hat. Davon beziehen sich die meisten auf ein Array oder eine ähnliche Struktur.