Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   not 2=1 ist nicht not(2=1) (https://www.delphipraxis.net/170859-not-2%3D1-ist-nicht-not-2%3D1.html)

DSCHUCH 6. Okt 2012 18:00

Delphi-Version: 5

not 2=1 ist nicht not(2=1)
 
Hoi,

Code:
if not 2=1 then //ist false


if not (2=1) then //ist true
darauf falle ich doch sehr gern rein. Gerade wieder eine halbe Stunde versenkt. Was soll das eigentlich Syntaktisch sein? Wieso wird das unterschiedlich ausgewertet, bzw was wird hier eigentlich wie miteinander logisch verknüpft? Andere Sprachen würden hier eh einen Klammerfehler werfen.

Daniel.

DeddyH 6. Okt 2012 18:04

AW: not 2=1 ist nicht not(2=1)
 
Das obere ist ein binäres not, das untere ein logisches. D.h. der obere Vergleich sieht so aus:
Code:
11111111111111111111111111111101 //= not 2 bei 32 Bit
00000000000000000000000000000001 //= 1 bei 32 Bit

implementation 6. Okt 2012 18:05

AW: not 2=1 ist nicht not(2=1)
 
Delphi-Quellcode:
not 2=1
entspricht
Delphi-Quellcode:
(not 2)=1
Zuerst wird also 2 bitweise negiert und das Ergebnis davon dann mit 1 verglichen.

haentschman 6. Okt 2012 18:06

AW: not 2=1 ist nicht not(2=1)
 
Hallo...

es wird von links nach rechts ausgewertet. Der erste Ausdruck anders geklammert (Wie ausgewertet wird) Dann ist es für dich logisch. :zwinker:

Delphi-Quellcode:
if (not 2) = (1) then
Edit: nur aus Prinzip zum 3. Mal weil zu langsam 8-) Wie die Geier alle :lol:

DSCHUCH 6. Okt 2012 18:33

AW: not 2=1 ist nicht not(2=1)
 
Lach, thx.

Daher verlangen andere Sprachen bei Sowas eine Klammerung. Da muß man erstmal drauf kommen, not 2 ist ein binäres not... :-P

jbg 6. Okt 2012 18:41

AW: not 2=1 ist nicht not(2=1)
 
Und deswegen schreibt man nicht "not (2 = 1)" sondern "2 <> 1". Wofür gibt es denn sonst zu jeder Relation eine "Gegenrelation". Das muss ich meinen Kollegen auch immer wieder des öfteren einbläuen.

Sir Rufo 6. Okt 2012 19:05

AW: not 2=1 ist nicht not(2=1)
 
Zitat:

Zitat von DSCHUCH (Beitrag 1186025)
Lach, thx.

Daher verlangen andere Sprachen bei Sowas eine Klammerung. Da muß man erstmal drauf kommen, not 2 ist ein binäres not... :-P

Vergleiche mit
Code:
-2+1 <> -(2+1)

himitsu 6. Okt 2012 19:18

AW: not 2=1 ist nicht not(2=1)
 
Man muß sich eigentlich nur mal merken, in welcher Reihenfolge Operatoren ausgewertet werden.

NOT ist nunmal höherrangiger, als alles Andere (abgesehn vom unären -)
und wenn man da keine Klammern setzt, dann wird das immer zuerst ausgewertet.


@jbg: *zustimm*

DSCHUCH 6. Okt 2012 19:21

AW: not 2=1 ist nicht not(2=1)
 
das ist schon klar.

das ist aber auch eine klare mathematische operation. in meinem fall waren es klare integer und keine binärdaten. Typ Integer. Daher....

Code:
if not 'a' = 1 then
geht tatsächlich auch als syntax.

Furtbichler 6. Okt 2012 22:00

AW: not 2=1 ist nicht not(2=1)
 
Zitat:

Zitat von DSCHUCH (Beitrag 1186031)
das ist schon klar.

das ist aber auch eine klare mathematische operation. in meinem fall waren es klare integer und keine binärdaten. Typ Integer. Daher....

Du hast es nicht verstanden, oder?
NOT und AND sind sowohl logische als auch -wie du es nennst- Integer-Operatoren.

Neutral General 6. Okt 2012 22:18

AW: not 2=1 ist nicht not(2=1)
 
Naja letztendlich sind sogar die logischen and/not/or/.. -Operatoren binäre Operatoren. (siehe C/C++)

himitsu 6. Okt 2012 22:37

AW: not 2=1 ist nicht not(2=1)
 
In Delphi werden not/and/or/xor binär verwendet, außer bei den Booleans (Boolean/ByteBool/WordBool/LongBool, also alles mit True/False), wo diese als logische Operatoren behandelt werden.

implementation 6. Okt 2012 22:44

AW: not 2=1 ist nicht not(2=1)
 
Zitat:

Zitat von Neutral General (Beitrag 1186046)
Naja letztendlich sind sogar die logischen and/not/or/.. -Operatoren binäre Operatoren. (siehe C/C++)

Nicht unbedingt!
Die Konstante true ist in Delphi als 1 definiert (unter C/C++ gibts verschiedene...), demnach ergaebe ein bitweises
Delphi-Quellcode:
not true
aber 254, was nicht false ist (false ist nur 0).
Daher sehen die Operatoren in C/C++ ja auch anders aus: "!" fuer logisches Not und "~" fuer bitweises.
Das gleiche bei Or und And: "||" und "&&" fuer logisch, "|" und "&" fuer bitweise.
In Delphi heissen die eben immer gleich, daher muss man ein wenig auf den Zusammenhang aufpassen.

Medium 7. Okt 2012 04:06

AW: not 2=1 ist nicht not(2=1)
 
Ich war immer der Auffassung, dass der Unterschied zwischen ||/&& und |/& darin liegt, dass ersteres Optimierung zulässt, und letzeres immer zur Vollauswertung des Ausdrucks führt. Also das, was man bei Delphi über die Compileroptionen nur global einstellen kann ("Boolsche Ausdrück vollständig auswerten" heisst die imho).

JamesTKirk 7. Okt 2012 09:08

AW: not 2=1 ist nicht not(2=1)
 
Zitat:

Zitat von Medium (Beitrag 1186055)
Ich war immer der Auffassung, dass der Unterschied zwischen ||/&& und |/& darin liegt, dass ersteres Optimierung zulässt, und letzeres immer zur Vollauswertung des Ausdrucks führt. Also das, was man bei Delphi über die Compileroptionen nur global einstellen kann ("Boolsche Ausdrück vollständig auswerten" heisst die imho).

Das ist nicht ganz korrekt. Durch die Verwendung von $B bzw. $BOOLEVAL kannst du das lokal einstellen. Siehe auch hier.

Gruß,
Sven

Furtbichler 7. Okt 2012 09:15

AW: not 2=1 ist nicht not(2=1)
 
Medium, ihr beide habt recht:
Hier

Aber imho folgt aus der Tatsache, das & und | binäre Operatoren sind, das sie vollständig ausgeführt werden müssen.


Zitat:

Zitat von Neutral General (Beitrag 1186046)
Naja letztendlich sind sogar die logischen and/not/or/.. -Operatoren binäre Operatoren. (siehe C/C++)

Und DAS ist in Bezug auf Delphi falsch. Delphi unterscheidet hier anhand des Datentyps.

Bool AND Bool => logischer Operator
Int AND Int => binärer Operator

implementation 7. Okt 2012 12:16

AW: not 2=1 ist nicht not(2=1)
 
Zitat:

Zitat von Medium (Beitrag 1186055)
Ich war immer der Auffassung, dass der Unterschied zwischen ||/&& und |/& darin liegt, dass ersteres Optimierung zulässt, und letzeres immer zur Vollauswertung des Ausdrucks führt. Also das, was man bei Delphi über die Compileroptionen nur global einstellen kann ("Boolsche Ausdrück vollständig auswerten" heisst die imho).

Das kommt m.W. auf die Sprache an. In C/C++ ist die Unterscheidung logisch/bitweise, in C# verkuerzt/unverkuerzt.

Medium 7. Okt 2012 15:03

AW: not 2=1 ist nicht not(2=1)
 
Ah! Ich könnte C# im Kopf haben, das hab ich auch weit öfter benutzt als C(++). Compilerschalter, okay. Die gibts ja auch noch =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr.

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