Forum: Mikrocontroller und Digitale Elektronik if abfrage durchfallen


von iffff (Gast)


Lesenswert?

Hallo, folgender Code:

a=1;

if(a==1)
{
a=2;
}
else if(a==2)
{
...
}


Frage:
Werden beide Anweisungen in den if-Abfragen direkt nacheinander 
ausgeführt?

von Dennis S. (eltio)


Lesenswert?

Was macht denn dein Compiler?

von Peter II (Gast)


Lesenswert?

iffff schrieb:
> Werden beide Anweisungen in den if-Abfragen direkt nacheinander
> ausgeführt?

nein. Er kommt ja gar nicht zu 2. if-Abfrage.

von iffff (Gast)


Lesenswert?

a ist nur initial bei 1

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und? Der /else/-Zweig wird dennoch nicht durchlaufen, weil die erste 
Abfrage nicht wiederholt wird.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

iffff schrieb:
> Frage: Werden beide Anweisungen in den if-Abfragen direkt nacheinander
> ausgeführt?
Sieh dir mal diesen Code an:
1
a=1;
2
3
if(a==1)
4
{
5
   ... // aa
6
}
7
else if(a==2)
8
{
9
   ... // bb
10
}
Frage: wird aa oder bb ausgeführt?
Was ist der Trick beim entweder-oder (aka if-else)?

Frage: was passiert im folgenden Code?
1
a=1;
2
3
if(a==1)
4
{
5
  a=2;
6
}
7
8
if(a==2)
9
{
10
  ...
11
}

iffff schrieb:
> a ist nur initial bei 1
Es wird jedesmal vor der ersten if-Abfrage wieder mit 1 beschrieben...
Oder ist der gepostete Code noch nicht komplett?

von iffff (Gast)


Lesenswert?

a=1;

while(1)
{

if(a==1)
{
a=2;
}
else if(a==2)
{
...
}
}


Wird der zweite if Zweig beim ersten, oder erst beim zweiten Durchlauf 
durch die Schleife abgearbeitet?

von Joachim B. (jar)


Lesenswert?

normalerweise

iffff schrieb:
> beim zweiten Durchlauf

wenn

Dennis S. schrieb:
> Was macht denn dein Compiler?

der es richtig macht, wovon ich ausgehe......

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

BTW: mach bitte um deinen Code die c-Tokens. Die Anleitung findet sich 
knapp über der Edit-Box...
1
Antwort schreiben
2
Wichtige Regeln - erst lesen, dann posten!
3
Formatierung
4
5
    [c]C-Code[/c]

von Ulrich F. (Gast)


Lesenswert?

iffff schrieb:
> Wird der zweite if Zweig beim ersten, oder erst beim zweiten Durchlauf
> durch die Schleife abgearbeitet?
Was das "else" wohl bedeuten mag.....?

Ich verrate es dir: "sonst"
Siehe z.B.: https://www.dict.cc/?s=else

Es heißt:
Wenn jenes, dann Tue dieses sonst tue was anderes.
Und nicht:
Wenn jenes, dann Tue dieses und tue was anderes.

von Kenner (Gast)


Lesenswert?

Bei diesem code wird nur die erste if abgearbeitet
a=1;

if(a==1)
{
a=2;
}
else if(a==2)
{
...
}

Bei diesem code werden beide if's abgearbeitet

a=1;

if(a==1)
{
a=2;
}
if(a==2)
{
...
}

von Axel S. (a-za-z0-9)


Lesenswert?

Bei einem if/else Block a'la
1
if (...)
2
{ 
3
  foo();
4
} 
5
else 
6
{
7
  bar(); 
8
}

wird immer genau einer der beiden Teile (also entweder foo() oder 
bar()) durchlaufen. Ob jetzt in dem else Block nochmal ein weiteres 
if drinsteht, spielt dafür keine Rolle.

von Micca (Gast)


Lesenswert?

Ich liebe diese Board, denn
1
if(ihavenobookaboutc){
2
  CallMikrocontrollerNetHelp();
3
} else if (Idontknowaboutgoogle) {
4
  CallMikrocontrollerNetHelp();
5
} else if (iamatroll) {
6
  CallMikrocontrollerNetHelp();
7
} else {
8
  CallMikrocontrollerNetHelp();
9
}

von Yalu X. (yalu) (Moderator)


Lesenswert?

Der GCC optimiert das übrigens zu
1
    CallMikrocontrollerNetHelp();

;-)

von Christian K. (the_kirsch)


Lesenswert?

iffff schrieb:
> Frage:
> Werden beide Anweisungen in den if-Abfragen direkt nacheinander
> ausgeführt?

Ganz klares Nein.
1
a=1;
2
if (a == 1) {
3
    a = 2;
4
} else if (a == 2) {
5
    ...
6
}

Formal müsste man es so schreiben, und da sieht man auch sofort, das man 
nie zum zweiten if kommt, da der else-zweig niemals ausgeführt wird:
1
a=1;
2
if (a == 1) {
3
    a = 2;
4
} else {
5
    if (a == 2) {
6
        ...
7
    }
8
}

Da aber das if bereits einen Block kapselt, wird in der Regel die 
geschweifte Klammer bei einem else-if weggelassen.

In C kann man die geschweiften Klammern weglassen, wenn der Block nur 
einen Befehl umfasst:
1
a=1;
2
if (a == 1) a = 2; else if (a == 2) foobar();

Ich persönlich finde es furchtbar wenn jemand bei if/else Blöcken die 
Klammern weglasst. Auch wenn der Code korrekt eingerückt ist, ist er 
meiner Meinung mit Klammern besser zu lesen.

Nur bei einem else-if sollte man sie weglassen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Yalu X. schrieb:
> Der GCC optimiert das übrigens zu
>     CallMikrocontrollerNetHelp();
>
> ;-)

 Aber nur wenn:

#ifdef ICanUseBrain
    TryWithSimulator();
#else
    CallMikrocontrollerNetHelp();
#endif

von Micca (Gast)


Lesenswert?

> Der GCC optimiert das übrigens zu CallMikrocontrollerNetHelp();
Reingefallen, ich hoffte, dass es mindestens einen gibt dem es 
auffällt..

von Micca (Gast)


Lesenswert?

Lieber Threadersteller, bitte nicht böse sein, aber wenn man sich mit 
Programmierung auseinandersetzt, sollte man auch eine 
Entwicklungsoberfläche installieren. Einmal durch den Code im 
Single-Step hilft für das Verständnis.

Fahradfahren lernt man auch nicht durch reine Theorie...

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.