Suche…


if () Anweisungen

Eine der einfachsten Methoden zur Steuerung des Programmflusses besteht in der Verwendung von if Auswahlanweisungen. Ob ein Codeblock ausgeführt werden soll oder nicht, kann durch diese Anweisung entschieden werden.

Die Syntax für if Auswahlanweisungen in C könnte folgendermaßen lauten:

if(cond) 
{
  statement(s);  /*to be executed, on condition being true*/
}

Zum Beispiel,

if (a > 1) {
    puts("a is larger than 1");
}

Dabei ist a > 1 eine Bedingung , die als true ausgewertet werden muss, um die Anweisungen im if Block auszuführen. In diesem Beispiel wird "a ist größer als 1" nur gedruckt, wenn a > 1 wahr ist.

if Auswahlanweisungen können die umlaufenden Klammern { und } auslassen, wenn nur eine Anweisung im Block enthalten ist. Das obige Beispiel kann umgeschrieben werden

if (a > 1)
    puts("a is larger than 1");

Für die Ausführung mehrerer Anweisungen innerhalb eines Blocks müssen jedoch die geschweiften Klammern verwendet werden.

Die Bedingung für if kann mehrere Ausdrücke enthalten. if führt die Aktion nur aus, wenn das Endergebnis des Ausdrucks wahr ist.

Zum Beispiel

if ((a > 1) && (b > 1)) {
    puts("a is larger than 1");
    a++;
}

führt die printf und a++ wenn sowohl a als auch b größer als 1 .

if () ... else Anweisungen und Syntax

Während if führt eine Aktion nur aus, wenn ihre Bedingung als true ausgewertet wird. if / else ermöglicht Ihnen die Angabe der verschiedenen Aktionen, wenn die Bedingung true und die Bedingung false .

Beispiel:

if (a > 1)
    puts("a is larger than 1");
else 
    puts("a is not larger than 1");

Genau wie bei der if Anweisung, wenn der Block innerhalb von if oder else nur aus einer Anweisung besteht, können die Klammern weggelassen werden (dies wird jedoch nicht empfohlen, da dies leicht unwillkürlich zu Problemen führen kann). Wenn es jedoch mehr als eine Anweisung im if oder else Block gibt, müssen die Klammern für diesen bestimmten Block verwendet werden.

if (a > 1) 
{
    puts("a is larger than 1");
    a--;
}
else 
{
    puts("a is not larger than 1");
    a++;
}

switch () Anweisungen

switch Anweisungen sind nützlich, wenn Sie möchten, dass Ihr Programm je nach Wert einer bestimmten Testvariablen viele verschiedene Dinge ausführt.

Ein Beispiel für die Verwendung der switch Anweisung sieht folgendermaßen aus:

int a = 1;

switch (a) {
case 1:
    puts("a is 1");
    break;
case 2:
    puts("a is 2");
    break;
default:
    puts("a is neither 1 nor 2");
    break;
}

Dieses Beispiel ist äquivalent zu

int a = 1;

if (a == 1) {
    puts("a is 1");
} else if (a == 2) {
    puts("a is 2");
} else {
    puts("a is neither 1 nor 2");
}

Wenn der Wert von a bei Verwendung der switch Anweisung 1 ist, a is 1 ausgegeben. Wenn der Wert von a 2 ist, a is 2 gedruckt. Andernfalls wird a is neither 1 nor 2 gedruckt.

case n: wird verwendet, um zu beschreiben, wo der Ausführungsfluss einspringt, wenn der an die switch Anweisung übergebene Wert n ist . n muss eine konstante Kompilierungszeit sein, und dasselbe n darf höchstens einmal in einer switch Anweisung vorhanden sein.

default: wird verwendet, um zu beschreiben, dass der Wert mit keiner der Optionen für den case n: übereinstimmt. Es default , in jede switch-Anweisung einen default einzufügen, um unerwartetes Verhalten abzufangen.

Eine break; Eine Anweisung ist erforderlich, um aus dem switch zu springen .

Hinweis: Wenn Sie versehentlich vergessen, eine break nach dem Ende eines case hinzuzufügen, geht der Compiler davon aus, dass Sie "durchfallen " möchten, und alle nachfolgenden Case-Anweisungen (sofern vorhanden) werden ausgeführt (sofern keine Break- Anweisung in gefunden wird alle nachfolgenden Fälle), unabhängig davon, ob die nachfolgenden Fallanweisungen übereinstimmen oder nicht. Diese spezielle Eigenschaft wird zum Implementieren von Duff's Device verwendet . Dieses Verhalten wird häufig als Fehler in der C-Sprachspezifikation betrachtet.

Unten ist ein Beispiel, das die Auswirkungen der Abwesenheit von break; :

int a = 1;

switch (a) {
case 1:
case 2:
    puts("a is 1 or 2");
case 3:
    puts("a is 1, 2 or 3");
    break;
default:
    puts("a is neither 1, 2 nor 3");
    break;
}

Wenn der Wert von a 1 oder 2 ist, werden a is 1 or 2 und a is 1, 2 or 3 gedruckt. Wenn a 3 ist, wird nur a is 1, 2 or 3 gedruckt. Andernfalls wird a is neither 1, 2 nor 3 gedruckt.

Beachten Sie, dass der default nicht erforderlich ist, insbesondere wenn der Wertebereich, den Sie im switch , zum Zeitpunkt des Kompilierens beendet und bekannt ist.

Das beste Beispiel ist die Verwendung eines switch in einer enum .

enum msg_type { ACK, PING, ERROR };
void f(enum msg_type t)
{
  switch (t) {
  case ACK:
    // do nothing
    break;
  case PING:
    // do something
    break;
  case ERROR:
    // do something else
    break;
  }
}

Dies hat mehrere Vorteile:

  • Die meisten Compiler melden eine Warnung, wenn Sie keinen Wert behandeln (dies würde nicht gemeldet werden, wenn ein default vorliegt).
  • Aus dem gleichen Grund werden Sie beim Hinzufügen eines neuen Werts zur enum über alle Stellen informiert, an denen Sie vergessen haben, den neuen Wert zu behandeln (bei einem default müssten Sie Ihren Code manuell nach solchen Fällen durchsuchen).
  • Der Leser muss nicht herausfinden, "was durch die default: ausgeblendet wird", ob es andere enum oder ob es sich um einen Schutz für "nur für den Fall" handelt. Und wenn es andere enum , hat der Codierer absichtlich den default für sie verwendet oder gibt es einen Fehler, der eingeführt wurde, als er den Wert addierte?
  • Die Verarbeitung jedes enum macht den Code selbsterklärend, da Sie sich nicht hinter einem Platzhalter verstecken können. Sie müssen jeden von ihnen explizit behandeln.

Trotzdem können Sie nicht verhindern, dass jemand bösartigen Code schreibt:

enum msg_type t = (enum msg_type)666; // I'm evil

Sie können also vor dem Wechsel eine zusätzliche Prüfung hinzufügen, um sie zu erkennen, wenn Sie sie wirklich brauchen.

void f(enum msg_type t)
{
   if (!is_msg_type_valid(t)) {
      // Handle this unlikely error
   }

   switch(t) { 
    // Same code than before
   }
}

if () ... else Ladder Chaining zwei oder mehr if () ... else-Anweisungen

Während mit der if ()... else -Anweisung nur ein (Standard-) Verhalten definiert werden kann, das auftritt, wenn die Bedingung innerhalb von if () nicht erfüllt ist, können zwei oder mehr if () ... else Anweisungen miteinander verkettet werden mehr Verhaltensweisen vor zur letzten gehen else Zweig , die als eine „default“, falls vorhanden.

Beispiel:

int a = ... /* initialise to some value. */

if (a >= 1) 
{
    printf("a is greater than or equals 1.\n");
} 
else if (a == 0) //we already know that a is smaller than 1
{
    printf("a equals 0.\n");
}
else /* a is smaller than 1 and not equals 0, hence: */
{ 
    printf("a is negative.\n");
}

Geschachtelte if () ... else VS if () .. else Ladder

Geschachtelte if()...else Anweisungen benötigen mehr Ausführungszeit (sie sind langsamer) im Vergleich zu einem if()...else Ladder, da die verschachtelten if()...else Anweisungen alle inneren Bedingungsbefehle der äußeren prüfen bedingte if() Anweisung ist erfüllt, wohingegen der if()..else Ladder den Bedingungstest beendet, sobald eine der if() oder else if() Bedingungsanweisungen wahr ist.

Eine if()...else Ladder:

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;
  printf("\nEnter Three numbers = ");
  scanf("%d%d%d", &a, &b, &c);
  if ((a < b) && (a < c))
  {
    printf("\na = %d is the smallest.", a);
  }
  else if ((b < a) && (b < c))
  {
    printf("\nb = %d is the smallest.", b);
  }
  else if ((c < a) && (c < b))
  {
    printf("\nc = %d is the smallest.", c);
  }
  else
  {
    printf("\nImprove your coding logic");
  }
  return 0;
}

Ist im allgemeinen Fall besser als das entsprechende verschachtelte if()...else :

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;
  printf("\nEnter Three numbers = ");
  scanf("%d%d%d", &a, &b, &c);
  if (a < b)
  {
    if (a < c)
      {
        printf("\na = %d is the smallest.", a);
      }
    else
      {
        printf("\nc = %d is the smallest.", c);
      }
  }
  else
  {
    if(b < c)
    {
      printf("\nb = %d is the smallest.", b);
    }
    else
    {
      printf("\nc = %d is the smallest.", c);
    }
  }
  return 0;  
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow