Trennzeichen für numerische Literale

von Hubert Schmid vom 2013-11-03

Ada unterstützt sie von Anfang an, Java seit Java 7 und C++ seit C++14. Die Rede ist von Trennzeichen für numerische Literale im Quelltext. Dieses Feature wird nur selten benötigt, da kaum noch magische Zahlen im Quelltext verwendet werden. Doch wenn man mit langen Ziffernfolgen zu tun hat, können die Trennzeichen die Lesbarkeit deutlich verbessern.

In C++ wird der Apostroph ' als Trennzeichen verwendet. Ein einfaches Beispiel ist im folgenden Listing zu sehen:

#include <iostream> constexpr int speed_of_light = 299'792'458; int main() { std::cout << "Speed of light: " << speed_of_light << " m/s\n"; }

Java und Ada verwenden hingegen den Unterstrich _ als Trennzeichen. Für C++ ist dieser aufgrund möglicher Probleme im Zusammenhang mit Makros ausgeschlossen worden. Die folgenden beiden Listings enthalten einmal für Java und einmal für Ada die Implementierung, die obigem Beispiel entspricht.

public class Lightspeed { private static final int SPEED_OF_LIGHT = 299_792_458; public static void main(String... args) { System.out.println("Speed of light: " + SPEED_OF_LIGHT + " m/s"); } }with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure Lightspeed is Speed_Of_Light : Integer := 299_792_458; begin Put ("Speed of light: "); Put (Speed_Of_Light, Width=>0); Put_Line (" m/s"); end Lightspeed;

Im Gegensatz zu den in vielen natürlichen Sprachen verbreiteten Tausendertrennzeichen, können die Trennzeichen in Programmiersprachen an beliebigen Stellen innerhalb der Ziffernfolge stehen. Das ist durchaus nützlich, sei es nun für viele Dezimalstellen oder für hexadezimale und binäre Schreibweisen, wie in den folgenden Variablendefinitionen in C++.

auto pi = 3.14159'26535'89793'23846'26433'83279'50288'41971'69399'37511L; auto hexspeak = 0x0'dead'beef; auto answer = 0b0'0010'1010;

Doch Vorsicht: Man sollte stets darauf achten, dass die Trennzeichen keine Semantik besitzen. Ansonsten kann es leicht zu schwer auffindbaren Fehlern kommen. Das folgende Beispiel demonstriert das Problem. Dabei wird ein Kalenderdatum als int repräsentiert und die Trennzeichen zur besseren Lesbarkeit des Datums verwendet.

int today = 2013'11'03; std::cout << "Today is " << today << ".\n";

Auf den ersten Blick sieht das nach einer guten Idee aus. Doch was passiert, wenn der nächste Entwickler das Literal durch 2013'11'3 ersetzt?

Also: Trennzeichen in numerischen Literalen sind ein altbekanntes Mittel, um die Lesbarkeit langer Ziffernfolgen zu vereinfachen, und stehen nun auch in Java und C++ zur Verfügung. Magische Zahlen innerhalb des Quelltexts sollten zwar vermieden werden. Werden sie dennoch benötigt, so ist es hilfreich Trennzeichen für die einfachere Lesbarkeit einzusetzen – zumindest solange die Trennzeichen keine Semantik besitzen.