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.