Was bedeutet dieser C Source

Gast #444006
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...
Moderator Persönliche Seite #444014
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...
#445950
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
Gast #445987
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).
#446130
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
#446156
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren