8.7    Kontrollfragen und Aufgaben

  1. Erklären Sie den Unterschied zwischen dem Einbinden einer Datei mit #include mit eingeschlossenen Anführungszeichen (beispielsweise "datei.h") und mit spitzen Klammern (beispielsweise <datei.h>).

  2. Was kann mit der define-Direktive gemacht werden?

  3. Wie können Sie eine symbolische Konstante oder ein Makro aufheben?

  4. Beachten Sie folgende symbolische Konstante:

    #include <math.h>   // benötigter Header für sqrt()
    #define VAL sqrt(2)*8

    Und folgende Konstante mit dem Schlüsselwort const:

    #include <math.h>   // benötigter Header für sqrt()
    const double VAL = sqrt(2)*8;

    Welche der beiden Konstanten wäre die bessere Alternative im Programm und warum?

  5. Was verstehen Sie unter einer bedingten Kompilierung?

  6. Im folgenden Beispiel gibt die Multiplikation den Wert 190 zurück. Korrekt wäre allerdings der Wert 100 (10*(20-10)). Wie können Sie das Problem beheben?

    00  // Kapitel8/aufgabe001.c
    01 #include <stdio.h>
    02 #include <stdlib.h>
    03 #define MULTI(a, b) (a*b)

    04 int main(void) {
    05 int val1 = 10, val2 = 20;
    06 printf("Multiplikation = %d\n", MULTI(val1, val2-10));
    07 return EXIT_SUCCESS;
    08 }
  7. Wie oft wird die for-Schleife ausgeführt und warum?

    00  // Kapitel8/aufgabe002.c
    01 #include <stdio.h>
    02 #include <stdlib.h>
    03 #define CNT 10

    04 int main(void) {
    05 int i;
    06 #undef CNT
    07 #define CNT 5
    08 for( i = 0; i < CNT; i++) {
    09 #undef CNT
    10 #define CNT 20
    11 printf("%d\n", i);
    12 }
    13 return EXIT_SUCCESS;
    14 }
  8. Entwickeln Sie Ihre eigene kleine Makrosprache. Bringen Sie mithilfe der define-Direktive dieses kleine Hauptprogramm (Hallo Welt) in C zur Ausführung. Erstellen Sie hierzu die Header-Datei "mysyntax.h", und berücksichtigen Sie auch, dass diese Header-Datei nicht mehrfach inkludiert werden kann.

    00  // Kapitel8/aufgabe003.c
    01 #include "mysyntax.h"

    02 MAIN
    03 OPEN
    04 WRITE"Hallo Welt\n"WRITE_
    05 END
    06 CLOSE
  9. Definieren Sie zwei parametrisierte Makros, die von zwei Werten den maximalen und den minimalen Wert zurückgeben.

  10. Schreiben Sie ein Makro, das mit einem symbolischen Bezeichner wie DEBUG_ALL Informationen wie Datum, Uhrzeit, Zeile und Datei zu Debugging-Zwecken ausgibt.

Im nächsten Kapitel erfahren Sie nun mehr über Zeichenketten (Strings), Datenfelder (Arrays), und was diese beiden Konstrukte gemeinsam haben. Ferner kommen Sie zum ersten Mal mit Zeigern in Berührung, die dann in Kapitel 10, »Zeiger (Pointer)«, noch sehr ausführlich behandelt werden. Zusammen mit den strukturierten Datentypen sind Strings, Arrays und Zeiger die wichtigsten Themen in der C-Programmierung.