www.mikrocontroller.net

Forum: Compiler & IDEs Wahrscheinlich banale Frage zu C


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab da eine wahrscheinlich einfache Frage zu einer Codezeile in C. 
Wenn ich schreibe:
uint8_t x;
uint8_t y;
...
x = (y > 0);

Ist dann wirklich x = 1 wenn y grösser als 0 ist und sonst x = 0? In C 
gibt es ja kein Boolean, da bin ich mir bei den Datentypen nicht ganz 
sicher.

Danke für Eure Antworten.
Gruss
Patrick

Autor: Ulrich aus W (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Patrick

>Ist dann wirklich x = 1 wenn y grösser als 0 ist und sonst x = 0?

Ja.

Aber!
Ich würde das nie in C so schreiben.
Hier bietet sich das ?: Operatorpaar an.

x = ( y > 0 ) ? 1 : 0;

Wenn die Bedingung zutrifft, wird x true (also ungleich 0)
zugeordnet sonst false (0).

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Deine Antwort!
Dieses Operatorpaar kannte ich bis anhin noch gar nicht. Dann werde ich 
es so schreiben.

Man lernt nie aus ;-)

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
x ist dann ungleich null, wenn y grösser als 0 ist.
Wenn y = 0 ist, dann ist x = 0.
Negative Zahlen (kleiner 0) gibt es nicht, wir sind hier unsigned.
uint8_t x;
uint8_t y;
...
x = (y > 0);

könnte also auch so geschrieben werden
uint8_t x;
uint8_t y;
...
x = y;

In C gibt es nur die Null. Die anderen Zustände sollten davon abgeleitet 
werden, dann kann der Compiler machen (und optimieren), was er will. Ein 
ungleich Null ist daher nicht zwingend eine Eins. Ob eine !0 (nicht 
null) eine 1 (eins) oder ein 0xFF (viele einsen) ist, hängt dann von der 
Zielarchitektur ab.

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder so:
x = !!y;

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lkmiller wrote:

> In C gibt es nur die Null. Die anderen Zustände sollten davon abgeleitet
> werden, dann kann der Compiler machen (und optimieren), was er will. Ein
> ungleich Null ist daher nicht zwingend eine Eins. Ob eine !0 (nicht
> null) eine 1 (eins) oder ein 0xFF (viele einsen) ist, hängt dann von der
> Zielarchitektur ab.


Nö, der Compiler muß immer 1 zurückgeben, wenn ein Ausdruck wahr ist.

Umgekehrt geht es aber: jeder Ausdruck != 0 ist wahr.


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lkmiller wrote:
>
> könnte also auch so geschrieben werden
>

kommt drauf an wie's dann weitergeht.
Unter Umständen kann man das nämlich nicht auch so schreiben.

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>kommt drauf an wie's dann weitergeht.
Ja, ich habe es mir einfach gemacht,
denn nach dem Codeschnipsel gehts nicht mehr weiter ;-)

Ich habe jetzt mal 3 Compiler befragt
(x86: Zortech und MSVisualC++, Xscale: Intel) und alle drei sagen zu
   unsigned short x,y;
   y=45;
   x=!!y;
dass anschliessend x==1 wäre.


Ist irgendwo definiert, dass !0 == 1 ist?
Oder macht das der Compiler gefallenhalber?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lkmiller wrote:
> Ist irgendwo definiert, dass !0 == 1 ist?
Wie alles andere auch: Im C-Standard... Da steht, dass eine logische 
Operation 0 zurückliefert, wenn ihr Ergebnis false ist und 1, wenn es 
true ist.

Hab den Standard nicht hier, aber den K&R:
"By definition, the numeric value of a relational or logical expression 
is 1 if the relation is true, and 0 if the relation is false. The unary 
negation operator ! converts a non-zero operand into 0 and a zero 
operand into 1."

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johannes M.
>numeric value ... is 1

Danke, das wars ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
Patrick wrote:
> In C
> gibt es ja kein Boolean, ...

In C99 gibt es bool, wenn man <stdbool.h> includiert hat, und dann
gibt es auch true und false.

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in c kann alles includiert werden.

es gibt kein standert in c ausser die grundreferenz von einpaar 
festgelegten begriffen aus dem jahre domini wo bist du.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
neuer wrote:
> in c kann alles includiert werden.
>
> es gibt kein standert in c ausser die grundreferenz von einpaar
> festgelegten begriffen aus dem jahre domini wo bist du.

Ich verstehe nix von dem, was du geschrieben hast. Ein paar Kommas und 
Groß-/Kleinschreibung könnte da helfen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. wrote:
> Ich verstehe nix von dem, was du geschrieben hast. Ein paar Kommas und
> Groß-/Kleinschreibung könnte da helfen.
Also bitte, Simon! Du kannst doch nicht von einem Troll erwarten, dass 
er Groß- und Kleinschreibung benutzt oder gar andere Forenregeln 
beachtet! Tststs...;-)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Simon K. wrote:
>> Ich verstehe nix von dem, was du geschrieben hast. Ein paar Kommas und
>> Groß-/Kleinschreibung könnte da helfen.
> Also bitte, Simon! Du kannst doch nicht von einem Troll erwarten, dass
> er Groß- und Kleinschreibung benutzt oder gar andere Forenregeln
> beachtet! Tststs...;-)

Hm, stimmt! ;)

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.