Anfängerfrage zum negieren

Gast #3226005
Hallo,

Macht es in C einen Unterschied ob ich schreibe:
1
if (!flag){
2
  // tue was
3
}

Oder
1
if (!(flag)){
2
  // tue was
3
}

Mein Progamm hat nicht das gemacht, was es soll. Nach einigen 
(blöderweise mehreren Korrekturen) geht es nun. Nun ist aber mein 
Problem, herauszufinden woran es lag. Eine Änderung war die obige vom 1. 
Vorschlag in den 2.

Danke.
Gast
Es wäre wichtig zu wissen was flag ist. Wenn Flag ein #define ist, 
könnte es auch so etwas sein:

#define flag a + b, und dann sieht die ganze sache schon wieder anders 
aus.
Gast
Achso ähm ja klar. Das Flag ist im Prinzip nur eine boolsche Abfrage 
(die es ja so in C nicht gibt). Aber entweder hat das Flag den Wert 0 
und damit false oder den Wert 1 und damit true. Bei C ist ja alles 
ungleich 0 true.
Gast
Felix schrieb:
> Hallo,
>
> Macht es in C einen Unterschied ...

Wie Ellen schon schreibt, in deinem Fall würde es nur dann einen 
Unterschied machen, wenn 'flag' ein 'define' wäre und der 
Negationsoperator sich nur auf einen Teil dieses 'define's auswirken 
würde.

Setze soviel Klammern, wie du willst, um deutlich zu machen, was du 
willst. Klammern zuviel gesetzt schaden nicht, sondern sind das, was man 
defensive Programmierung nennt.

Um dir solche Fragen in Zukunft selbst beantworten zu können, sieh dir 
die Rangfolge der Operatoren an, z.B. hier:
http://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorit%C3%A4t
Gast
skorpionx schrieb:
> if(flag) ist wahr wenn flag eine ZAHL ist die nicht 0 ist.
> Was macht "C" mit "!flag". Werden dann einzelne Bits der Zahl flag
> geändert?

Das ! ist ein logischer Operator. Der Ausdruck !flag ist wahr, wenn flag 
= 0 ist und falsch, wenn flag ungleich 0 ist.
Für die bitweise Negation ist der ~ Operator zuständig.

--> Vorsicht, deshalb immer aufpassen, ob logische oder arithmetisch 
Verknüpfung gewünscht ist.
Gast
Der kernige Ridschie schrieb:
> Das ! ist ein logischer Operator. Der Ausdruck !flag ist wahr, wenn flag
> = 0 ist und falsch, wenn flag ungleich 0 ist.
> Für die bitweise Negation ist der ~ Operator zuständig.
>
> --> Vorsicht, deshalb immer aufpassen, ob logische oder arithmetisch
> Verknüpfung gewünscht ist.

Ok, aber was hat das mit der obigen Klammersetzung zu tun? Dann wäre es 
doch gleich?
Gast
Felix schrieb:
> Dann wäre es doch gleich?

Für die Klammersetzung ist es in DIESEM Fall egal.

Zur Klammersetzung:
if( !(flag)) -> es wird der gesamt Ausdruck in den Klammern logisch 
vernichtet.

if( (!flag)) -> es wird nur der Ausdruck flag vernichtet.


Das Ergebnis von ! und ~ sind aber andere.
Folgende veranschaulichung: (zur einfachheit auf 8-bit begrenzt)
flag enthält den Zahlenwert 1, also Binär: 00000001

Die ~ macht daraus Binär ein: 11111110, weil jedes Bit umgedreht wird.
Das ! macht daraus ein: 00000000, weil es den logisch wahren Ausdruck 
vernichtet.
Gast
Ok, soweit verstanden.

Der Wert von Flag bleibt aber bestehen oder?
Also angenommen Flag wird der Wert 1 zugewiesen und dann dies hier 
ausgeführt:
1
if (!Flag)

Danach hat Flag immernoch den Wert1 und der if-Zweig wird nicht 
angesprungen, richtig?
@ Karl Heinz Buchegger (kbuchegg) (Moderator)

>Nur damit in Keys Ausführungen kein Missverständnis aufkommt.

>"vernichtet" meint die Anwedung der Operation 'nicht'.

Warum sagst du dann nicht einfach invertieren oder gar ganz klassisch 
deutsch umkehren.

>Es ist keineswegs damit gemeint, dass der Ausdruck (Also: flag) in
>irgendeiner Form zerstört wird.

Eben dieses Wort ist in diesem Sinn absolut unüblich, wahrscheinlich 
gibt es das nicht mal im Duden. In einem anderen Sinn ist diese Wort in 
der deutschen Geschichte und Sprachgebrauch des öfteren zu finden . . .
Kaj schrieb:
> verUNDen, verODERn, verNICHTen...
> War in meinem Studium völlig normal dieser Sprach gebrauch, nicht nur
> von Studenten, sondern auch von Dozenten.

Bei verUNDen und verODERn kann man sich noch vorstellen, was du meinst. 
verNICHTen hat aber in der Deutschen Sprache eine ganz andere Bedeutung 
und ist daher nicht eindeutig, bzw. wird missverstanden.

Bei solchen Sachen verwende ich meist die "lange" Form:
- Arithmetische UND-Verknüpfung
- Logische ODER-Verknüpfung
- usw.
@Kaj (Gast)

>> Eben dieses Wort ist in diesem Sinn absolut unüblich

>verUNDen, verODERn,

Wurde bei uns auch verwendet, ist aber auch nicht sonderlich schön.

>verNICHTen...

NICHT im Zusammenhang mit Digitallogik.

>War in meinem Studium völlig normal dieser Sprach gebrauch, nicht nur
>von Studenten, sondern auch von Dozenten.

Technikersprache ist manchmal grausam schlecht. Und dass nur allzuoft 
ohne Grund, es gibt überaus gute Worte dafür.

UND/Oder-Verknüpfung, Invertierung, Inversion, Negation.

NICHT ist nichts. Nicht-Gatter, diese Bezeichnung fand ich schon immer 
nichtig, ähhh unbrauchbar. 8-0

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.