Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Negativ beispiel zum ansehn ;) (https://www.delphipraxis.net/83011-negativ-beispiel-zum-ansehn-%3B.html)

Corpsman 24. Dez 2006 11:01


Negativ beispiel zum ansehn ;)
 
Hallo Leuts.

Ich habe hier mal ein kleines Beispiel das ihr euch ansehen sollt.

Es geht mir nicht um Optimierung, oder sonst was. Ich will eigentlich nur das ihr euch überlegt was das Programm ausgibt.

Dann führt es aus und lasst euch überraschen.

Der witz ist das Hoffentlich niemand so Programmiert. Denn die hier entstehenden Nebeneffeckte sind ja schon heftig.

Delphi-Quellcode:
Unit Unit1;

Interface

Uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

Type
  TForm1 = Class(TForm)
    Button1: TButton;
    Procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  End;

Var
  Form1: TForm1;
  x: integer;

Implementation

{$R *.DFM}

Function f: integer;
Begin
  x := x + 1;
  result := x;
End;

Function g: integer;
Begin
  x := x * 2;
  result := x;
End;

Procedure TForm1.Button1Click(Sender: TObject);
Begin
  x := 1;
  showmessage(inttostr(f + x * g));
End;

End.
Nice Cristmas to all

Corpsman

3_of_8 24. Dez 2006 11:15

Re: Negativ beispiel zum ansehn ;)
 
Das Programm gibt alles mögliche aus, weil der Integer x nicht initialisiert wurde.

Khabarakh 24. Dez 2006 11:30

Re: Negativ beispiel zum ansehn ;)
 
Aha, interessant :stupid: .
Delphi-Quellcode:
x := 1;
@Corpsman: Hab richtig geraten ;) .

Robert Marquardt 24. Dez 2006 11:32

Re: Negativ beispiel zum ansehn ;)
 
Also ich sehe da ein X:= 1; in Button1Click.
Was das Ergebnis ist kann man nur raten. Das haengt davon ab wie der Compiler optimiert.

3_of_8 24. Dez 2006 11:39

Re: Negativ beispiel zum ansehn ;)
 
Sorry, Doppelpost... Firefox... :wall:

EDIT: Bei mir kommt übrigens 7 raus. ;)

pilic 24. Dez 2006 11:42

Re: Negativ beispiel zum ansehn ;)
 
Also wenn es euch interessiert, bei mir kommt auch 7 raus. :hi:

Corpsman 24. Dez 2006 11:50

Re: Negativ beispiel zum ansehn ;)
 
OK ich sehe euch sind die Hoarschen Regeln nicht unbedint ein Begriff.

Ja 7 ist richtig.

Compiliert ihr das unter Java dann kommt übrigens 10 raus.

Hier noch ein negatives C++ Beispiel

Delphi-Quellcode:
x = 5;
x += x++;
Na ne Ahnung was hier rauskommt ?

Daniel G 24. Dez 2006 11:51

Re: Negativ beispiel zum ansehn ;)
 
Zitat:

Zitat von 3_of_8
Das Programm gibt alles mögliche aus, weil der Integer x nicht initialisiert wurde.

Natürlich wird der initialisiert... :wink:

negaH 24. Dez 2006 12:27

Re: Negativ beispiel zum ansehn ;)
 
Zitat:

Hier noch ein negatives C++ Beispiel

Code:
x = 5;
x += x++;
Na ne Ahnung was hier rauskommt ?
Sollte, bzw. muß 11 rauskommen. x += x geht vor x++, dh. x++ muß laut standard am Ende ausgeführt werden.
Das Verhalten sollte eigentlich bei allen C Compilern konsistent sein und überall 11 rauskommen. Ich sehe das als reguläres C an, kann man also so schreiben.

Wenn du schreibst

Code:
x += ++x;
dann muß 12 rauskommen.

Was hast du denn erwartet ?

Gruß Hagen

Balu der Bär 24. Dez 2006 12:38

Re: Negativ beispiel zum ansehn ;)
 
Zitat:

Zitat von negaH
Code:
x = 5;
x += x++;
Sollte, bzw. muß 11 rauskommen.

Wieso? Unter C# erhalte ich 10 als Ergebnis, bei x += ++x erhalte ich 11.

:gruebel:

3_of_8 24. Dez 2006 12:46

Re: Negativ beispiel zum ansehn ;)
 
10? Das kann doch gar ned stimmen... :gruebel:

Andidreas 24. Dez 2006 12:47

Re: Negativ beispiel zum ansehn ;)
 
@corpsman
was für nebeneffekte sollen denn auftreten???

Balu der Bär 24. Dez 2006 12:48

Re: Negativ beispiel zum ansehn ;)
 
@3_of_8: Da ist Visual C# aber anderer Meinung. :P

negaH 24. Dez 2006 12:53

Re: Negativ beispiel zum ansehn ;)
 
x += x++; sollte das gleiche sein wie

x += x;
x++;

gleich

x = x + x;
x = x +1;

10 = 5 + 5;
11 = 10 +1;

Ich habs im GCC probiert, kommt 11 und 12 raus. Es gibt aber unter den vielen Compilerswitches auch welche die diese Verhalten beeinflussen, und da wirds dann typisch C-doof ;)

Zitat:

f() + x * g()
da sollte auch 7 rauskommen, auch wenn das Verhalten "undokumentiert" ist. Der Formalparser wird zuerst x * g() auflösen. Dabei gehen Funktionsaufrufe vor Variablen. D.h. also 1. g() dann 2. * x und 3. + f(), ergibt 7. Das sollte ebenfalls in jeder Borland PASCAL Version identische Resulate liefern, unabhängig von den Compilerswitches. Denoch ist es undokumentiert. Ein schlechter Stil ist es aber aus anderen Gründen. Wir programmieren indem wir saubere Schnittstellen/Black Boxes erzeugen. Da aber in diesem Beispiel Funktionsresulate und Modifikation globaler Variablen kombiniert werden, dh. funktion g() liefert im Grunde gleich 2 Resultate (Resulat und x+1) zurück. Das ist schlechter Programmierstil da die Modifikation von X nicht in der Schnittstelle zur Black Box g() sichtbar ist.
Das Beispiel sieht aber sehr konstruiert aus, ich habe bisher noch nie solchen Code im realen Einsatz gesehen.

Gruß Hagen

3_of_8 24. Dez 2006 13:38

Re: Negativ beispiel zum ansehn ;)
 
Zitat:

Zitat von Balu der Bär
@3_of_8: Da ist Visual C# aber anderer Meinung. :P

Frei nach Daniel: "Es wird Zeit, dass wir C# mal zeigen, wer hier die Hosen an hat."

JasonDX 24. Dez 2006 14:55

Re: Negativ beispiel zum ansehn ;)
 
Zitat:

Zitat von Balu der Bär
Zitat:

Zitat von negaH
Code:
x = 5;
x += x++;
Sollte, bzw. muß 11 rauskommen.

Wieso? Unter C# erhalte ich 10 als Ergebnis, bei x += ++x erhalte ich 11.

:gruebel:

*klick* for the answer :zwinker:

Frohe Weihnachten :)
Mike

Corpsman 24. Dez 2006 15:38

Re: Negativ beispiel zum ansehn ;)
 
@Andidreas

Du siehst hier gibt es jede menge Diskusionsgrundlage. Und es ist definitiv nicht Klar was nun rauskommen soll.

Das Problem an der sache ist das die Sprache C , bzw Pascal an diesen stellen nicht eindeutig definiert sind und je nach Compiler anders interpretiert wurden.

Da in den Gängigsten Tutorials in der Regel immer nur steht wie man dies und das macht, wollte ich euch eigentlich nur mal ein Beispiel zeigen wie ihr es bitte nicht machen sollt.

Übrigens gibt es Sehr viele bei denen das so ist.

Java, C, Pascal gehören definitiv auch dazu ;)

Schöne Weihnacht noch.

Balu der Bär 24. Dez 2006 17:54

Re: Negativ beispiel zum ansehn ;)
 
Zitat:

Zitat von JasonDX
*klick* for the answer :zwinker:

Ah danke, dann ist ja alles klar. :P

Luckie 24. Dez 2006 18:03

Re: Negativ beispiel zum ansehn ;)
 
Eine Sprache, die so etwas zu lässt, gehört verboten. Ich bin froh, dass so etwas in Delphi nicht möglich ist.

Balu der Bär 24. Dez 2006 18:07

Re: Negativ beispiel zum ansehn ;)
 
Wie war das, alles hat Vor- und Nachteile... :zwinker: :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz