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