Hallo,
kann mir mal jemand erklären was diese Codezeile genau bedeutet, komm
nucht dahinter was dieses ? 0:1 fuer eine Aufgabe hat.
U8 swap = (dx > dy) ? 0 : 1;
gruß,
Bjoern
Ein Compiler, bei dem das Ergebnis einer Vergleichsoperation nicht
entweder 0 oder 1 ist, ist defekt bzw. enthält einen ziemlich groben
Verstoß gegen die ISO-Norm.
hat jemand zufällig einen link parat, wo man "abkürzungen" wie die oben
genannte mal nachlesen kann - sieht zwar etwas kryptisch aus, aber
interessiere würde mich ja doch mal, was es noch alles so in dieser
richtung gibt...
ich&er wrote:
> hat jemand zufällig einen link parat, wo man "abkürzungen" wie die> oben genannte mal nachlesen kann - sieht zwar etwas kryptisch aus,> aber interessiere würde mich ja doch mal, was es noch alles so in> dieser richtung gibt...
Naja, im C-Standard oder dem C-Tutorial deines geringsten Misstrauens.
Den Standard muss man kaufen, der letzte öffentlich verfügbare Entwurf
des C99-Standards lässt sich unter dem Namen ISO-C-FDIS.1999-04.pdf
ergugeln.
Es ist übrigens nicht nur ,,für Faule'', sondern eignet sich, da es
ein Operator ist, auch für solche Fälle, in denen man kein komplettes
statement haben kann. Ein typischer Fall ist innerhalb einer
for-Anweisung:
1
for(c=0;c<max_c();c<99?c+1:0){
2
...
3
}
Wie so oft bei C: use with caution. Sinnvoll angewandt, kann man mit
solchen Operatoren die Lesbarkeit von Programmen durchaus verbessern.
Man kann aber auch schnell Kandidat für den obfuscated C code contest
werden...
Vor 30 Sekunden geschrieben:
newItem.SubItems.Add( melderMsg.Sprinkler ? "Ja" : "Nein" );
melderMsg.Sprinkler ist ein bool. Je nachdem ob der true
oder false ist, wird entweder der Text "Ja" oder "Nein"
eingefügt.
> Ein Compiler, bei dem das Ergebnis einer Vergleichsoperation nicht> entweder 0 oder 1 ist, ist defekt bzw. enthält einen ziemlich groben> Verstoß gegen die ISO-Norm.
Stimmt so nicht ganz.
Laut kernighan & ritchie "The C Programming Language" ist falsch als 0
definiert und richtig als != falsch.
true ist also im Gegensatz zur landläufigen Meinung nicht als 1
definiert!
K&R haben C gegen Ende der 60er auf einer PDP-7e zu designen begonnen.
Das ganze ist also extrem assemblernahe entstanden. Von da her ist es
klar, daß man ein einfaches DEC assembler JMPZ bzw JMPNZ verwendet
hatte.
Und ein JMPNZ (jump if non zero, also wenn Z flag nicht gesetzt ist) ist
nicht ident mit einem CMP 1,r; JMPEQ
>> Ein Compiler, bei dem das Ergebnis einer Vergleichsoperation nicht>> entweder 0 oder 1 ist, ist defekt bzw. enthält einen ziemlich groben>> Verstoß gegen die ISO-Norm.>> Stimmt so nicht ganz.
Doch. Ich hab's extra vorher nochmal nachgelesen, um auch ganz sicher zu
sein.
> true ist also im Gegensatz zur landläufigen Meinung nicht als 1> definiert!
Das hat aber nichts mit dem Ergebnis von Vergleichsoperatoren zu tun,
sondern nur damit, als was ein Integer gewertet wird, wenn er in einer
booleschen Operation verwendet wird.
Hier mal ein Auszug aus C99 zu den oben von mir verwendeten Operatoren:
6.5.8 Relational operators
6 Each of the operators < (less than), > (greater than), <= (less than
or equal to), and >= (greater than or equal to) shall yield 1 if the
specified relation is true and 0 if it is false. The result has type
int.
6.5.3.3 Unary arithmetic operators
5 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).
> btw, zum Üben ein kleines Schmankerl aus meiner Vergangenheit:>> for(int i=0;do_something();printf("%c\r","\\|/-"[++i%4]);
Das könnte man auch kürzer schreiben :-)
for(int i=0;do_something();printf("%c\r","\\|/"[++i%4]);
Rolf hat recht, der Compiler muß immer 1 zurückgeben, wenn er etwas als
wahr ansieht.
Selber kann man ihm aber alles ungleich 0 geben und er muß es als wahr
behandeln.
Dieser Ausdruck läßt sich daher nicht kürzen:
@Karl Heinz: Wenn du das '-' verschluckst, dann wird nie ein Propeller
draus wie man ihn zB vom alten DOS zip kennt ;)
> "\\|/-"
ist ja nur ein String vulgo ein char array aus den Buchstaben \, |, /
und - .
das
>[++i%4]
nimmt also den um 1 erhöhten Wert von i Modulo 4 (%4) also immer den
0. => \
1. => |
2. => /
3. => -
0. => \
usw
character.
das \r im printf setzt den screenbuffer in der gleichen Zeile an den
Anfang zurück und überschreibt so das vorige Zeichen immer.
> >> for(int i=0;do_something();printf("%c\r","\\|/-"[++i%4]);>> Das könnte man auch kürzer schreiben :-)>> for(int i=0;do_something();printf("%c\r","\\|/"[++i%4]);
Fehlt da nicht eine schließende Klammer?
> @Karl Heinz: Wenn du das '-' verschluckst, dann wird nie ein Propeller> draus wie man ihn zB vom alten DOS zip kennt ;)
Ich hab den Backslash übersehen.
Sorry.
> btw: auf windows boxen wird das wohl nix mit printf, da müßt ihr> wahrscheinlich cprintf nehmen.
Nö. printf landet, ganz so wie es sich gehört und wie es unter anderen
Betriebssystemen auch ist, in einem Konsolenfenster. Das muss für
GUI-Anwendungen nötigenfalls angelegt werden, aber das war's dann auch
schon.