Ist (4 > y > 1) eine gültige Anweisung in C++? Wie bewerten Sie das ggf.

Lesezeit: 4 Minuten

Ist 4 y 1 eine gultige Anweisung in
trusktr

Ist das ein gültiger Ausdruck? Wenn ja, können Sie es so umschreiben, dass es mehr Sinn macht? Ist es zum Beispiel dasselbe wie (4 > y && y > 1)? Wie bewertet man verkettete logische Operatoren?

  • Mögliches Duplikat von Sprachunterstützung für verkettete Vergleichsoperatoren (x < y < z)

    – phuklv

    10. Februar 2018 um 10:01 Uhr

Ist 4 y 1 eine gultige Anweisung in
Mystisch

Die Aussage (4 > y > 1) wird wie folgt analysiert:

((4 > y) > 1)

Die Vergleichsoperatoren < und > von links nach rechts auswerten.

Die 4 > y kehrt entweder zurück 0 oder 1 je nachdem ob es stimmt oder nicht.

Dann wird das Ergebnis mit 1 verglichen.

In diesem Fall seit 0 oder 1 ist nie mehr als 1der Die gesamte Anweisung wird immer falsch zurückgegeben.


Es gibt jedoch eine Ausnahme:

Wenn y ist eine Klasse und die > Operator wurde überlastet, um etwas Ungewöhnliches zu tun. Dann geht alles.

Zum Beispiel wird dies nicht kompiliert:

class mytype{
};

mytype operator>(int x,const mytype &y){
    return mytype();
}

int main(){

    mytype y;

    cout << (4 > y > 1) << endl;

    return 0;
}

  • Technisch, 4 > y kehrt entweder zurück false oder truedie konvertiert werden 0 oder 1 für den nächsten Vergleich.

    – fredoverflow

    17. Januar 2012 um 6:16 Uhr

  • Ich würde die Analyse als bezeichnen operator>(operator>(4, y), 1) um die Tatsache zu betonen, dass es sich um eine wiederholte Anwendung binärer Funktionen handelt und nicht um eine Art n-stellige Funktion

    – Caleth

    5. November 2018 um 16:25 Uhr

  • C++ braucht stärkere Typen. Die implizite Typkonvertierung führt zu solchen subtilen Fehlern.

    – Vasantha Ganesh

    15. März 2021 um 12:30 Uhr

1646968809 771 Ist 4 y 1 eine gultige Anweisung in
Sion Sheevok

Ausdrucksgültigkeit

Ja, es ist ein gültiger Ausdruck, vorausgesetzt, y ist eine Ganzzahl oder kann implizit in eine Ganzzahl konvertiert werden. Wenn es nicht ist und die > Operator überladen ist, ist es eine andere Geschichte außerhalb des Rahmens dieser Frage.

Es wird von links nach rechts ausgewertet als ((4 > y) > 1).

Vorausgesetzt y eine ganze Zahl ist, betrachten wir die beiden Möglichkeiten. 4 > y zurückkehren kann true oder false. Der nächste Teil wird effektiv true > 1 oder false > 1.

Angesichts der impliziten Konvertierung von bool nach int gibt es zwei Möglichkeiten: A) 4 > y kehrt zurück true. true wertet zu 1. 1 > 1 wird als falsch ausgewertet. B) 4 > y kehrt zurück false. false wertet zu 0. 0 > 1 wird als falsch ausgewertet.

In jedem Fall wird der Ausdruck als falsch ausgewertet.

Umgeschriebene Interpretation

Ich nehme an, was Sie beabsichtigen ((4 > y) && (y > 1)).

Beispiel

(4 > y > 1) ist nicht dasselbe wie (4 > y && y > 1).

Logische Operatoren

Die logischen Operatoren (!, &&, ||) verwenden Kurzschlusslogik.

Gegeben a && b, a wird ausgewertet. Wenn a wird dann als wahr ausgewertet b wird ausgewertet. Anders, b wird nicht ausgewertet. Wie für a || barbeitet die Kurzschlusslogik umgekehrt. a wird ausgewertet. Seit Ausdruck a zuerst ausgewertet wird, wenn es falsch ist, besteht keine Möglichkeit, dass der gesamte Ausdruck wahr ausgewertet wird.

Gegeben a || b, a wird ausgewertet. Wenn a wertet dann als falsch aus b wird ausgewertet. Anders, b wird nicht ausgewertet. Seit Ausdruck a zuerst ausgewertet wird, wenn es wahr ist, besteht keine Möglichkeit, dass der gesamte Ausdruck falsch ausgewertet wird.

Das Verketten der Operatoren ist eine Frage von Operator Vorrang. Es ist besser, Klammern zu verwenden und sich klar zu äußern, anstatt ein falsches Verhalten zu riskieren.

1646968810 401 Ist 4 y 1 eine gultige Anweisung in
Ted Hopp

Ich denke, es ist ein gültiger Ausdruck (keine Aussage), aber wahrscheinlich nicht das, was Sie wollen. Es wertet von links nach rechts aus, als (4 > y) > 1. Der Test 4 > y wird entweder zu 0 (falsch) oder 1 (wahr) ausgewertet, und der gesamte Ausdruck wird immer zu 0 (falsch) ausgewertet.

4 > y wird als boolescher Wert wahr oder falsch ausgewertet. Der Rest des Ausdrucks ist dann wesentlich [true|false] > 1, was keinen Sinn macht.

4 > y > 1 –> KANN SOWOHL SEIN, wenn y – Klasse ist!!.

 #include <iostream>
 #include <string>

 struct num{ int n; };

 struct op{ bool v; struct num n; };

 struct op  operator > (int x, num n){
  struct op o = { x > n.n, n };
  return o;
 }
 bool operator > (struct op o, int x)
{
    return o.v && o.n.n > x;
}

int main()
{


    struct num y = { 2 } ;
    if (  4 > y > 1 ) {  std::cout << "4 > y > 1 TRUE" << std::endl; }
    else { std::cout << "4 > y > 1  ALWAYS FALSE" << std::endl; }
}

989720cookie-checkIst (4 > y > 1) eine gültige Anweisung in C++? Wie bewerten Sie das ggf.

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy