# Logische Verneinung



## Mane123 (23. Apr 2009)

Hallo zusammen,

ich habe gerade angefangen, Java zu lernen. Ich bin gerade bei dem Thema logische Operatoren angekommen.
Mit der logischen Verneinung komme ich nicht ganz zurecht, ich habe mir mal folgende Wahrheitstabelle erstellt, um mir eine kleine Eselsbrücke zu bauen: (siehe Anhang)

Die ganz normal Wahrheitstabelle für das logische ODER verstehe ich. 

Ich weiß zwar, dass die Ergebnisse bei der logischen Verneinung einfach umgedreht werden, aus true wird false, aber ich weiß nicht wie die obere Zeile beschriftet werden soll?

Könnt ihr mir da bitte kurz helfen?

Danke!

Viele Grüße


----------



## Schandro (23. Apr 2009)

Sonne scheint | es ist warm | ich ziehe kein tshirt an

gott hast du's gut.


----------



## Mane123 (23. Apr 2009)

Danke für die Antwort.

Naja, so schön hab ich's auch nicht, ich arbeite von 07.00 bis 18.00 und bilde mich danach noch weiter, da gibts auch schönere Sachen in der Freizeit. ;-)

Auf die Bezeichnung der Spalten bin ich auch schon gekommen, aber ich kapier das nicht so ganz,

ich habe ja dann:

Sonne scheint | es ist warm | ich ziehe kein tshirt an
true                      true               false

Müsste es dann in dieser Konstelation nicht in der dritten Spalte "true" lauten?


----------



## Schandro (23. Apr 2009)

Doppelte Verneinung:

Ich ziehe NICHT KEIN Tshirt an
ist dasselbe wie
Ich ziehe ein Tshirt an


naja, zumindest in der Informatik^^


----------



## faetzminator (23. Apr 2009)

Mane123 hat gesagt.:


> [...] Ich weiß zwar, dass die Ergebnisse bei der logischen Verneinung einfach umgedreht werden, aus true wird false, aber ich weiß nicht wie die obere Zeile beschriftet werden soll?



Bei einem OR? :autsch:
bei einem OR müssen 1 bis n der n Terme wahr sein.

```
true | true // gibt true
true || false // gibt true
false || true // gibt true
false || false // gibt true
```
eine beliebige Aussage kannst du mit ! negativieren, als Beispiel

```
!true // false
!false // true
!(true || true) // false, da true || true true ergeben würde
...
```


----------



## Ebenius (23. Apr 2009)

Ich finde schon die erste Tabelle ungünstig beschriftet, weil ich kein T-Shirt anziehe, wenn die Sonne bei -15°C scheint. Schöner wäre: 
	
	
	
	





```
(A || B)
=====================================================
Habe ich meinen | Habe ich meinen | Ich kann mich
Personalausweis | Reisepass bei   | ausweisen.
bei mir? (A)    | mir? (B)        | (A || B)
-----------------------------------------------------
True            | True            | True
False           | True            | True
False           | False           | False
True            | False           | True
```


```
!(A || B) -- Das selbe wie: (!A && !B)
=====================================================
Habe ich meinen | Habe ich meinen | Ich kann mich
Personalausweis | Reisepass bei   | nicht ausweisen.
bei mir? (A)    | mir? (B)        | !(A || B)
-----------------------------------------------------
True            | True            | False
False           | True            | False
False           | False           | True
True            | False           | False
```
"Ich kann mich nicht ausweisen" könnte man auch ersetzen durch: "Mist. Die Polizei wird mich mit zur Wache nehmen."
Ebenius


----------



## Schandro (23. Apr 2009)

> Naja, so schön hab ich's auch nicht, ich arbeite von 07.00 bis 18.00 und bilde mich danach noch weiter, da gibts auch schönere Sachen in der Freizeit.


Achso, ich hab gedacht du wärst irgendein Schüler der hier seine Info-Hausaufgaben erledigt bekommen möchte.


----------



## Mane123 (23. Apr 2009)

Nönö, die Schule hab ich schon ein paar Jährchen hinter mir, ich bin BWL'ler, und möchte mich nebenbei noch weiterbilden.
Mein Problem ist, wenn ich eine Aufgabe habe, die ich nicht ganz lösen kann, dann sitze ich ewg davor. Mit der Thematik beschäftige ich mich schon seit 22 Uhr.


----------



## Mane123 (23. Apr 2009)

Danke für Eure Hilfe schonmal

ich habs jetz so ziemlich verstanden.

Ist das so, dass bei !(A || B) der Compiler die beiden Ausdrücke zuerst vergleicht, und dann zum Schluss das Ergebnies negitiert?

vorher:

true | true | true

und anschließend:

true | true | false


wie funktioniert das dann bei (!A && !B)?

Allerdings steht in meinem Lernbuch geschrieben, dass man immer die gesamten Ausdrücke mit einem "!" negitieren muss, da man ansonsten den Wahrheitswert einer Zahl umdrehen würde, was bei Java nicht möglich ist?

Danke!


----------



## Ebenius (23. Apr 2009)

Mane123 hat gesagt.:


> Ist das so, dass bei !(A || B) der Compiler die beiden Ausdrücke zuerst vergleicht, und dann zum Schluss das Ergebnies negitiert?


Richtig (der Compiler vergleicht normaler Weise natürlich nicht, die Maschine tut das zur Laufzeit, aber sonst richtig). Mit der Einschränkung, dass B gar nicht erst geprüft wird, wenn A schon wahr ist. Das ist der Unterschied zwischen '||' und '|'. Siehe [thread=1364]FAQ-Beitrag: Operatoren (Übersicht)[/thread].



Mane123 hat gesagt.:


> wie funktioniert das dann bei (!A && !B)?


Erst wird A geprüft, dann negiert. Sollte der negierte Ausdruck _false_ sein, dann wird der zweite Teil gar nicht geprüft; der selbe Unterschied zwischen '&&' und '&', siehe oben.



Mane123 hat gesagt.:


> Allerdings steht in meinem Lernbuch geschrieben, dass man immer die gesamten Ausdrücke mit einem "!" negitieren muss,


Deswegen steht hier ja auch nicht mehr '||' sondern '&&'. "Nicht A oder B" ist das selbe wie "nicht A und nicht B".



Mane123 hat gesagt.:


> da man ansonsten den Wahrheitswert einer Zahl umdrehen würde, was bei Java nicht möglich ist?


Den Wahrheitswert einer *Zahl*? Sowas wie "42" bedeutet dann "besonders unsicher, ob wahr oder unwahr"? 

Ebenius


----------



## faetzminator (23. Apr 2009)

Mane123 hat gesagt.:


> Ist das so, dass bei !(A || B) der Compiler die beiden Ausdrücke zuerst vergleicht, und dann zum Schluss das Ergebnies negitiert?




Richtig. Ist genau gleich wie in der Mathematik, man arbeitet sich von links nach rechts und von der innersten Klammer nach aussen


----------



## Mane123 (23. Apr 2009)

Danke!

in dem Buch steht geschreiben:

Der Operator ! muss jeweils vor der Klammer ( stehen. Andernfalls würden Sie versuchen, den Wahrheitswert einer Zahl umzudrehen - und das ist in Java nicht möglich.

!(5 <10)  ==> klappt laut der oben stehenden Aussage

(!5 < !10) ==> klappt laut oben stehender Aussage nicht.

Dann ist ja die oben stehende Aussage falsch?

Viele Grüße


----------



## r0bbe (23. Apr 2009)

Jo genau (5<10) ist eine wahre Aussage durch die Negation mit ! wird sie dann falsch!

Eine Zahl besitzt keinen Wahrheitswert, die kann ja nicht richtig oder falsch sein!
Im obigen Beispiel geht es um den Wahrheitswert eines *Ausdrucks*, der kann ja richtig oder falsch sein.

edit:

Probier's doch einfach aus 
System.out.println(!(5 <10)); ==> false
Das andere:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The operator ! is undefined for the argument type(s) int
	The operator ! is undefined for the argument type(s) int


----------



## Ark (23. Apr 2009)

r0bbe hat gesagt.:


> Im obigen Beispiel geht es um den Wahrheitswert eines *Ausdrucks*, der kann ja richtig oder falsch sein.


Genauer: Es geht um den Wert eines booleschen Ausdrucks, der logisch wahr oder falsch sein kann.

Man schreibt für die Negation:
	
	
	
	





```
! boolescherAusdruck
```
 wobei boolescherAusdruck ein beliebiger boolescher Ausdruck ist, z.B.

```
! b // falls b eine boolesche Variable ist
! true // ergibt false
! ! false // ergibt ebenfalls false
! b1 && b2 // vorsicht, hier wird erst negiert und dann UND-verknüpft!
! (5 > 3) // ergibt false und ist identisch mit 5 <= 3
```
Ark


----------

