AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

Ein Thema von paule32.jk · begonnen am 9. Okt 2024 · letzter Beitrag vom 25. Nov 2024
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.260 Beiträge
 
Delphi 13 Florence
 
#1

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 08:28
Ok, wenn wir schon beim theoretisieren sind.
Die Frage ist ja , warum gibt es ÜBERHAUPT zwei verschiedene Zeichen.

Bei einem Vergleich wäre das ja gar nicht nötig, weil das "if" ja schon alles dazu sagt:
Delphi-Quellcode:
a = 1234; // Zuweisung

if ( a = 1234 ) then // Vergleich
begin
end
Das Problem sind wohl die direkten Zuweisungen aus einem boolschen Operator:
Delphi-Quellcode:
a = 1234;

b = a = 1234; // Zuweisung und Vergleich, b wäre dann True
Im 2ten Fall weiß der Compiler nicht genau, ob er b zuweisen soll, oder a.
Wenn der Compiler schlauer wäre, dann sollte er das meiner Meinung nach trotzdem hinbekommen,
denn das erste "=" müsste IMMER eine Zuweisung sein, oder nicht?

Gibt es eventuell andere Fälle, wo eine Unterscheidung Zuweisung und Vergleich nötig wäre?
Sehe ich auf die Schnelle nicht.
Eine Zuweisung innerhalb von komplexeren Vergleichen würde ich sowieso als Seiteneffekt, und Fehler ansehen.

! Also: Weg mit all dem überflüssigem Zeug und nehmen wir nur "=" für Alles
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch
Online

Registriert seit: 11. Aug 2012
Ort: Essen
1.768 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 09:09
... und dann ist da noch die C-Syntax:

Code:
a = 5;
if (a=6) {
  AIst6(); // wird aufgerufen
} else {
  AIstNicht6();
}
Es wird AIst6 aufgerufen, weil das Gleichheitszeichen in der If-Abfrage als Zuweisung interpretiert wird und eine Zuweisung auch noch den zugewiesenen Wert zurückliefert. Der ist in diesem Fall <> 0 also True.

In Delphi entspräche das
Delphi-Quellcode:
  a := 5;
  a := 6; // in C findet dies in der If-Abfrage statt
  if a = 6 then
    AIst6()
  else
    AIstNicht6();
Wenn also die ersten C Compiler nicht versucht hätten, Tipparbeit zu sparen, sprich,
Code:
(Wert1 = Wert2)
immer einen Boolschen Wert liefern würde statt Wert1 auf Wert2 zu setzen, brauchte man den ganzen Kladderadatsch nicht.

Aber es war halt wichtiger (oder cooler?), schreiben zu können:
Code:
a = b = c = 10;
statt
Code:
a = 10;
b = 10;
c = 10;
Und der Mist zog sich danach durch alle von C abgeleiteten Sprachen. Das führte dann dazu, dass man statt
Code:
  if (a == 5)
immer
Code:
  if (5 == a)
schreiben sollte. Was das Problem etwas entschärfte, denn falls man ein '=' vergisst, schlägt die Zuweisung auf die Konstante fehl.

Inzwischen warnen die Compiler vermutlich, wenn sie in If-Abfragen etc. (x=y) finden, aber da bin ich nicht mehr auf dem Laufenden. Ich bin vor mehr als 20 Jahren aus den C-ähnlichen Sprachen ausgestiegen.
Thomas Mueller

Geändert von dummzeuch (11. Okt 2024 um 09:37 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.260 Beiträge
 
Delphi 13 Florence
 
#3

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 11:01
... und dann ist da noch die C-Syntax:

Code:
a = 5;
if (a=6) {   //<== Halte ich IMMER für einen Fehler
  AIst6(); // wird aufgerufen
} else {
  AIstNicht6();
}
Ja genau, aber ich halte das eben immer für falsch, korrigiert mich wenn es Fälle gibt, wo dies wirklich logisch Sinn macht.

Außer maximaler Verwirrung hat das doch keine Vorteile, außer vielleicht wirklich auf Assembler-Ebene,
wo dann z.B. ein zugewiesener Wert direkt weiterverarbeitet werden kann, der schon im Register ist, oder sowas.

Man muss dabei vielleicht Bedenken, dass diese Syntax wirklich aus Zeiten kamen,
als 1024 Byte noch ein Riesenspeicher war, und als noch um jedes Bit mit Säbeln und Morgenstern hart gekämpft wurde.
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
371 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 11:11
Ihr kennt bestimmt die Anekdote mit den Russen und C ... ?

Einige Verschwörer denken ja bis heute, das C entwickelt wurde, um den technischen Fortschritt der Federation (mit Luna, Lika und Gagarin) zu bremsen. Und weil die Russen als erstes Bunt TiWi hatten, sollte das mit den in den USA gestarteten Gemini Projekte (also die bemante Mondbesteigung) ausgeglichen werden.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.260 Beiträge
 
Delphi 13 Florence
 
#5

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 11:27
Nee, glaube ich nicht.
IT Nerds waren schn immer auf ihrem Paralleluniversum in ihrer Parallelwelt unterwegs,
da zählen Ländergrenzen oder Staatszugehörigkeiten einfach nichts.
Es ist wie eine große Familie, Sternenübergreifend.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.175 Beiträge
 
Delphi 13 Florence
 
#6

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 12:19
Ja genau, aber ich halte das eben immer für falsch, korrigiert mich wenn es Fälle gibt, wo dies wirklich logisch Sinn macht.
Naja, also ich habe schon öfter Code wie diesen:
Delphi-Quellcode:
CallResult := CallAPI(...);
if CallResult = 0 then
  Result := ...
else
  raise ESevereError.Create('Fehlercode: ' + CallResult.ToString);
Ich finde es aber immer besser, wenn man einzelne Befehle auch separat schreibt, damit es übersichtlicher ist. Insofern würde ich das ohnehin nicht zusammenfassen wollen. Also so nach dem Motto:
Delphi-Quellcode:
if CallResult := CallAPI(...) then
  raise ESevereError.Create('Fehlercode: ' + CallResult.ToString)
else
  Result := ...
Theoretisch wäre das mit Pascal-Syntax durchaus umsetzbar, ohne dass es dort Mehrdeutigkeiten gäbe. Die automatische Umwandlung des Zahlenwerts in einen Boolean wäre noch zusätzlich nötig. Sonst müsste es so gemacht werden: if (CallResult := CallAPI(...)) > 0 then Wie gesagt, ich würde es nicht wollen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von smallie
smallie

Registriert seit: 8. Jan 2013
19 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 14:51
Niklaus Wirth schrieb vor einigen Jahren:

Zitat:
Good Ideas, Through the Looking Glass
IEEE Cover Feature 2006

It has become fashionable to regard notation as a secondary issue depending purely on personal taste. This could partly be true; yet the choice of notation should not be considered arbitrary. It has consequences and reveals the language’s character.

Choosing the equal sign to denote assignment is one notoriously bad example that goes back to Fortran in 1957 and has been copied blindly by armies of language designers since. This bad idea overthrows a century-old tradition to let = denote a comparison for equality, a predicate that is either true or false. But Fortran made this symbol mean assignment, the enforcing of equality. In this case, the operands are on unequal footing: The left operand, a variable, is to be made equal to the right operand, an expression. Thus, x = y does not mean the same thing as y = x. Algol corrected this mistake with a simple solution: Let assignment be denoted by :=.

This might appear as nitpicking to programmers accustomed to the equal sign meaning assignment. But mixing up assignment and comparison truly is a bad idea because it requires using another symbol for what the equal sign traditionally expresses. Comparison for equality became denoted by the two characters == (first in C). This is an ugly consequence that gave rise to similar bad ideas using ++, —, &&, and so on.

Published by the IEEE Computer Society 0018-9162/06/$20.00 © 2006 IEEE
"There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors."
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
371 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 10:10
Ok, wenn wir schon beim theoretisieren sind.
Die Frage ist ja , warum gibt es ÜBERHAUPT zwei verschiedene Zeichen.

Das Problem sind wohl die direkten Zuweisungen aus einem boolschen Operator:
Code:
a = 1234;

b = a = 1234;  // Zuweisung und Vergleich, b wäre dann True
Im 2ten Fall weiß der Compiler nicht genau, ob er b zuweisen soll, oder a.
Wenn der Compiler schlauer wäre, dann sollte er das meiner Meinung nach trotzdem hinbekommen,
denn das erste "=" müsste IMMER eine Zuweisung sein, oder nicht?
Das hat damit zu tun, das die Werte bei C/C++ auf einen Stack gelegt werden - nach dem LIFO (last in first out) Prinzip:
die Werte gehen also immer nach unten bzw links nach rechts beim setzen aufgebaut:

seter:
push b
push a
push 1234

geter:
pop 1234
pop a
pop b

bei Pascal werden Variablen-ähnlich nach oben aufgebaut.
hat beides sein für und wider...
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.530 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: EMB DCE 12 - Bedingungen mit einen Assign-Zeichnen

  Alt 11. Okt 2024, 10:43
Ich halte es für ein Gerücht, dass bei einer Zuweisung der Stack benutzt wird. Wir sind doch nicht bei FORTH
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 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