Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Kleines Quiz

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
bakunin



Anmeldungsdatum: 16.08.1999
Beiträge: 597
Wohnort: Lorsch (Südhessen)

BeitragVerfasst am: 05. Apr 2002 2:42   Titel: Kleines Quiz

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.

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?

code:

#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\n", sizeof (foo));
return 0;
}



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
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

hjb
Pro-Linux


Anmeldungsdatum: 15.08.1999
Beiträge: 3236
Wohnort: Bruchsal

BeitragVerfasst am: 05. Apr 2002 14:13   Titel: Re: Kleines Quiz

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".
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
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?
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger

bakunin



Anmeldungsdatum: 16.08.1999
Beiträge: 597
Wohnort: Lorsch (Südhessen)

BeitragVerfasst am: 05. Apr 2002 15:32   Titel: Re: Kleines Quiz

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:

code:

#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"},
/* ... */
}



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"[3].

Ok, ich hatte eher als Antwort das altbekannte a[b] == *(a + b) == *(b + a) == b[a] 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".

Cheers,
GNU/Wolfgang
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

hjb
Pro-Linux


Anmeldungsdatum: 15.08.1999
Beiträge: 3236
Wohnort: Bruchsal

BeitragVerfasst am: 06. Apr 2002 13:41   Titel: Re: Kleines Quiz

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:

code:

union {
unsigned long l;
char* p;
} x;

x.p = NULL;
printf("x.l = %ld\n", x.l);



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

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?
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger

bakunin



Anmeldungsdatum: 16.08.1999
Beiträge: 597
Wohnort: Lorsch (Südhessen)

BeitragVerfasst am: 06. Apr 2002 14:54   Titel: Re: Kleines Quiz

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
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

fiesh
Gast





BeitragVerfasst am: 09. Apr 2002 17:21   Titel: Re: Kleines Quiz

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
Gast





BeitragVerfasst am: 16. Apr 2002 15:53   Titel: Re: Kleines Quiz

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 Wink
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 ... Sad )

Dass das free fehlt ist kein wirklicher Fehler.

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

Bye
Daniel
 

de
Gast





BeitragVerfasst am: 16. Apr 2002 15:56   Titel: Re: Kleines Quiz

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

In C99 schon.
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy