• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Frage zur Programmiersprache C

Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
int i = 0;
i = ({int j; j=1; j;});

Warum funktioniert dieser Code? (die Variable i enthält den Wert 1) Ist das ANSI C oder eine Erweiterung vom gcc? (im Reference Manual von 1988 konnte ich auf die schnelle nichts finden)
 

Scheinkultur

Guest
die "schleife" hat scheinbar einen rückgabewert von 1 und dann kann man das auch zuweisen egal obs in klammern steht
 

Observator

Guest
Borland C Compiler 5.5 hält es auch für fehlerhaft.
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
danke, wundert mich eigentlich auch nicht, die grammatik scheint ungueltig zu sein. ist wohl eine besonderheit des gcc (damit kann man z.b. variablen in #define macros deklarieren und deren werte zurueckgeben - damals gab es vielleicht noch kein inline).

johnwayne: versteh nicht genau was du meinst. die klammern kann man nicht weglassen, du kannst z.b. keine bloecke zuweisen oder innerhalb von ( ) variablen deklarieren etc. eine schleife duerfte das auch nicht sein ;)
 
Mitglied seit
20.09.2001
Beiträge
1.355
Reaktionen
0
sicher nen undokumentiertes feature :D
 
Mitglied seit
08.12.2001
Beiträge
2.053
Reaktionen
0
"feature" :bored:
scheinbar wirds so interpretiert das der block "j" als rückgabewert hat - also 1
 

Scheinkultur

Guest
Original geschrieben von [UEP]Xyz

johnwayne: versteh nicht genau was du meinst. die klammern kann man nicht weglassen, du kannst z.b. keine bloecke zuweisen oder innerhalb von ( ) variablen deklarieren etc. eine schleife duerfte das auch nicht sein ;)

nein "schleife" meinte ich nur weils so aussieht... schient ja irgendwie sowas wie ne inner function oder so zu sein, die ne rückgabe von 1 hat... der code scheint logisch mich irritiert nur das die rückgabe 1 ist :)

und die klammern müssen natürlich da sein

aber wie kommt der return zustande?

{int j; j=1; j;} :confused:

ich schätze das ist irgendeine spezialregel die in irgendeinem C-Buch steht das sie theoretisch möglich ist oder so...

also wer das wirklich weiß bitte mal posten
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
Original geschrieben von JohnWayne

ich schätze das ist irgendeine spezialregel die in irgendeinem C-Buch steht das sie theoretisch möglich ist oder so...

also wer das wirklich weiß bitte mal posten

es gibt nicht *irgendeine spezialregel* sondern hoechstens paar durchgedrehte coder die sowas in den compiler einbaun. bloss nicht auf die idee kommen das selbst zu benutzen!
 

The_Company

Guest
http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Statement-Exprs.html

Und Viper, das ist eine absolut akzeptable Spezialregel. Natürlich sollte man darauf achten, dass man den Compiler checkt, aber dass muss man bei #pragma (MSVCs Lieblingsdirektive) meist auch.
Beispiel:
Code:
#ifdef __GNUC__
#  define max(a,b) \
       ({ typeof (a) _a = (a); \
           typeof (b) _b = (b); \
         _a > _b ? _a : _b; })
#else
#  define max(a,b) (a > b ? a : b)
#endif
Das ist absolut akzeptabler und portabler C Code.
 

The_Company

Guest
c = max (a++, b);

Daraus wird:
c = a++ > b ? a++ : b;

und dann wird 2x a++ genommen und a wird um 2 erhöht.
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
"A compound statement enclosed in parentheses may appear as an expression in GNU C."

vielen dank the_company.
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
kein c(++) coder der nicht gerade darauf steht, eigenheiten des GCC zu finden und zu verwenden kann mit dem code was anfangen ohne die gcc doku zu lesen. dann schreiben die gnuler schon in ihre doku man moege diese konstrukte nicht in c++ headern einsetzen weil man sich dort sonst probleme einhandeln kann.

aber compa wird schon recht haben, es kommt von gnu also muss es wohl was gutes sein (will nit wissen wie der abgehen wuerde wenn ms auf so ne idee gekommen waere).

:stupid:
 

The_Company

Guest
Original geschrieben von ViperDK
kein c(++) coder der nicht gerade darauf steht, eigenheiten des GCC zu finden und zu verwenden kann mit dem code was anfangen ohne die gcc doku zu lesen. dann schreiben die gnuler schon in ihre doku man moege diese konstrukte nicht in c++ headern einsetzen weil man sich dort sonst probleme einhandeln kann.

aber compa wird schon recht haben, es kommt von gnu also muss es wohl was gutes sein (will nit wissen wie der abgehen wuerde wenn ms auf so ne idee gekommen waere).
Ein besserer Kritikpunkt wäre gewesen, dass man mit dem Beispiel hidden Bugs produziert, wenn man nur unter GCC programmiert.
Die ursprüngliche Idee bei dieser Erweiterung ist (ja, ich hab nachgefragt), dass man einfacher funktionalen Code schreiben kann. Somit ist es einfacher, zB einen Lisp Interpreter zu schreiben. Der kann dann zwar nur mit GCC kompiliert werden, ist aber nen Stück weniger Code.

Das C++ Beispiel war blöd, weil es eine C Erweiterung ist.
Und das MS Beispiel auch, weil es - im Gegensatz zu MS "Erweiterungen" wie MAX in windows.h - nur eine Erweiterung aber keine Veränderung ist. Genau wie #pragma auch, darüber werd ich mich doch nicht beschweren.
 
Oben