Wann = und wann == ?



  • Hallo ich habe eine kurze, schnelle Frage finde aber leider gar nix dazu.

    Wann schreibt man bei Rechnungen = und wann schreibt man == ?

    z.B.:

    AktuellesJahr==(Zeit->tm_year)+1900;
    

    Ich musste das genau so angeben, denn ansonsten mit nur einem = funktioniert es nicht. Und auch bei den Bedingungen in allen möglichen Schleifen (while(), do-while(), for() , if() etc.) ist es mal so und mal sohabe ich jedenfalls festgestellt.

    Warum ist das so und welche Regelungen gibt es dafür? Gibt es denn überhaupt eine? 😕



  • "=" ist eine Zuweisung "==" ist ein logischer Vergleich.

    int a;
      a = 3;
    
      if(a == 3) //logischer vergleich liefert true
      if(a == 5)  //logischer vergleich liefert false
      if(a = 3) //3 wird a zugewisen, danach folgt eine implizite Konvertierung und du hast dann sowas wie ...
      if(3) //...da stehen, was true ergigbt
    


  • = ist eine Zuweisung und == ist ein Test auf Gleichheit. Immer. Was dich verwirrt ist das eine Zuweisung den zugewiesenen Wert zurückgibt, deshalb kann man sie innerhalb eines if/while/... benutzen.
    `

    while(c=getchar())

    entspricht

    char c=getchar();

    while(c)

    {

    ...

    c=getchar();

    }

    `
    wobei while(xyz) eine Kurzform von while(xyz!=0) ist, dito für if usw.

    Man kann aus Versehen mal = statt == tippen, deswegen meckert der Compiler so Sachen wie mein Beispiel an (wenn er so eingestellt ist). Um das zu verhindern und zu kennzeichnen dass man absichtlich eine Zuweisung macht macht man ein weiteres Paar Klammern drum.
    Also
    `

    if((zahl=funktion()))

    ...

    `



  • Vielen Dank für die schnellen Antworten Leute

    ABER was mich dann EXTREM verwirrt ist das hier:

    AktuellesJahr==(Zeit->tm_year)+1900;
    
    AktuellesJahr=(Zeit->tm_year)+1900;
    

    WARUM funktioniert dann nur das obere und beim unteren crasht mein Programm? Ich habe die Variable AktuellesJahr definiert, genauso wie ich die exakt korrekte Verwendung von der struct tm *Zeit verwendet habe, mit pointer etc. ist aber definitiv ohne Fehler.

    DENN es soll ja kein Vergleich vollzogen werden, sondern der Variable soll der Wert auf der linken Seite des Gleichheitszeichens (sprich (Zeit->tm_year)+1900) ZUGEWIESEN werden. 😕 😕

    Warum also der crash? 😕



  • *EDIT: Tschuldigung, der Variable AktuellesJahr soll natürlich der Wert auf der rechten Seite zugewiesen werden 😃



  • Crasht das Programm, wenn es ausgeführt wird? Dann liegt es nicht am '=' oder '==' Operator sondern daran, dass die Variable 'Zeit' kein gültiger Pointer ist. Da der '==' Fall effektiv nichts tut, wird dieser wahrscheinlich vom Compiler wegoptimiert, so dass nichts passiert. Im '=' Fall wird diese Anweisung natürlich nicht wegoptimiert, weshalb sich der ungültuge Pointer bemerkt macht.
    ~Das lässt mich zumindest meine Glaskugel vermuten~



  • Da du im Eingangspost schon sagtest, dass es bei if/for/etc. "mal so, mal so" ist liegt Hellseher mit seiner Vermutung wohl richtig. Durch das hinzufügen von z.B. if(...) ist das Ergebnis von '==' wieder relevant und der Compiler kann die Zeile nicht einfach weg optimieren ("wegstreichen").



  • Es hat sich gerade geklärt, es lag nicht daran

    do{
    printf("	  Wann bist du geboren? Gib bitte zuerst das Jahr an: ");
    scanf("%d",&y);
    fflush(stdin);	
    }while(y>2015||y<0);
    

    Vorher stand anstelle des 'y' ein Array[y] (der natürlich definiert war), es hat auf irgendeine Art und Weise nicht funktioniert. Egal. Der Thread kann beendet werden. Danke für eure Hilfe

    🙂 🙂 🙂



  • int y = -1;
    
    do{
    	printf("      Wann bist du geboren? Gib bitte zuerst das Jahr an: ");
    	scanf("%d",&y);
    	fflush(stdin); 
    }while(y>2015||y<0);
    printf( "y: %d", y );
    

    Wann bist du geboren? Gib bitte zuerst das Jahr an: -999999999999999999999
    9999999999999999999999999999999
    y: 1

    Müsste man weiter untersuchen.



  • Ich habs nochmal durchgeschaut, aber tzdm nix gefunde. Ist ja auch egal 😃


Log in to reply