was ist genau der unterschied zwischen = und ==



  • hallo
    kann mir jemand bitte erklären was genau der untschied zwischen das hier ist?
    1. = und ==
    2. & und &&
    usw.
    ich weiß, dass "==" als vergleich dient aber warum ist in einem "if" fall das "=" nicht als vergleich benutzbar?
    z.B dieses programm

    # include <iostream>
    using namespace std;
    void main ()
    
    {
    	int x;
    	int y;
    	int sum=0;
    
    	for (int i=0;i<10;i++)
    	{	cin >>x;
    	y=x%2;
    	if (y==0)  // warum kann ich hier nicht nur "=" benutzen. es ist doch ein if fall//
    		sum=sum+x;
    	}
    	cout <<sum;
    
    }
    

    ich bitte um eine gute Erklärung.
    danke



  • lol, weil = eine Zuweisung und == ein Vergleich ist? if wertet nur den Ausdruck in den Klammern aus, dem ist es egal was du da rein schreibst. Aber wenn du auf 0 vergleichen willst statt 0 zuzuweisen, solltest du das auch machen.



  • = ist der Zuweisungsoperator
    == ist der Vergleichsoperator
    & ist das bitweise UND
    && ist das logische UND



  • = ist eine Zuweisung, == ist ein Vergleich. Eigentlich gibts da nicht viel zu erklären: Zwei verschiedene Zeichen, zwei verschiedene Dinge.

    Du kommst wahrscheinlich durcheinander, weil in manchen Sprachen (mir fällt allerdings nur BASIC als Beispiel ein) für beides das = Zeichen verwendet wird und je nach Kontext mal das eine und mal das andere gemeint ist. Das ist aber wie gesagt die Ausnahme.



  • Ein paar grundlegende Dinge:

    Erstens: In einer if-Abfrage (und nicht nur da) gilt Null als falsch und alles andere als wahr. Es ist problemlos möglich,

    if(0) {
      std::cout << "wird nicht ausgeführt\n";
    }
    
    if(1) {
      std::cout << "wird ausgeführt\n";
    }
    
    if(-1000) {
      std::cout << "wird auch ausgeführt\n";
    }
    

    zu schreiben. Das Verhalten ist von C geerbt, und die haben sich da an der Maschinensprache zu der Zeit üblicher Architekturen orientiert.

    Zweitens: Zuweisungen haben einen Wert, nämlich den, der zugewiesen wird. Man kann daher

    int a, b, c;
    
    a = b = c = 2;
    

    schreiben, was als

    a = (b = (c = 2));
    

    verstanden wird.

    Da Zuweisungen Werte haben, kann man diese benutzen wie alle anderen Ausdrücke auch. Beispielsweise ist

    int c;
    
    if((c = 2) == 2) {
      std::cout << "wird ausgeführt!\n";
    }
    

    legaler Code. Verbinde das mit dem oben beschriebenen Verhalten, dass Null falsch und alles andere wahr ist, dann:

    if(a = b) {
      std::cout << "wird ausgeführt, wenn b != 0.\n"
    }
    

    Anmerkung: Das bezieht sich jetzt erstmal alles auf Zahlenwerte. Benutzerdefinierte Typen müssen nicht in einer Weise umwandelbar sein, die für if brauchbar ist, und dann beschwert sich der Compiler. Etwa ist

    #include <string>
    
    std::string s;
    
    if(s = "foo") { // KAWUMM!
    }
    

    kein gültiges C++.



  • Noch eine Ergänzung,
    eine Zuweisung innerhalb einer if-Bedingung wird gerne bei der Fehlerbehandlung eingesetzt:

    int error;
    if ((error = function_that_might_return_an_error()) != OK)
    {
        // schau, was der Fehler war
    }
    

    Sowas trifft man allerdings häufiger in Verbindung mit C Schnittstellen an,
    da in C++ in der Regel Exceptions bevorzugt werden.



  • Noch eine Ergänzung,
    man kann sogar eine Deklaration innerhalb der if-Abfrage machen.

    int getRandomNumber() { return 4; }
    
    int main()
    {
    	if (int number = getRandomNumber()) {
    		std::cout << "Die Zufallszahl ist " << number << '\n';
    	} else {
    		std::cout << "Die Zufallszahl ist null\n";
    	}
    }
    

    Das trifft man aber praktisch nie an.



  • fairdiceroll schrieb:

    Das trifft man aber praktisch nie an.

    Falsch.



  • fairdiceroll schrieb:

    Noch eine Ergänzung,
    man kann sogar eine Deklaration innerhalb der if-Abfrage machen.

    int getRandomNumber() { return 4; }
    
    int main()
    {
    	if (int number = getRandomNumber()) {
    		std::cout << "Die Zufallszahl ist " << number << '\n';
    	} else {
    		std::cout << "Die Zufallszahl ist null\n";
    	}
    }
    

    Das trifft man aber praktisch nie an.

    Ja, klar, kommt nie vor.

    if (shared_ptr<Foo> foo = MachMichMalNenSchoenesFoo())
        MachWasMitDem(foo);
    else
        throw std::runtime_error("Scheissendreck!");
    

    Oops.

    BTW: wenn schon zitieren, dann bitte vollständig

    int getRandomNumber()
    {
        return 4;      // chosen by fair dice roll.
                       // guarenteed to be random.
    }
    


  • fairdiceroll schrieb:

    Das trifft man aber praktisch nie an.

    IMO eine schöne Variante, den Scope einer Variablen möglichst klein zu halten.



  • 314159265358979 schrieb:

    fairdiceroll schrieb:

    Das trifft man aber praktisch nie an.

    IMO eine schöne Variante, den Scope einer Variablen möglichst klein zu halten.

    Ja, sehe ich auch so.



  • fairdiceroll schrieb:

    man kann sogar eine Deklaration innerhalb der if-Abfrage machen.

    Gibt es eigentlich eine Möglichkeit, dabei auf etwas anderes als 0 zu prüfen? Sowas wie

    if((int err = func()) != OK) ...
    

    ist invalid.



  • Nein, gibt es nicht. Was ich eigentlich schade finde. Und diese Art der Definition hat noch ein Problem:

    if (auto p = foo())
    {
    }
    else
    {
      // p existiert hier
    }
    

    Auch schade, da das wirklich ein schönes Mittel ist Scope klein zu halten. Vielleicht kann man das ja ausbauen.


Anmelden zum Antworten