Forum: Mikrocontroller und Digitale Elektronik c frage


von Markus (Gast)


Lesenswert?

hallo mir ist gerade was kurioses passiert und zwar.
ich wollte while schleife generieren deren mit zwei abbruchbedingnung. 
die abbruchbedingung wäre jeweils 0.

also hab ich das ganze mal so eingeben:

unsigned char i,r;
i=14;
r=16;
while (i || r)
{
   i--;
   r--;
}
die schleife sollte normal abgebrochen werden wenn i o ist.
ja puste kuchen der läuft einfach weiter.
dann hab ich das ganze so eingeben:

unsigned char i,r;
i=14;
r=16;
while (i && r)
{
   i--;
   r--;
}

und siehe da es geht. aber was soll das mit der UND verknupfung? i ist 
immer als erstes 0. kann mir das jemand erklären?

von Uwe Arends (Gast)


Lesenswert?

Deine erste Schleife wird nur beendet, wenn i UND r NULL sind, da du 
von unterschiedlichen Werten ausgehend beide immer um eins 
dekrementierst, werden beide NIE gleichzeitig NULL.

Die zweite Schleife bricht ab, wenn die UND-Verknüpfung NULL ergibt. Das 
ist immer dann der Fall, wenn i ODER r NULL sind.

hth
-uwe

von Andreas (Gast)


Lesenswert?

Denk mal ein bisschen nach...

While (i || r) bedeutet, weiterzulaufen, solange eine Variable nicht 
null ist...

von Markus (Gast)


Lesenswert?

für mich trotzdem kurios da ich das "||" nur als ODER kenne.

d.h while (i || r)  laufe solange bis i ODER r gleich 0 ist

in einer IF schleife heisst das ja auch

if ( i = 0 || r = 0)

von Sascha Weitkunat (Gast)


Lesenswert?

Du gibst bei einer while-Schleife allerdings die Laufbedingung und nicht 
die Abbruchbedingung an.

von Uwe Arends (Gast)


Lesenswert?

eie ODER-Verknüpfung ergibt solange 1 oder true oder NICHTNULL wie der 
eine ODER der ander Operand nicht null ist.

Eine Verknüpfung die NULL ergibt, wenn der eine ODER der andere Operand 
null ist, ist die UND-Verknüpfung.

von BAB (Kai K.) (Gast)


Lesenswert?

so einfach wie sascha das sagt ist es genau kurz und schmerzlos richtig. 
nach deinen überlegungen gehst du nämlich von einer abbruchbedingung aus 
und so funktioniert die while schleife nicht.

gruss,
BAB

von Christian Schifferle (Gast)


Lesenswert?

Ja aber hallo, da muss ich mich doch auch mal einklinken und ein paar 
Bemerkungen zum allgemeinen Verständis beitragen.

Wenn du eine Ganzzahlige Variable hast, und diese Variable in einer 
Bedingung ohne einen Operatoren angibts so bedeutet das gleichviel wie 
'Wert der Variablen ungleich 0', da der C-Compiler dies als Boolsche 
Operation auffasst. Dies ist generell so. Die Zeile
while (i || r)
ist also gleichbedeutend wie
while (i != 0 || r != 0)

Dann noch etwas zu folgender Zeile:
if ( i = 0 || r = 0)

Hier kommt garantiert nicht das heraus was du wolltest. Es wird nämlich 
der Wert 0 an die beiden Variablen i und r zugewiesen [i = 0 bzw. r = 0] 
und nun wird abgekürzt folgende Bedingung getestet:
if (0 || 0)
und diese if-Abfrage wird immer(!) FALSE ergeben.
Das was du eigentlich wolltest war:
if (i == 0 || r == 0)
Dies kann übrigens auch so notiert werden:
if (!i || !r)


Vielleicht wär ja auch mein Tutorial mal was für dich.
Guckst du zuerst hier: www.mypage.bluewin.ch/ch_schifferle/C-Kurs.zip
und dann hier: www.mypage.bluewin.ch/ch_schifferle/Atmel.zip

oder du liest den zweiten Teil des Tutorials hier unter 'Artikel'.

Gruss
Christian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.