Grundlagen der Programmiersprache C

#define SQUARE(x) x * x
int a = 3;
printf("%d\n", SQUARE(a + 1));

Welche Ausgabe erzeugt der obige Code, der das mit #define definierte Makro SQUARE verwendet, bei der Ausführung?

  1. A7
  2. B10
  3. C16
Antwort und Erläuterung anzeigen

Antwort: A. 7

Ein Makro ersetzt durch den Präprozessor lediglich eine Zeichenfolge unverändert durch eine andere. SQUARE(a + 1) wird zu a + 1 * a + 1 expandiert, und da die Multiplikation zuerst berechnet wird, ergibt sich 3 + 3 + 1 = 7. Um wie beabsichtigt das Quadrat von (a + 1), also 16, zu erhalten, setzt man das Argument und den gesamten Ausdruck in Klammern: #define SQUARE(x) ((x) * (x)). Selbst dann wird bei einem Argument mit Nebeneffekten wie SQUARE(i++) das i++ zweimal ausgewertet, was undefiniertes Verhalten ist; alternativ lässt sich eine Inline-Funktion verwenden.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. Die Header-Datei sensor.h wurde wie oben geschrieben. Welchen Zweck haben die drei Zeilen #ifndef, #define und #endif?
  2. Der obige Code steht in der Funktion main. Welche Ausgabe erzeugt er bei der Ausführung?
  3. Bei einem Mikrocontroller wird das Ausgaberegister wie oben deklariert und verwendet. Welche Aussage über diese Deklaration ist richtig?
  4. Welche Aussage beschreibt das undefinierte Verhalten im Sinne des C-Standards richtig?
  5. int und unsigned int haben 32 Bit. Was davon ist nach dem C-Standard undefiniertes Verhalten?