Forum: Compiler & IDEs Was bedeutet dieser C Source


von Bjoern B. (tishima)


Lesenswert?

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

von Magnus Müller (Gast)


Lesenswert?

IF für schreibfaule Programmierer.
1
unsigned char swap;
2
if(dx>dy)
3
  swap = 0;
4
else
5
  swap = 1;

Gruß,
Magnetus

von ... (Gast)


Lesenswert?

ergebnis = bedingung ? wert wenn bedingung wahr : wert wenn bedingung 
flasch;

in diesem fall:
swap = 0, wenn dx > dy
swap = 1, wenn dx <= dy

von Magnus Müller (Gast)


Lesenswert?

schnellerwar ;)

By the way:

U8 wurde zuvor höchstwahrscheinlich durch ein

   #define U8 unsigned char

definiert.

Gruß,
Magnetus

von Rolf Magnus (Gast)


Lesenswert?

Eigentlich ist
1
U8 swap = (dx > dy) ? 0 : 1;

auch äquivalent zu:
1
U8 swap = !(dx > dy);

oder
1
U8 swap = (dx <= dy);

  

von Bjoern B. (tishima)


Lesenswert?

Danke,
jetzt jetzt hab ichs geschnallt.

gruß,
Bjoern

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

@Rolf: Das kommt aber auch auf den Compiler an. Nicht bei jedem ist 
"True" = 1.

von Rolf Magnus (Gast)


Lesenswert?

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.

von ich&er (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von Mark S. (struberg)


Lesenswert?

> 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

von Mark S. (struberg)


Lesenswert?

btw, zum Üben ein kleines Schmankerl aus meiner Vergangenheit:

> for(int i=0;do_something();printf("%c\r","\\|/-"[++i%4]);


have fun ;)

von FBI (Gast)


Lesenswert?

spinner :)

von Rolf Magnus (Gast)


Lesenswert?

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

von Peter S. (psavr)


Lesenswert?

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

von Karl heinz B. (kbucheg)


Lesenswert?

> 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]);



von Peter D. (peda)


Lesenswert?

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
x = !!y;

Z.B. wenn y = 7, dann ist x = 1

Peter

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

... und wieder was gelernt.

von Mark S. (struberg)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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



von Mark S. (struberg)


Lesenswert?

yup die abschließende Klammer hab ich versemmelt.

von Mark S. (struberg)


Lesenswert?

btw: auf windows boxen wird das wohl nix mit printf, da müßt ihr 
wahrscheinlich cprintf nehmen.

von Karl heinz B. (kbucheg)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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



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.