Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » formale Sprachen » Logische Operatoren » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 8 Beiträge
Airblader

Das kann natürlich gut sein. Ich halte mich selbst daran, sowas nicht zu schreiben, darum übersehe ich sowas dann auch mal. großes Grinsen

Letztlich ist das nur ein Grund mehr, solche Konstrukte nicht wirklich anzuwenden.
Karlito

Zitat:
Original von Airblader
Noch ein Zusatz:

Dieser Effekt erlaubt allerlei Sprachkonstrukte und Abkürzungen. Eine if-Abfrage wie

code:
1:
2:
3:
if( someVariable == true ) {
    doSomething();
}


lässt sich damit abkürzen zu

code:
1:
someVariable && doSomething();



Das funktioniert nur, wenn die Methode doSomething() nicht den Rückgabetyp void hat.

VG,

Karlito
Airblader

Noch ein Zusatz:

Dieser Effekt erlaubt allerlei Sprachkonstrukte und Abkürzungen. Eine if-Abfrage wie

code:
1:
2:
3:
if( someVariable == true ) {
    doSomething();
}


lässt sich damit abkürzen zu

code:
1:
someVariable && doSomething();


Wir haben ja schließlich eben gelernt, dass die rechte Seite nur evaluiert wird, wenn die linke Seite "true" ergibt.

Wichtig: Auch hier gilt, dass solche Spielereien lustig sind und man sich solchen Effekten bewusst sein darf, aber tatsächlich verwenden sollte man sowas nicht.
Airblader

So – ich habe in der U-Bahn doch einen Denkfehler gehabt, es ist also doch alles korrekt. Vielleicht dennoch der Gedanke, der mir kam:

Die logischen Operatoren "&&" bzw. "||" sind sogenannte "short circuit"-Operatoren. Sie werden in der Regel von links nach rechts ausgewertet und die Auswertung wird abgebrochen, sobald das Ergebnis bereits feststeht – das spart Rechenzeit.

Ein Beispiel:

code:
1:
2:
3:
4:
5:
6:
bool a = false;
bool b = true;

if( a && b ) {
    // ...
}


Da a bereits false ist, kann die Bedingung schon nicht mehr erfüllt werden. Der Wert von b wird daher erst gar nicht ausgewertet. Interessant wird das, wenn man nicht Variablen, sondern Funktionen verknüpft.

Folgendes Beispielprogramm führt zweimal eigentlich die selbe Abfrage durch, lediglich die Seiten werden vertauscht:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
bool testFunction( bool param ) {
    cout << "Tick ";
    return param;
}

int main () {
    // Output: "Tick Tick "
    if( testFunction( true ) && testFunction( false ) ) {
        // do nothing
    }

    // Output: "Tick "
    if( testFunction( false ) && testFunction( true ) ) {
        // do nothing
    }
}


Wie man hier sogar online sehen kann, stimmt der angegebene Output tatsächlich. In der zweiten if-Abfrage wird der rechte Operand also erst gar nicht evaluiert, da das Ergebnis durch den linken Operanden bereits feststeht.

Beim "||" sieht das Ganze analog aus, nur andersrum: Evaluiert bereits der erste Operand zu "true", so ist die Bedingung bereits erfüllt und der Rest wird nicht ausgewertet.

Lange Rede, kurzer Sinn: Mein Gedanke war vorhin, dass dieser Effekt eine subtil andere Auswertung der beiden Versionen aus der Aufgabe zur Folge hätte – war allerdings ein Gedankenfehler in der Schnelle. Augenzwinkern
Airblader*

Ich bin mir nicht so sicher, ob die b) richtig ist. Es könnte einen subtilen Unterschied geben. Ich teste es nachher mal, wenn ich daheim bin.
Dragon_Fighter

Vielen Dank!
Karlito

Hallo,

die Anfängerfragen nerven keineswegs. Mir persönlich helfen Sie immer wieder den Stoff präsent zu halten.

zu a)
Stimmt. Weitere geläufige bezeichnungen für den Ausdruck sind XOR oder Antivalenz. Deine Argumentation von 3) verstehe ich nicht ganz. Da es aber eh nicht eintritt, ist es irrelevant. Ich persönlich hätte den Fall 3 weggelassen und Fall 3 + 4 folgendermaßen beschrieben:
3) Es regnet nicht und es stürmt nicht führt zu einer falschen Aussage
4) Es regnet und es stürmt führt zu einer falschen Aussage

zu b)
Genau richtig begründet. Da die De-Morganschen gesetzte äquivalente Umformungen darstellen, sind die beiden Ausdrücke Äquivalent.

zu c)
Es gibt keinen Äquivalenten Ausdruck ohne die Negation, da es keine Möglichkeit gibt, den Negationsoperator mit anderen Operatoren darzustellen. Vorrausgesetzt es gibt nur die zweistelligen Operatoren && und ||, dann führen a && a oder a||a immer auf die identische Abbildung.

VG,

Karlito
Dragon_Fighter Logische Operatoren

Meine Frage:
Hallo, ich hoffe, dass ich Euch nicht mit meinen Anfängerfragen auf die Nerven gehe. Hier ist wieder eine Aufgabe, an der ich mich versucht habe:

(a) Wie würden Sie diese Bedingung beschreiben:

code:
1:
( (x && !y) ) || ( (!x&&y) )
?

(b) Worin liegt der Unterschied zwischen

code:
1:
(a && b)
und

code:
1:
(!(!a || !b))
?

(c) Formulieren Sie den Ausdruck

code:
1:
!(a && b)
ohne den ! Operator.

Meine Ideen:
Zu (a):

Das würde ich als "Entweder-Oder" bezeichnen.
Beispiel:

a="Es regnet."
b="Es stürmt."

Der gesamte Ausdruck ist (theoretisch) in folgenden drei Fällen wahr:

1.) Es regnet und stürmt nicht. (linke Aussage stimmt)
2.) Es regnet nicht und stürmt. (rechte Aussage stimmt)
3.) Es regnet und stürmt nicht. Und es regnet nicht und stürmt. (linke und rechte Aussage stimmen)

Aber die Aussage 3 kann nicht eintreten; es kann nicht gleichzeitig regnen und nicht regnen bzw. stürmen und nicht stürmen.

Also entweder es regnet und es stürmt nicht - oder es regnet nicht und es stürmt.


----

(b) Meiner Ansicht nach gibt es da keinen Unterschied!

Nach de Morgan hat man doch

code:
1:
(!a || !b)=!(a && b)
, also

code:
1:
(!(!a || !b))=(!(!(a && b))=(a&&b)


--------------

Zu (c)

Das weiß ich leider nicht!
Ich weiß nur:

code:
1:
!(a&&b)=!a || !b
,

aber da kommt der ! Operator ja noch drin vor.