mikrocontroller.net

Forum: Compiler & IDEs Was bedeutet dieser C Source


Autor: Bjoern Buettner (tishima)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IF für schreibfaule Programmierer.
unsigned char swap;
if(dx>dy)
  swap = 0;
else
  swap = 1;

Gruß,
Magnetus

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ergebnis = bedingung ? wert wenn bedingung wahr : wert wenn bedingung 
flasch;

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

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schnellerwar ;)

By the way:

U8 wurde zuvor höchstwahrscheinlich durch ein

   #define U8 unsigned char

definiert.

Gruß,
Magnetus

Autor: Rolf Magnus (Gast)
Datum:

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

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

oder
U8 swap = (dx <= dy);

  

Autor: Bjoern Buettner (tishima)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,
jetzt jetzt hab ichs geschnallt.

gruß,
Bjoern

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ich&er (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
for (c = 0; c < max_c(); c < 99? c + 1: 0) {
  ...
}

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
btw, zum Üben ein kleines Schmankerl aus meiner Vergangenheit:

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


have fun ;)

Autor: FBI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spinner :)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Peter S. (psavr)
Datum:

Bewertung
0 lesenswert
nicht 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/maste...

Ich verwend es oft, denn meistens finde ich hir in kürze die Infos die 
ich suche...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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]);



Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
x = !!y;

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

Peter

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und wieder was gelernt.

Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?



Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yup die abschließende Klammer hab ich versemmelt.

Autor: Mark Struberg (struberg)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.



Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.