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
Gast
#443660
IF für schreibfaule Programmierer.
1 | |
2 | |
3 | |
4 | |
5 | |
Gruß, Magnetus
Gast
#443662
ergebnis = bedingung ? wert wenn bedingung wahr : wert wenn bedingung flasch; in diesem fall: swap = 0, wenn dx > dy swap = 1, wenn dx <= dy
Gast
#443669
schnellerwar ;) By the way: U8 wurde zuvor höchstwahrscheinlich durch ein #define U8 unsigned char definiert. Gruß, Magnetus
Gast
#443695
Eigentlich ist
1 | |
auch äquivalent zu:
1 | |
oder
1 | |
Danke, jetzt jetzt hab ichs geschnallt. gruß, Bjoern
Gast
#443750
@Rolf: Das kommt aber auch auf den Compiler an. Nicht bei jedem ist "True" = 1.
Gast
#443997
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.
Gast
#444006
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 | |
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
btw, zum Üben ein kleines Schmankerl aus meiner Vergangenheit:
> for(int i=0;do_something();printf("%c\r","\\|/-"[++i%4]);
have fun ;)
Gast
#445954
spinner :)
Gast
#445987
>> 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).
Anbei hab ich noch nen Link zur UNI Bern mit einem guten Online Nachschlagwerk zu C... http://www.phim.unibe.ch/comp_doc/c_manual/C/master_index.html Ich verwend es oft, denn meistens finde ich hir in kürze die Infos die ich suche...
> 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:
1 | |
Z.B. wenn y = 7, dann ist x = 1 Peter
Gast
#446141
... und wieder was gelernt.
@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?
yup die abschließende Klammer hab ich versemmelt.
btw: auf windows boxen wird das wohl nix mit printf, da müßt ihr wahrscheinlich cprintf nehmen.
> @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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.