Anweisungsblock

In den Beispielen für die if-else-Struktur, while-Schleife, do-while-Schleife und for-Schleife wurden um die auszuführenden Codeblöcke jeweils geschweifte Klammern {} gesetzt. Die tatsächliche Deklaration dieser Strukturen sieht jedoch eine einzelne Anweisung vor.

if(number > 10) printf("The number is big.");

The number is big.

Mittels der geschweiften Klammern können mehrere Anweisungen hintereinander in einen Block gepackt werden, was als einzelne Instruktion gilt. Hier wird als Beispiel die if-Struktur genommen:

if(1){ printf("with {}\n"); } if(1) printf("without {}\n"); if(1){ printf("inside "); printf("inside\n"); } if(0) printf("inside\n"); printf("outside\n");

with {} without {} inside inside outside

Details

Als Kennzeichnung der Zugehörigkeit eines Teiles ohne geschweifte Klammern zu einer Kontrollstruktur wird üblicherweise die Zeile um einen Tab-Schritt eingerückt, dies hat jedoch in den C-Sprachen keinerlei Relevanz, sondern dient lediglich dem Programmierer als visuelle Hilfe. Dies wird dann nützlich, wenn mehrere solche Einzelanweisungen hintereinander auftreten, denn da alle Kontollstrukturen als einzelne Anweisung gelten, sind beliebige Verschachtelungen möglich:

#include <stdio.h> int main(int argc, char** argv){ for(int z = 0; z<2; z++) for(int y = 0; y<2; y++) for(int x = 0; x<2; x++) printf("%d, %d, %d\n", x, y, z); return 0; }

0, 0, 0 1, 0, 0 0, 1, 0 1, 1, 0 0, 0, 1 1, 0, 1 0, 1, 1 1, 1, 1

Die Notation ohne geschweifte Klammern ist für kleine Strukturen nach wie vor üblich, birgt jedoch ein Fehlerpotential, wenn der Code erweitert wird. Folgendes Beispiel sollte alle Zahlen positiv machen, leider wurde vor die Vorzeichenumkehr eine Debug-Zeile eingefügt, welche nun bewirkt, dass die ursprünglich positiven Zahlen negativ werden.

#include <stdio.h> int main(int argc, char** argv){ int number = 42; if(number < 0) printf("%d is negative.", number); number = -number; printf("%d should be positive.", number); return 0; }

-42 should be positive.

Bereichsdefinition

Durch die Definition eines Anweisungsblockes mit geschweiften Klammern {} wird ein neuer Scope eingeleitet. Somit können lokal neue Variablen deklariert werden, welche ausserhalb der Kontrollstruktur nicht sichtbar sind.

int number = 42; if(number > 10){ int i = 50; printf("i has value %d.\n", i); } printf("i has value %d.\n", i);

i has value 50. error: 'i' undeclared

In der Sprache C ist der Bereich nur innerhalb der geschweiften Klammern gültig, unter C++ wurde der Bereich auf die Bedingung erweitert. Ein Konstrukt wie das folgende ist somit nur mit C++ zu realisieren:

int number = 42; if(int i = number + 1){ printf("i has value %d.\n", i); }

i has value 43.