Wahrscheinlich banale Frage zu C

Gast #921048
Lesenswert?

Ich hab da eine wahrscheinlich einfache Frage zu einer Codezeile in C. 
Wenn ich schreibe:
1
uint8_t x;
2
uint8_t y;
3
...
4
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
Gast #921092
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).
Gast #921104
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.
1
uint8_t x;
2
uint8_t y;
3
...
4
x = (y > 0);

könnte also auch so geschrieben werden
1
uint8_t x;
2
uint8_t y;
3
...
4
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.
#921133
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
Gast #921243
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
1
   unsigned short x,y;
2
   y=45;
3
   x=!!y;
dass anschliessend x==1 wäre.


Ist irgendwo definiert, dass !0 == 1 ist?
Oder macht das der Compiler gefallenhalber?
#921316
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."
#921501
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...;-)
Persönliche Seite #921503
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

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