C Variablen und Operatoren


C Variablen und Operatoren

Variablen


Jedes Programm wandelt eine Hand voll Informationen in andere Informationen um. Microsofts Word wandelt zum Beispiel Tastendrücke fettiger Finger in hübsch formatierten Text um, ein Browser nimmt URL’s entgegen und gibt Bewegtbilder nackter Frauen zurück. Damit wir solche nutzvollen Programme schreiben können brauchen wir einen Mechanismus mit Daten umzugehen. Von Hause aus bringt C zwar keine nackten Frauen, aber immerhin Zahlen und Buchstaben mit. Dazu ein Beispiel:

#include <stdio.h>

int main(void)
{
  int units = 20;                              // stückzahl
  double cost_per_unit = 1.5;                  // stückkosten
  double total_cost = units * cost_per_unit;   // gesamtkosten

  // %f wird durch den wert von total_cost ersetzt
  printf("Die Gesamtkosten betragen %f €.", total_cost);

  getchar();
  return 0;
}

Dieses Programm berechnet die Kosten, Nach der Formel Stückkosten * Anzahl der Stücke. int units = 20 ist eine Variable, die die Anzahl der Stücke enthält. Ähnlich wie mit dem x aus Mathe kann man units * cost_per_unit anstelle von 20 * 1.5 rechnen.

Die Begriffe int und double stehen für dabei Datentypen. Jede Variable hat einen Datentyp und speichert einen Wert, der Zum Datentyp der Variable passt:

int        ist der Datentyp für Ganze Zahlen (Zahlen wie -2, -1, 0 , 1, 2 ...)
double     ist der Datentyp für Brüche (Zahlen wie -2.5, -1.34, 0.001, ...)

Wenn wir also int units = 20;  schreiben, lassen wir nur Ganze Zahlen zu, int units = 20.5; wäre also falsch.


Was bringen Variablen? Wir können mit mit units oder cost_per_unit rechnen, auch wenn wir die konkreten Werte nicht kennen, weil die erst später z.B. durch den Benutzer des Programms festgelet werden.

Bspw. kann man mit dem Befehl scanf der Wert einer Variable vom Benutzer festgelegt werden:


#include <stdio.h>

int main(void)
{
  int units; // stückzahl (noch unbekannt)

  printf("Geben Sie die Stueckzahl an: \n");
  scanf("%d", &units); // liest die stückzahl von der konsole ein.

  double cost_per_unit = 1.5;                       
  double total_cost = units * cost_per_unit;

  // %f wird durch einen bruch ersetzt
  printf("Die Gesamtkosten betragen %f EURO.", total_cost);

  getchar();
  getchar(); // doppelt hält manchmal besser
  return 0;
}

Die Zahl 99 wurde vom User eingegeben.


Beachte, die Schreibweise von scanf("%d", &units); : "%d" legt das Eingabeformat fest, der Variable units wird ein Amper-stand angefügt. %d steht dabei für eine Dezimalzahl. Das Zeichen & weist den Wert der Eingabe der Variable units zu. Die Erklärung warum das funktioniert dazu folgt später im Abschnitt zu Pointern.

Datentypen


Ok jetzt zum technischen Teil: int units zeigt auf einen festen Speicherbereich. In dem Speicherbereich liegt der Wert z.B. 20 in der Form von Bits (Nullen und Einsen). Durch den Datentyp weis C, den Wert 20 in die passende Folge von Bits zu übersetzen. Außerdem hat jeder Speicherbereich eine feste Größe, die durch den Datentyp vorgegeben wird. Und weil wir nicht unendlich viel Speicher haben, können wir nicht unbegrenz große Zahlen speichern.


Mit Variablen geht man jetzt so um:



    int units;          // legt die variable mit namen units
                        // vom typ int an



    units = 20;       // definiert einen hübschen wert für units

    units = 21;       // der alte wert 20 wird durch 21 ersetzt

    units = units + 1; /* moment macht das sinn?
                        * ja! = bedeutet, dass der wert auf der
                        * rechten seite, der variable units zugewiesen
                        * wird. also steht dort: neuer wert von units
                        * = alter wert + 1
                        */


Schick und was ist jetzt mit den nackigen Mädels? Ähm ... also ... schau mal wir können auch Buchstaben speichern: char character = 'a';. Das wir jetzt das A in Anführungsstriche setzen hat einfach den Grund, dass an dieser Stelle niccht nach einer Variable gesucht wird, die a heist.
Hier eine Knappe übersicht, was es sonst noch so gibt.



int integer;

Ganze Zahl.
unsigned int unsigned_integer;


Ganze Zahl ohne Vorzeichen (Natürliche Zahl)
long long_integer;

Ganze Zahl, ermöglicht aber, dass größere Zahlen gespeichert werden können.
unsigned long unsigend_long_integer;


Selbe Geschichte nur ohne Vorzeichen.
float floating_point_number;

Fließkommazahl (Bruch)
double double_precision_number;

      

Auch eine Fließkommazahl, aber mit mehr Nachkommastellen, wums und so
char character;
Ein einzelner Buchstabe


Für den Umsteiger: Richtig es gibt keine Booleans und keine Strings! Für den Einsteiger: Einfach den Satz überlesen. Eine Übersicht aller anderen Datentypen gibt es hier.

Und wieviel Speicher verbraucht jetzt z.B. ein Buchstabe? Das lässst sich mit dem Befehl sizeof herausfinden:


#include <stdio.h>

int main(void)
{

  printf("Variablen vom Typ char belegen %u byte(s) Speicher\n", sizeof(char));

  printf("Variablen vom Typ int belegen %u byte(s) Speicher\n", sizeof(int));

  printf("Variablen vom Typ long belegen %u byte(s) Speicher\n", sizeof(long));

  getchar();

  return 0;

}

Operatoren


Zu den Datentypen gibt es noch die passenden Operatoren, wie +, -, * etc. Dazu sei

  int x = 3;
  int y = 4;

Wir können mit diesen Zahlen die üblichen Standartberechnungen durchführen:

Addition:

  x = y + 2; // x = 5, y = 4

Subtraktion:

  x = y - 1; // x = 3, y = 4

Vorzeichenwechsel:

  x = - y;   // x = -4, y = 4

Multiplikation:

  y = x * 2; // x = 3, y = 6

Division

  x = 8 / y; // x = 2, y = 4

Modulo (Rest beim Teilen)

  y = 5 % 2; // x = 1, y = 4


Wenn wir den Wert x um 5 erhöhen wollen können wir  x = x + 5; schreiben dafür gibt es jedoch eine Kurzform x +=5;. Diese funktioniert auch bei den anderen Operatoren. Anstelle von x = x + 1; kann man auch x++ schreiben. Analog gibt es auch x--.

Also wenn int x = 3; deklariert wird, dann ergibt x++ den Wert vier. Bei den operatoren gilt die übliche Regel: Punktrechnung vor Strichrechnung. Mit den Pluszeichen musss man etwas aufpasssen:



    int x = 0;
    x = 3 * x++; // ergibt 3 * 0 + 1 = 1

    int x = 0;
    x = 3 * ++x; // ergibt 3 * (0 + 1) = 3


Ansonsten gibts aber auch noch die üblichen Klammern:
    int x = 0;
    x = 3 * (x + 1); // ergibt 3 * (0 + 1) = 3
Das Zusammenspiel von Variablen und Operatoren verdeutlicht folgendes Programm:

#include <stdio.h>

int main(void)
{
  int x = 3;
  int y = 4;

  x++;              // x = 4
 
  int c;
  c = x;            // c = 4
  c--;              // c = 3, x = 4

  c *= x - y;        // c = 0;

  printf("x = %d ", x);
  printf("y = %d ", y);
  printf("c = %d ", c);

getchar();
  return 0;
}

Beachte, dass c = x; den Wert von x kopiert, x aber unverändert bleibt, wenn sich c ändert.

Keine Kommentare:

Kommentar veröffentlichen

Inhalt