C - Kann mir das jemand erklären?

Zvoni

Erfahrenes Mitglied
OK,

kann mir mal jemand erklären, was ein C-Programm(ierer) hiermit bezwecken will?
C:
EinZeiger->EineVariable = !!WasAnderes;
Zweimal "!"?
Zweimal logisches Nicht?
Huh?
Euch C-lern ist schon klar dass eine doppelte Verneinung eine sprachliche Untat ist? ;):sneaky:
Und ja, der Unterschied zwischen "&" <-> "&&" bzw. "|" <-> "||" ist mir auch klar, aber das bitweise Nicht ist in C die Tilde "~"
 
kann mir mal jemand erklären, was ein C-Programm(ierer) hiermit bezwecken will?
Aus dem Standard
The result of the logical negation operator ! is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
The expression !E is equivalent to (0==E).
D.h. das logische not ! ist anders als das binäre not (~) nicht umkehrbar.

In diesem Falle stellt es sicher, dass der erhaltene Wert 0 ist, falls die Eingabe 0 war, und sonst 1.
Ein if könnte dasselbe tun (if(x == 0) y = 0; else y = 1; ), aber das könnte Jumps/Branches verursachen, die man nicht haben will.

Gruss
cwriter
 
Nur um zu schauen ob ich es verstanden habe:
Code:
binäres "Not" ~
"0101 0101" --> "~" anwenden --> "1010 1010" --> "~" anwenden --> "0101 0101" --> Urzustand

logisches "Not" !
"0101 0101" --> "!" anwenden --> "0000 0000" --> "!" anwenden --> "1111 1111"
So im Prinzip richtig?
 
So im Prinzip richtig?
Das logische Nicht orientiert sich imho nur an logisch WAHR und FALSCH. Ausschließlich der Wert 0 gilt als logisches FALSCH, alle anderen Werte gelten als logisches WAHR.

Also int i = 2; ist WAHR, nur i = 0; wäre FALSCH. Und das logische Nicht negiert diesen Zustand.
Nimmt man also 0101 0101 = 85 = WAHR, dann ist ! 0101 0101 = FALSCH = 0000 0000. Soweit so gut. Negieren wir jetzt aber nochmal:
0000 0000 = FALSCH → ! 0000 0000 = WAHR = 0000 0001, weil 1 der vom Compiler für WAHR verwendete Wert ist.

Jedenfalls denke ich, dass es so ist. Habe zu Testzwecken mal dieses Snippet hier geschrieben. Auch weil mich interessiert hat, ob es für sowas einen Anwendungsfall geben könnte.
C:
#include <stdio.h>


int main()
{
    float values[] = { 0.0f, -1.0f, 1.5f, 0.5f, -1.5f, 1.2f, -0.2f };
    
    // Frage: Enthält values Elemente > 1.0 ?
    int hits = 0;
    
    for (int i = 0; i < (sizeof(values) / sizeof(float)); i++) {
        if (values[i] > 1.0f)
            hits++; // Wir addieren die Treffer der Einfachheit halber
    }
    
    // Reduziere auf Wertebereich {0, 1} :
    int values_overflow = !!hits;   // <-- äquivalent?
//  int values_overflow = hits > 0; // <-⸍
    
    printf("int values_overflow = %d\n", values_overflow);
    
    if (values_overflow)
        printf("Overflow detected!\n");
    else
        printf("No overflow detected.\n");
    
    return 0;
}

Bleibt aber immer noch zu klären, ob man nicht auch einfach i > 0 statt !!i schreiben könnte :unsure:

Gruß Technipion
 
Bleibt aber immer noch zu klären, ob man nicht auch einfach i > 0 statt !!i schreiben könnte :unsure:

Gruß Technipion
Wenn schon dann i<>0 (bzw. in C: "i !=0")

Ausserdem glaube ich mich aus meinen VB6-Tagen daran zu erinnern,
dass ein Boolean im Prinzip ein typeDef für einen signed Integer32 war,
und dass für einen Boolean-Type galt:
False = 0x0000 0000
True = 0xFFFF FFFF
 
Zurück