Forum: Compiler & IDEs Anfängerfrage zum negieren


von Felix (Gast)


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.

von Bob (Gast)


Lesenswert?

nein

von Ellen Moore (Gast)


Lesenswert?

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.

von Felix (Gast)


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.

von Der kernige Ridschie (Gast)


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

von skorpionx (Gast)


Lesenswert?

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?

von Der kernige Ridschie (Gast)


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.

von Kaj (Gast)


Lesenswert?

skorpionx schrieb:
> ist wahr wenn flag eine ZAHL ist die nicht 0 ist

Das Stimmt so nicht ganz.
In C/C++ ist ALLES wahr was NICHT 0 ist, bzw. es ist JEDER Wert wahr, 
der nicht als 0 interpretiert werden kann.

Grüße

von Felix (Gast)


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?

von Kaj (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

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

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

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

von Felix (Gast)


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?

von B. S. (bestucki)


Lesenswert?

Felix schrieb:
> Danach hat Flag immernoch den Wert1 und der if-Zweig wird nicht
> angesprungen, richtig?

Ja. Um den Wert einer Variable zu verändern und wieder zu speichern, 
benötigst du in C immer ein = (nicht 2), mit Ausnahme von ++ und --

von Falk B. (falk)


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 . . .

von Kaj (Gast)


Lesenswert?

Falk Brunner schrieb:
> Eben dieses Wort ist in diesem Sinn absolut unüblich

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

Grüße

von B. S. (bestucki)


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.

von Falk B. (falk)


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

von Der kernige Ridschie (Gast)


Lesenswert?

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

Deine beiden Varianten sind ja auch gleich, wenn es sich bei 'flag' um 
eine Variable handelt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.