Anfängerfrage zum negieren

Gast #3226005
Lesenswert?

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 #3226322
Lesenswert?

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 #3226330
Lesenswert?

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 #3226360
Lesenswert?

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 #3226452
Lesenswert?

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 #3226518
Lesenswert?

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 #3226596
Lesenswert?

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?
#3226631
Lesenswert?

@ 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 . . .
#3226689
Lesenswert?

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.
#3227001
Lesenswert?

@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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren