Thema: Delphi Case Frage

Einzelnen Beitrag anzeigen

Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 

Re: Case Frage

  Alt 9. Jun 2004, 18:11
case kann grundsätzlich nur konstante Ordinalwerte benutzen. Und der Grund wird klar, wenn man sich den erzeugten Code ansieht:

Delphi-Quellcode:
var
  i: Integer;
begin
  i := 1;
  case i of
    2: ShowMessage('2');
    3: ShowMessage('3');
  else
    ShowMessage('nix davon');
  end;
end;
Das erzeugt den im Anhang gezeigten Code. Da sieht man sehr schön, wie raffiniert der Compiler vorgeht: Er schreibt zunächst unser i in das Register EAX. Dann zieht er 2 davon ab. Nun prüft er, ob EAX gleich 0 ist, was der Fall gewesen wäre, wenn i=2 wäre. Nun zieht er noch eins und prüft wieder auf 0 (entspricht case 3). Ist bis hierher immer noch kein Sprung erfolgt, kommt ein unbedingter Sprung zur Anzeige von 'nix davon'.
Mit nicht konstanten Werten (geschweige denn mit Strings) wäre solch optimiertes Verhalten nicht möglich.
Und soweit ich weiß, machen das andere Sprachen wie C(++) oder Java auch nicht anders.
Miniaturansicht angehängter Grafiken
casedump.jpg  
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat