Hallo Forengemeinde,
ich versuche eine Variable bei jedem Programmdurchlauf zwischen 1 und 0
hin und her zu wechseln.
while(1) {
Boolean = Boolean + 1
switch (Boolean)
{
case 0:
mache etwas
break;
case 1:
mache etwas anderes
break;
}
}
Jetzt lese ich jedoch hier:
http://rn-wissen.de/wiki/index.php/C-Tutorial#Boolean_.28Logische_Variablen.29
das es solche Wahrheitstypen nicht gibt.
Wie macht man es denn dann mit "int"? Kann mir das jemand bitte an einem
kleinen Beispiel mal zeigen?
MfG Paul
Die Antwort steht praktisch in dem Link, den du selber gepostet hast:
int a;
if (a) {printf("a ist TRUE")} // hat gleiche Wirkung wie
if (a!=0) {printf("a ist TRUE")}
Also: Integerausdruck = 0 ist FALSE
Integerausdruck !=0 ist TRUE
MfG Nils
Das Tutorial ist sehr alt oder bezieht sich auf veraltete¹ Compiler.
bool gibt es schon länger in <stdbool.h>
Wenn man bool will und der Compiler bool kann, sollte man bool nehmen,
statt ein umständliches Ersatzkonstrukt zu bauen.
1
#include<stdbool.h>
2
#include<stdio.h>
3
4
intmain(void)
5
{
6
boolled_is_on=false;
7
for(inti=0;i<10;++i)
8
{
9
if(led_is_on)
10
{
11
printf("an\n");
12
}
13
else
14
{
15
printf("aus\n");
16
}
17
led_is_on=!led_is_on;
18
}
19
return0;
20
}
¹gerade kommerzielle Embedded-Compiler brauchen ca. 20 Jahre länger als
der Rest der Welt, um Sprachstandards umzusetzen.
Tom schrieb:> Wenn man bool will und der Compiler bool kann, sollte man bool nehmen,> statt ein umständliches Ersatzkonstrukt zu bauen.
Ja, vor allem weil so etwas:
Paul schrieb:> while(1) {> Boolean = Boolean + 1
nicht nur nicht den gewünschten Effekt hat, sondern in Bälde einen
Überlauf liefern wird.
Paul schrieb:> led_is_on = !led_is_on
Achtung! Der Tipp galt für boolean. Mit int geht das auch, ist aber
unsauber: es wird einer Ganzzahl ein Wahrheitswert zugewiesen.
lrep schrieb:>> Boolean = Boolean + 1>> nicht nur nicht den gewünschten Effekt hat, sondern in Bälde einen> Überlauf liefern wird.
nein macht es nicht. In einer Rechnung liefert ein bool immer 0 oder 1
zurück. Damit bleibt es auf 1.
Marc V. schrieb:> echter MSPler schrieb:>> int value = 0;>> ...>> value = 1 - value; // toggle value>> LOL.> Schuster, bleib bei deinem Leisten.
Was ist daran so verkehrt?
jo mei schrieb:> Marc V. schrieb:>> echter MSPler schrieb:>>> int value = 0;>>> ...>>> value = 1 - value; // toggle value>>>> LOL.>> Schuster, bleib bei deinem Leisten.>> Was ist daran so verkehrt?
Author.
echter MSPler schrieb:> ist aber> unsauber: es wird einer Ganzzahl ein Wahrheitswert zugewiesen.
Wieso das?
In C ist es klar definiert, dass
!(ungleich 0) == 0
und
0! == 1
ist.
jo mei schrieb:> Marc V. schrieb:> echter MSPler schrieb:> int value = 0;> ...> value = 1 - value; // toggle value>> LOL.> Schuster, bleib bei deinem Leisten.>> Was ist daran so verkehrt?
Nix und sogar typsicher. Im Profibereich eine Standardlösung.
Peter II schrieb:> braucht man aber nicht> x = ~x
Dann togglet aber jedes bit von x und nicht nur das LSB.
Also z.B. 1 <--> -2 oder 0 <--> -1.
So würde es aber gehen:
c-hater-hater schrieb:> Peter II schrieb:> braucht man aber nicht> x = ~x>> Dann togglet aber jedes bit von x und nicht nur das LSB. Also z.B. 1> <--> -2 oder 0 <--> -1.> So würde es aber gehen:int x = 0;> //…> x ^= 1;
Nach Neandertallogik wäre es OK
int x = O;
...
x = ~x;
Der gleiche Scheiss, den du hier schreibst.
Du, als C Verächter, schreibst, alles ausser 0 ist true. Es spielt also
keine Rolle, wieviel Bits gekippt werden.
Ich schreibe: Nimm die typsichere Lösung. Geht immer, C, C++ und was
sonst noch gefällt.
Zahl = Zahl;
Boll = Boll;
Hab ich da was verpasst? Will der TE jetzt nicht mehr zwischen 0 und 1
togglen?
Das mit dem XOR 1 sollte auf jeden Fall funktionieren, bei Bool (falls
Boll == Bool) und auch bei int. Gleich wie var = !var; was IMHO die
beste Lösung ist.
Ihm gehts um Bool, darum funktioniert das in den verschiedenen
Varianten.
Man sollte aber trotzdem Zahlen und Logik trennen, typischer
programmieren. Aber das ist wohl eher ein Problem der Profis. ;-)
echter MSPler schrieb:> Du, als C Verächter, schreibst, alles ausser 0 ist true. Es spielt also> keine Rolle, wieviel Bits gekippt werden.
So ist es definiert, überall.
Nur Null ist false, alles andere ist true.
Somit ist:
false = 0;
true = !false;
oder:
true <> false;
Schuster, bleib bei deinem Leisten.