[C] auswerten, ohne dafür vorgesehene konstrukte |
|
[C] auswerten, ohne dafür vorgesehene konstrukte |
|
foo ungleich 0 => print "right"
foo gleich 0 => print "wrong"
foo muss schon im code deklariert und initialisiert werden.
wie würdet ihr es realisieren? mir sind zwei möglichkeiten eingefallen.
nicht erlaubt sind if, while, for, etc... ergo alles, was eine bedingung inne hat.
da es nicht sooo schwer ist, könnte man ja wieder zum kürzesten code streben.
|
|
07.03.2008 18:16 |
|
|
|
wenn du alles was eine bedingung beinhaltet ausschließt, dann wird das ziemlich unmöglich, da ja selbst ein && eine bedinung impliziert ...
sofern du implizite bedingungen zulässt, könnte man mit ausdrücken wie diesen hier arbeiten...
code: |
1:
2:
|
(foo != 0) && printf("right");
(foo == 0) && printf("wrong"); |
|
die schreibweise ist nun explizit, damit jedem klar werden kann warum das funktioniert. wenn man auf länge achtet, würde es auch reichen:
code: |
1:
2:
|
foo&&printf("right");
!foo&&printf("wrong"); |
|
liegt daran, dass c einen integer 0 mit false gleichsetzt, und alles ungleich 0 mit true ...
nach compiler optimierungen dürften beide schreibweisen den gleichen maschinencode erzeugen
(wer sich nu immernoch fragt, warum das ein if ersetzen kann: der && operator ist ein logisches und kein binäres "und" ... ausgewertet wird von links nach rechts... ist der ausdruck links vom operator "false", wird der ganze ausdruck false, und alles rechts vom operator wird gar nicht mehr geprüft, da es keinen einfluss mehr aus das ergebnis des ausdrucks hat... folglich wird die funktion printf gar nicht mehr ausgewertet/aufgerufen)
__________________ Gräten auf dem Sofakissen wird man wohl entfernen müssen.
|
|
07.03.2008 21:04 |
|
|
|
sachlich hatte ich es genau so - beides.
nach "längenoptimierungsversuchen" ist mir noch ne möglichkeit eingefallen: standardmäßig "wrong"
im code:
code: |
1:
2:
3:
4:
5:
6:
|
main () {
char *x="wrong", foo=1 && (x="right");
puts (x);
}
|
|
x zeigt standardmäßig auf "wrong", damit ich beim eventuellen ändern nur mit einem && den initialisierungswert von foo abfragen muss.
ist er 1, wird x geändert, ansonsten nicht angerührt.
danach wird einfach das ergebnis ausgegeben.
hmm, wie kann die bedingung der zweiten schreibweise explizit sein, wenn ein && (nur?) eine bedingung impliziert?
|
|
07.03.2008 23:05 |
|
|
|
ich meinte die art und weise wie der ausdruck aufgebaut ist, nicht das es eine explizite bedinung ist.
foo&&blah()
ist für jemanden der in c nicht unbedingt fitt ist, nicht so leicht nachzuvollziehen
schreibt man dazu dass es gleichbedeutend mit
(foo != 0) && blah()
ist, wird die funktionsweise schnell klar:
es wird zunächst der ausdruck links des && operators auf wahr/falsch geprüft und dann gegebenenfalls der linke operand, wenn der gesammte ausdruck nicht schon nur noch falsch als ergebnis liefern kann ... es ging mir nur um die tatsache, dass bei einer boolschen entscheidung in c ein integer als boolscher operand gleichbedeutend dem ergebnis eines vergleichs dieses integers auf ungleich 0 ist ...
__________________ Gräten auf dem Sofakissen wird man wohl entfernen müssen.
|
|
07.03.2008 23:44 |
|
|
|