Logische Operatoren



  • Hallo,

    kann jemand mich helfen kann für diese Ausdruck für if...else ?

    ob Wert der Variablen x negativ ist, aber zugleich auch
    der Wert der Variablen y im Intervall [5,30] liegt:
    (für x = 1 und y = 7)

    MfG



  • ich habe schon den erster Teil.

     int x;
    
     printf("Geben Sie x ein :");
     scanf("%d" ,&x);
    
     if (x < 0)
     {
    
        printf("x ist ein negativ Zahl.");
    
     }
     else if (x>0)
    

    {

        printf("x ist ein positiv Zahl.");
    

    }
    ;



  • if( bedingung_1 && bedinung_2 )
    {
       // beide erfüllt
    }
    else
    {
       // min. eine nicht erfüllt
    }
    


  • @Mxrvin sagte in Logische Operatoren:

    ob Wert der Variablen x negativ ist, aber zugleich auch
    der Wert der Variablen y im Intervall [5,30] liegt:

    Schreibs so hin wie Du es gesagt hast?

    if (x < 0 && 5 <= y && y <= 30) {  // ...
    


  • @Swordfish Danke für die Antwort. Bin einen anfänger undziemlich heftig für mich lol
    Soll das so aussehen ? Weil in der Augabe steht Erstellen Sie ein Programm das dieWerte folgender Ausdrücke einer int-Variable wert zuweist
    und diese dann als Dezimalzahl also mit
    printf("n.Wert: %d\n", wert);

     int x;
    
     printf("Geben Sie x ein :");
     scanf("%d" ,&x);
    
     if (x < 0 && 5 <= x && x <= 30) // Der Wert der Variable x ist negativ und zugleich auch der Wert der Variablen y.


  • @Mxrvin sagte in Logische Operatoren:

    Der Wert der Variable x ist negativ und zugleich auch der Wert der Variablen y.

    das sagt nicht dasselbe aus wie auch von Dir weiter oben:

    @Mxrvin sagte in Logische Operatoren:

    ob Wert der Variablen x negativ ist, aber zugleich auch
    der Wert der Variablen y im Intervall [5,30] liegt:



  • ich komme nicht mehr klar bin bei der 6. kann nicht die if Bedingung formulieren

    ob der Wert der char-Variablen antwort
    weder das Zeichen ’j’ noch das Zeichen ’J’ enthält:
    (für antwort = ’A’)


  • Mod

    Wie würdest du es machen, wenn die Frage wäre, ob ein int weder gleich 5 noch gleich 17 wäre?



  • @SeppJ if ( x !=5 ) && ( x != 17)


  • Mod

    Genau. Und wieso hast du nun Angst, bloß weil da char statt int steht und 'j' statt 5?


  • Gesperrt

    @Mxrvin sagte in Logische Operatoren:

    ich komme nicht mehr klar bin bei der 6. kann nicht die if Bedingung formulieren

    ob der Wert der char-Variablen antwort
    weder das Zeichen ’j’ noch das Zeichen ’J’ enthält:
    (für antwort = ’A’)

    Probier mal:
    if ((zeichen | 0x20) == 'j')
    {
    ... J oder j
    }

    müsste für ASCII hinhauen.


  • Mod

    Bloß nicht! In welcher Welt ist das ein guter Tipp? Um eine viertel Nanosekunde zu sparen für den Preis jedweder Wartbarkeit? Falls das denn nach Optimierung überhaupt weniger Aktionen sind als der offensichtliche Weg. Wenn das Programm 50 Trillionen mal diese Entscheidung treffen muss, können wir mal darüber reden.



  • @RBS2 sagte in Logische Operatoren:

    Probier mal:
    if ((zeichen | 0x20) == 'j')
    {
    ... J oder j
    }

    müsste für ASCII hinhauen.

    Nicht gerade eine intuitive Lösung...



  • spart man da überhaupt rechenzeit? also wenn ich schreibe if(zeichen == 'J' || zeichen == 'j') dann wird die zweite bedingung doch gar nicht mehr ausgewertet, wenn die erste erfüllt ist bzw. es wird nur eine vergleichsoperation ausgeführt, während bei if((zeichen | 0x20) == 'j') immer eine rechenoperation und eine vergleichsoperation ausgeführt werden. oder sehe ich das falsch?



  • @Wade1234 Compiler können viele Dinge optimieren. Man weiß in keinem der Fälle, was genau passiert, ohne den Assembleroutput anzuschauen. Man könnte ja auch denken, dass (eingabe == 'j') | (eingabe == 'J') schneller wäre, weil dann beide Vergleiche gleichzeitig passieren können und man das nicht wiw bei || nacheinander machen muss. Aber der Compiler (bzw. der Optimierer) wird hier kann das eh so ändern, dass es für ihn am besten aussieht. Man kann deine Frage also ohne Nennung des Compilers und der Compilerparameter nicht beantworten. Und ob es Zeit spart, ist noch eine andere Frage, die auch vom Zielsystem abhängig ist.



  • ja dass compiler optimieren können, ist mir grundsätzlich klar, aber fakt ist doch, dass bei der einen möglichkeit nur manchmal und bei der anderen immer 2 operationen durchgeführt werden müssen, oder nicht?



  • @Wade1234
    Es kann optimiert werden, wenn die erste Bedingung falsch ist und die zweite überprüft werden muss. Ich habe vorgestern noch den Vortrag Fastware von Alexei Alexandrescu gesehen, wo er sich mit dieser Mikrooptimierung befasst. Er meinte auch, dass die bitweise Verknüpfung schneller sein könnte als die logische, weil das von der CPU parallelisiert werden kann. Er wurde dann vom Compiler (gcc, Version wurde nicht genannt) überrascht, dass der aus beiden Varianten den Assemblercode für die bitweise Verknüpfung erzeugt wurde. Konnte ich im Compiler Explorer aber nicht nachvollziehen.



  • @DocShoe
    ja aber ich wollte ja darauf hinaus, dass die zweite bedingung gar nicht mehr ausgewertet werden muss (und nach meinem wissen auch nicht ausgewertet wird), wenn die erste wahr ist und dass sich eigentlich dadurch schon eine zeitersparnis ergibt. völlig unabhängig von irgendwelchen weiteren optimierungen.



  • @Wade1234
    Ne.
    Wenn die erste Bedingung wahr ist darf die zweite nicht mehr überprüft werden, dann ist die zweite egal. Wenn die erste aber falsch ist muss die zweite überprüft werden, und wenn das erst passiert nachdem die erste überprüft wurde, dauert´s tatsächlich länger. Wenn der Compiler aber Code erzeugt, durch den beide Bedingungen gleichzeitig überprüft werden können, sollte der Code tatsächlich schneller sein, wenn die erste Bedingung falsch ist und das Ergebnis der zweiten schon bestimmt wurde.


  • Gesperrt

    @It0101 sagte in Logische Operatoren:

    @RBS2 sagte in Logische Operatoren:

    Probier mal:
    if ((zeichen | 0x20) == 'j')
    {
    ... J oder j
    }

    müsste für ASCII hinhauen.

    Nicht gerade eine intuitive Lösung...

    Kommt wohl auf die Person an, die den Code liest. Für alle verständlicher ist sicherlich:

    if (tolower(zeichen) == 'j') {...}  // true bei großem und kleinem j
    

Anmelden zum Antworten