Kleines Quiz

Post Reply
Message
Author
bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Kleines Quiz

#1 Post by bakunin »

Hi!

Mich würde wirklich interessieren, ob jemand alle diese Fragen richtig beantworten kann, ohne etwas nachzuschauen oder auszuprobieren. Insbesondere die letzte Frage, denn auf die kenne ich selbst keine Antwort. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

1. Was ist der Sinn folgender Präprozessor-Anweisungen (und warum reicht eine nicht aus)?

#define _STRINGIFY(foo) #foo
#define STRINGIFY(foo) _STRINGIFY(foo)

2. Wozu dient das Schlüsselwort "auto"?

3. Warum ist ein unsinniger Ausdruck wie 3["times"] gültig?

4. Hat NULL garantiert auch immer den numerischen Wert 0? (Bonusaufgabe: In welchem Header wird NULL deklariert?)

5. Welchen Typ kann eine ganzzahlige Konstante (ohne Suffix) haben, wenn sie oktal oder hexadezimal angegeben wurde, den eine dezimal angegebene ganzzahlige Konstante (auch ohne Suffix) nicht haben kann, selbst bei identischem numerischem Wert?

6. Wenn x ein Array aus 10 ints ist und y ein Zeiger auf int, der auf x zeigt, welche beiden Operatoren lassen sich dann sowohl auf x als auch auch y anwenden, bringen aber unterschiedliche Ergebnisse?

7. Ist folgender Code gültig? Warum bzw. warum nicht?

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char **argv)
{
struct foo *foo;
if (argc == 2)
{
struct foo { int x; };
foo = malloc (sizeof (struct foo));
}
else
{
struct foo { char foo[20]; };
foo = malloc (sizeof (struct foo));
}
printf ("%d\<!--no-->n", sizeof (foo));
return 0;
}
</font><hr></pre></blockquote>

8. Was bewirkt das ":0" in folgender Vereinbarung, außer Verwirrung bei den meisten Leuten?

struct x {
char name[21];
int :0;
int x;
};

9. Warum gibt es in C kein logisches Exklusiv-Oder?

Cheers,
GNU/Wolfgang

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Kleines Quiz

#2 Post by hjb »

Hi!

1. Da muß ich passen. Das verwendet man so gut wie nie.
2. auto ist obsolet. Es bezeichnet eine Allokation auf dem Stack.
3. Weil der Operator [] kommutativ ist. Es ist also dasselbe wie "times"<font size="3">.
4. Könnte sein. Allerdings kann ein NULL-Pointer im Speicher anders repräsentiert sein als mit lauter Nullbits. Def. in stdlib.h
5. Char
6. Der Adreßoperator: &x != &y; der sizeof-Operator.
7. Müßte gültig sein, das Resultat ist natürlich die Größe eines Pointers, also 4 oder so.
8. Ein Bitfeld mit 0 Bits <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
9. Weil es zu selten gebraucht wird? Oder weil bereits alle Sonderzeichen belegt waren?

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Kleines Quiz

#3 Post by bakunin »

Hi!

> 1. Da muß ich passen. Das verwendet man so gut wie nie.

Das war (fast) Originalcode aus hurd/utils/settrans.c. Er wird verwendet, um eine Konstante in eine Zeichenkette umzuwandeln nach diesem Schema:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#define DEFAULT_TIMEOUT 60
/* ... */
struct argp_option options[] =
{
{"active", 'a', 0, 0, "Set NODE's active translator" },
/* ... */
{"timeout", 't',"SEC",0, "Timeout for translator startup, in seconds"
" (default " STRINGIFY (DEFAULT_TIMEOUT) "); 0 means no timeout"},
/* ... */
}
</font><hr></pre></blockquote>

Man braucht zwei Anweisungen, weil eine einzelne nicht "60" ergeben würde, sondern "DEFAULT_TIMEOUT". Ebenso wie hierbei:

#define cat(x, y) x ## y
cat(cat(1, 2), 3) /* FEHLER */
#define xcat(x, y) cat(x, y)
xcat(xcat(1, 2), 3) /* OK, ergibt 123 */

> 2. auto ist obsolet. Es bezeichnet eine Allokation auf dem Stack.

Korrekt.

> 3. Weil der Operator [] kommutativ ist. Es ist also dasselbe wie "times"[<!--no-->3<!--no-->].

Ok, ich hatte eher als Antwort das altbekannte a[<!--no-->b<!--no-->] == *(a + b) == *(b + a) == b[<!--no-->a<!--no-->] erwartet, aber deine Antwort kann man natürlich ebenso gelten lassen.

> 4. Könnte sein. Allerdings kann ein NULL-Pointer im Speicher anders repräsentiert sein als mit lauter Nullbits. Def. in stdlib.h

Die Definition ist in stdio.h und in K&R wird recht deutlich gesagt, dass NULL den numerischen Wert 0 hat.

> 5. Char

Oh, clever. Das geht natürlich auch, aber daran hatte ich gar nicht gedacht, ich dachte wirklich an Konstanten, bei denen der Compiler den Typ auswählt. Dabei ist für oktale und hexadezimale nämlich der Typ unsigned int möglich, für dezimale nicht. Wer es nicht glaubt, schaue auf Seite 185 im K&R.

> 6. Der Adreßoperator: &x != &y; der sizeof-Operator.

Korrekt.

> 7. Müßte gültig sein, das Resultat ist natürlich die Größe eines Pointers, also 4 oder so.

Korrekt.

> 8. Ein Bitfeld mit 0 Bits

Korrekt.

> 9. Weil es zu selten gebraucht wird? Oder weil bereits alle Sonderzeichen belegt waren?

Das erste kann ich gelten lassen, das zweite nicht, denn natürlich wäre das logische Exklusiv-Oder das doppelte Zirkumflex (^^). Meine Vermutung ist aber eher: "Weil die PDP-11 keine entsprechende Anweisung hatte". <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Cheers,
GNU/Wolfgang

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Kleines Quiz

#4 Post by hjb »

Hi!

1. Oh, das ist tricky. Solche Sachen habe ich nicht im Kopf, weil ich sie praktisch nie brauche...

4. Das widerspricht meiner Antwort nicht. NULL ist üblicherweise als #define NULL 0 definiert, und in C++ verwenden viele Autoren die 0 direkt. Trotzdem kann die Sache im Speicher anders aussehen. Nehmen wir mal eine 32-bit-Architektur an:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
union {
unsigned long l;
char* p;
} x;

x.p = NULL;
printf("x.l = %ld\<!--no-->n", x.l);
</font><hr></pre></blockquote>

Normalerweise ist das Ergebnis 0, aber man sollte sich nicht darauf verlassen, es könnte auch 4294967295 oder 16777216 oder sonstwas herauskommen. Ich kenne keinen konkreten Rechner, wo das so ist, aber es dürfte einige geben.

5. Das war nur geraten. Verstanden habe ich es sowieso nicht ganz <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

9. Klingt plausibel, ist aber ein schlagendes Beispiel für die Faulheit der Programmierer.

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Kleines Quiz

#5 Post by bakunin »

Hi!

Da fällt mir auf: Deine Antwort auf Frage 8 war unvollständig. Es bewirkt nämlich auch noch eine Ausrichtung an einer sizeof(int)-Grenze im Speicher für das nächste Feld der Struktur. Das macht GCC zwar automatisch in diesem Fall, aber mit diesem Konstrukt kann man es erzwingen.

Cheers,
GNU/Wolfgang

fiesh

Re: Kleines Quiz

#6 Post by fiesh »

die antwort zu frage 9 druefte wohl eher in der tatsache zu finden sein, dass es in der aussagenlogik der mathematik kein zeichen fuer ein logisches XOR gibt, da kein bedarf besteht.

de

Re: Kleines Quiz

#7 Post by de »

Hallo,

Ein paar Korekturen, die beim drüberlesen auffallen:

>1. Was ist der Sinn folgender Präprozessor-Anweisungen (und warum reicht eine nicht aus)?

Undefiniertes Verhalten zu erzielen. _[A-Z] _darf_ man nicht ...

>2. Wozu dient das Schlüsselwort "auto"?

Die C-IAQ nicht gelesen? Da steht doch: "Declaring cars" ;)

>4. Hat NULL garantiert auch immer den numerischen Wert 0? (Bonusaufgabe: In welchem Header wird NULL deklariert?)

Kommt auf die Sprache an ;)
C-FAQ.

>7. Ist folgender Code gültig? Warum bzw. warum nicht?

Nein. Zumindest nicht in C99 und C++.
foo ist kein gültiger Typ und vorwärtsdeklariert hamwa nicht.
Ausserdem liefert sizeof keinen int. Der Cast _muss_ bei vaargs angegeben werden. (Ein Fehler in 98% der C-Bücher ... :( )

Dass das free fehlt ist kein wirklicher Fehler.

Solche Quize sind immer cool. Ich war mir bei manchen nicht sicher ...

Bye
Daniel

de

Re: Kleines Quiz

#8 Post by de »

Korrektur:
>Nein. Zumindest nicht in C99 und C++.

In C99 schon.

Post Reply