Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Lotto

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
04.12.2008, 16:19 Uhr
kronos
Quotenfisch
(Operator)


Relativ einfach...


C++:
#include <stdio.h>
int main()
{
    int a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9;
    
    a+=a++ + ++a;  // undefiniert
    b+=b+++b;        // undefiniert
    c+=4>>2<<2;
    d=~d+1+11;
    e=e+e/2;
    f=0xf.fp-1f;
    g=(g+g-g*g,g);
    h=(int)&i;

    printf("Die Lotto-Zahlen:\t");
    printf("%d%d%d%d%d%d%d%n\n",a,b,c,d,e,f,g,h);
    printf("Zusatzzahl:\t\t%d\n",i);

#error Bitte einen Tipp abgeben ohne den Compiler zu verwenden!
}

--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 04.12.2008 um 17:59 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.12.2008, 16:22 Uhr
0xdeadbeef
Gott
(Operator)


Undefiniert aufgrund fehlender Sequenzpunkte.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.12.2008, 16:27 Uhr
kronos
Quotenfisch
(Operator)


Wollte gerade noch schreiben, das bei undefiniertem Ergebnis die Bank gewinnt... Wieso ist das nicht über die Operator-Rangfolge regelbar?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.12.2008, 16:50 Uhr
0xdeadbeef
Gott
(Operator)


http://en.wikipedia.org/wiki/Sequence_point
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.12.2008, 17:58 Uhr
kronos
Quotenfisch
(Operator)


...war nur der Meinung, dass Postfix Inkremente erst beim nächsten Sequenzpunkt ausgewertet werden, offenbar nicht.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.12.2008, 19:18 Uhr
0xdeadbeef
Gott
(Operator)


Es steht nicht fest, wann genau die Nebeneffekte eintreten, nur dass es bis zum nächsten Sequenzpunkt geschieht. Gleiches gilt für Präinkremente.

Wie dem auch sei, a und b sind undefiniert, aus den genannten Gründen. c ist 7, d ist ebenfalls 7, sofern ieee 754 erfüllt ist. e ist 7, f ist (nicht überraschend) ebenfalls 7, aber clever kodiert - hexadezimale Float-Literale sind eine echte Rarität, g ist ebenfalls undefiniert (Der Komma-Operator ist kein Sequenzpunkt).

h und i sind ebenfalls undefiniert, und das Programm enthält hier noch eine andere Art undefinierten Verhaltens - es ist keinesfalls garantiert, dass int genau so breit ist wie int*! Ist dies nicht der Fall, kann das %n im printf-Aufruf hier zu allen möglichen Dingen führen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.12.2008, 20:45 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von kronos:
Relativ einfach...


Soso. *g*


Zitat:


C++:
#include <stdio.h>
/* als Leerzeile eingefügt... */
int main()
{
    int a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9;
    
    a+=a++ + ++a;  // undefiniert
    b+=b+++b;        // undefiniert
    c+=4>>2<<2;
    d=~d+1+11;
    e=e+e/2;
    f=0xf.fp-1f;   // Hier Zeile 12
    g= (g+g-g*g,g);
    h= (int)&i;

    printf("Die Lotto-Zahlen: \t");
    printf("%d%d%d%d%d%d%d%n\n",a,b,c,d,e,f,g,h);
    printf("Zusatzzahl: \t\t%d\n",i);

#error Bitte einen Tipp abgeben ohne den Compiler zu verwenden!
}



da das Rätsel ja schopn gelöst ist, hab ich es mal durch den Compiler (Open Watcom C++ 1.7) gejagt, der meinte dazu folgendes:


Zitat von Watcom Compilermeldungen:

wcc386 kronos-lotto.c -i=d: \WATCOM\h;d: \WATCOM\h\nt -w4 -e25 -zq -od -d2 -6r -bt=nt -mf
kronos-lotto.c(12): Error! E1032: Expression for '.' must be a 'structure' or 'union'
kronos-lotto.c(12): Error! E1009: Expecting ';' but found 'f'
kronos-lotto.c(13): Warning! W111: Meaningless use of an expression
kronos-lotto.c(23): Warning! W107: Missing return value for function 'main'
Error(E42): Last command making (E: \Watcom\kronos-lotto.obj) returned a bad status
Error(E02): Make execution terminated
Execution complete



Also scheint er "hexadezimale Float-Literale" nicht zu kennen...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 04.12.2008 um 20:48 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.12.2008, 20:53 Uhr
0xdeadbeef
Gott
(Operator)


Dann ist der C99-Support des Open Watcom 1.7 scheinbar nicht besonders weit fortgeschritten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.12.2008, 22:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


äh wieso ist i undefiniert? i wird doch nirgends was zugewiesen (bis auf den initalen wert) oder hab ich was übersehen?

ansonsten wird doch bei


C++:
h = (int)&i;



die adresse nach int gecastet (also ggf gekürzt) und dann h zugewiesen - fertig aus? also wohldefiniert aber halt nicht vorhersehbar (man weiß ja nich wo i dann im speicher liegt)

und bei g sollte es auch kein problem geben,

der im ersten teil des kommaoperators wird ja nur gerechnet, danach kommt der kommaoperator und dann die klammern (darum meldet hans' compiler ja auch meaningless statement) weil dann da g = g; dortsteht ...
--
class God : public ChuckNorris { };

Dieser Post wurde am 04.12.2008 um 22:18 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.12.2008, 22:49 Uhr
0xdeadbeef
Gott
(Operator)


Das %n im printf-Aufruf schreibt die Anzahl der Ausgegebenen Zeichen an die durch den betreffenden Parameter angegebene Speicheradresse. Das ist in diesem Fall h, und wenn sizeof(int) == sizeof(int*) schreibt es das dann in i. Wenn nicht, dann halt an die abgeschnittene Adresse.

In der Praxis haut das übrigens (meistens) so lange hin, wie i auf dem Stack innerhalb der ersten INT_MAX byte liegt. Der Stack wächst von 0xfff...ff nach unten, und solange die abgeschnittene Adresse kleiner als 0 ist und der Rest der Adresse nur aus gesetzten Bits besteht, wird nachher auf den gleichen Wert zurückgecastet. Verlassen kann man sich darauf aber natürlich nicht.

Was g angeht, da hab ich mich verkuckt, g+g-g*g hat ja keine Nebeneffekte. Also, g ist auch 7 - mein Fehler.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 04.12.2008 um 22:55 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: