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 "~"
 

cwriter

Erfahrenes Mitglied
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
 

Zvoni

Erfahrenes Mitglied
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?
 

Technipion

Erfahrenes Mitglied
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
 

Zvoni

Erfahrenes Mitglied
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
 

Forum-Statistiken

Themen
272.355
Beiträge
1.558.612
Mitglieder
187.829
Neuestes Mitglied
AlDi31