&& im if

Hi Leute,
Bin gerade dabei java zu lernen und habe jetzt einen Error bei einer if-Funktion:(
Hier ist die Code Zeile:

if ((tag == gtag) && (monat = gmonat)) {
        System.out.print("Happy birthday!
");
    } // end of if

Und hier die Error Meldung:


Geburtstagsrechner.java:26:23: error: bad operand types for binary operator '&&'
    if ((tag == gtag) && (monat = gmonat)) {
                      ^
  first type:  boolean
  second type: int

Könntet Ihr mir vielleicht sagen, was ich falsch gemacht habe?
Vielen Dank im Voraus!

Flüchtigkeitsfehler: (monat = gmonat) es fehlt ein Gleichheitszeichen
Und bitte Code-Tags benutzen.

Steht ja da. Halt auf Englisch.

Es gibt ein Problem mit dem Binären Operator “&&”

Rechts und links von dem Doppelund muß ein Boolean stehen.

Links (first type) ist boolean und somit ok
Rechts (second type) ist ein integer.

(monat = gmonat) liefert einen int zurück, da gmonat der variable monat zugewiesen wird und monat ein int ist.

da du allerdings monat und gmonat vergleichen möchtest benötigst du ein Doppeltes Gleichheitszeichen und kein Einfaches.
Doppelt ist Verleich, Einfach ist Zuweisung.

[ot]bitte Abspaltung mit Edit der Lösung zur eigentlichen Frage durchführen
wird sonst zu ot-lastig[/ot]

if ((tag == gtag) && (monat = gmonat))

Warum so kompliziert ?

if (tag.equals(gtag) & monat.equals(gmonat))

wegen

:wink:

oder Autoboxing? na, equals hat für sich seine Probleme, null

[QUOTE=Quiji]if ((tag == gtag) && (monat = gmonat))

Warum so kompliziert ?

if (tag.equals(gtag) & monat.equals(gmonat))[/QUOTE]

in der richtigen Form (beides “==” und ohne die unnötigen Klammern) ist der obige Ausdruck klar “einfacher”, wenn man nicht nur mit Java aufgewachsen ist.

Zu der obigen Verwirrung zur Kurzschlussauswertung hier nochmal ein kleines Programm:


public class AndOrShortCircuit {

    public static void main(String[] args) {
        if (dies(true) && das(true)) {
            System.out.println("1 - ja");
        }
        else {
            System.out.println("1 - nein");
        }

        if (dies(false) && das(true)) {
            System.out.println("2 - ja");
        }

        else {
            System.out.println("2 - nein");
        }

        if (dies(true) && das(false)) {
            System.out.println("3 - ja");
        }
        else {
            System.out.println("3 - nein");
        }

        if (dies(false) && das(false)) {
            System.out.println("4 - ja");
        }
        else {
            System.out.println("4 - nein");
        }
        
        
        
        if (dies(true) || das(true)) {
            System.out.println("5 - ja");
        }
        else {
            System.out.println("5 - nein");
        }

        if (dies(false) || das(true)) {
            System.out.println("6 - ja");
        }

        else {
            System.out.println("6 - nein");
        }

        if (dies(true) || das(false)) {
            System.out.println("7 - ja");
        }
        else {
            System.out.println("7 - nein");
        }

        if (dies(false) || das(false)) {
            System.out.println("8 - ja");
        }
        else {
            System.out.println("8 - nein");
        }
    }

    private static boolean dies(boolean b) {
        System.out.println("dies(" + b + ")");
        return b;
    }

    private static boolean das(boolean b) {
        System.out.println("das(" + b + ")");
        return b;
    }

}

mit der Ausgabe

dies(true)
das(true)
1 - ja
dies(false)
2 - nein
dies(true)
das(false)
3 - nein
dies(false)
4 - nein
dies(true)
5 - ja
dies(false)
das(true)
6 - ja
dies(true)
7 - ja
dies(false)
das(false)
8 - nein

um alle Zweifel, was in welcher Reihenfolge in welchem Fall ausgewertet wird, zu beheben.

[QUOTE=Quiji]if ((tag == gtag) && (monat = gmonat))

Warum so kompliziert ?

if (tag.equals(gtag) & monat.equals(gmonat))[/QUOTE]

Der zweite Ausdruck ist doch völlig beschauert: völlig unmotiviert ein logisches UND zwischen zwei booleans durch ein bitweises und ersetzt, völlig unmotiviert einen Vergleich von primitiven Typen (int) mit equals durchgeführt - das ist Quark.

Ich habe mir mal die Mühe gemacht, Sens Vorschlag nachzukommen, OT zu verschieben (entsprechender Beitrag gelöscht, weil obsolet). Die Diskussion über Binäre Operatoren findet ihr hier…

http://forum.byte-welt.net/java-forum-erste-hilfe-vom-java-welt-kompetenz-zentrum/java-grundlagen-fuer-anfaenger-und-umsteiger-java-se/15098-binaere-operatoren.html

Hier schreibe ich noch mal die (mMn) günstigste Lösung hin, und markiere den Thrad entsprechend.

        System.out.print("Happy birthday!
");
    } // end of if```