Diskussion:C-Programmierung: Variablen und Konstanten

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Diskussion:C-Programmierung: Variablen und Konstanten/Archiv1

Initialisierung[Bearbeiten]

Einer Variablen kann aber auch unmittelbar bei ihrer Definition ein Wert zugewiesen werden. Man bezeichnet dies als Initialisierung. Im folgenden Beispiel wird eine Variable mit dem Bezeichner a des Typs char (character) deklariert und ihr der Wert 'b' zugewiesen:

Sollte hier nicht definiert stehen?

- Sehr richtig, habe ich mir auch gedacht!

ASCII- und EBCDIC[Bearbeiten]

Der Abschnitt ist IMHO sehr ungenau und müsste wohl überarbeitet werden. Gerade für "uns" Deutschsprachler ist das erste Problem nicht ASCII vs. EBCDIC sondern die sogenannten Codepages z.B. CP437 für DOS, 1257 für Windows 852 für OS/2 mit Euro ... Im übrigen ist EBCDIC durchaus noch verbreitet - zumindest solange es hier um ANSI-C geht, da an HOST Systemen dies der Standard ist. Aber auch hier kann die Kodierung abweichen.

Globale und lokale Variablen[Bearbeiten]

Es wäre IMHO schön, wenn dies nicht erst im Abschnitt Funktionen erwähnt wird! --Bastie 08:21, 6. Okt 2005 (UTC)

Variablen in printf[Bearbeiten]

Es wäre schön, wenn erklärt werden würde, was %d, %i, %f, %l innerhalb eines printf Ausdrucks bedeuten.

Darauf wird im nächsten Kapitel eingegangen. -- Daniel B 16:24, 25. Okt 2005 (UTC)

Nein %l wird leider auch dort nicht erklaert

Konstanten[Bearbeiten]

Der offenbar nachträglich hinzugefügte Abschnitt zur Berechnung von Quadratzahlen mittels Makros ("ACHTUNG: Das Arbeiten mit define kann...") wirkt am Ende des Unterkapitels "Konstanten" irgendwie deplaciert.

Ich habe gerade mal die Inhaltsverzeichnisse quergelesen, aber keinen Abschnitt speziell für die Makroprogrammierung gesehen. Dort wäre der Abschnitt m.E. besser aufgehoben. --gneer 18:48, 31. Dez 2005 (UTC)

Der Abschnitt wird mit "Im Gegensatz zu Variablen, können sich konstante Werte während ihrer gesamten Lebensdauer nicht ändern." eingeleitet, weiter unten im Text werden Konstanten jedoch als Spezialfall von Variablen dargestellt:

"Im Unterschied zu einer Konstante, die über define definiert wurde, benötigt eine Konstante, die mit const deklariert wurde, allerdings Speicherplatz wie jede andere Variable auch."
"In Zeile 5 wird die Variable pi als konstante Variable deklariert"
"Damit das Programm richtig übersetzt wird, muss Zeile 11 entfernt werden, da dort versucht wird, der Variable einen neuen Wert zuzuweisen."

Das ist m.E. etwas irreführend. Ich habe daher dreisterweise die Sätze umformuliert, ich hoffe ich bin damit niemandem auf den Schlips getreten:

"Im Unterschied zu einer Konstante, die über define definiert wurde, benötigt eine Konstante, die mit const deklariert wurde, Speicherplatz wie Variablen auch."
"In Zeile 5 wird die pi als Konstante deklariert"
"Damit das Programm richtig übersetzt wird, muss Zeile 11 entfernt werden, da dort versucht wird, der Konstanten einen neuen Wert zuzuweisen."

--Bit Steller 18:02, 8. Sep. 2008 (CEST)

Sichtbarkeit und Lebensdauer von Variablen[Bearbeiten]

Im zweiten Abschnitt wird "Anweisungsblock" definiert, obwohl dieser bereits in Kapitel "Grundlagen" unter der Benennung "Block" eingeführt wurde. Meines Erachtens kann der Abschnitt "Ein Anweisungsblock kann eine Funktion, eine..." daher aus "Sichtbarkeit und Lebensdauer von Variablen" raus. - Insbesondere, weil es verwirrt, wenn Block mal hie – mal da eingeführt wird, und mal so und mal so. --gneer 18:55, 31. Dez 2005 (UTC)

getch () und getchar ()[Bearbeiten]

Das Beispielprogramm und der Text passen nicht zusammen. Im Programm steht "getchar ()", im Text "getch ()".

int main(int argc,char *argv[])[Bearbeiten]

Kann mir jemand sagen, wieso beim Abschnitt mit Konstanten anstelle von "int main()" "int main(int argc,char *argv[])" verwendet wird? Ich habe versucht, dass Script mit "int main()" zu compilieren und es lief ohne Probleme. Könnte man es nicht weglassen, damit keine Verwirrung entsteht?

Rechenfehler in Fußnote[Bearbeiten]

Nachfolgender Satz aus Fußnote 2 gehört unbedingt geändert:

"Wenn Sie nachgerechnet haben, ist Ihnen vermutlich aufgefallen, dass 32.767 + 32.767 nur 65.534 ergibt, und nicht 65.535, wie man vielleicht vermuten könnte."

Sichtbarkeit und Lebensdauer von Variablen[Bearbeiten]

Wird eine Variable/Konstante z.B. im Kopf einer Schleife vereinbart, gehört sie laut C99-Standard zu dem Block, in dem auch der Code der Schleife steht. Folgender Codeausschnitt soll das verdeutlichen:

  1.
     for (int i = 0; i < 10; i++) {
  2.
       printf("i: %d\n", i); // Ausgabe von lokal deklarierter Schleifenvariable
  3.
     }
  4.
     printf("i: %d\n", i); // Compilerfehler: hier ist i nicht mehr gültig!

Bei diesem Beispiel bekomme ich unter meinem Codeblocks IDE und GCC einen Compilerfehler:

error: 'for' loop initial declaration used outside C99 mode.

Wenn ich das Beispiel wie folgt abändere, dann funktionierts! (Unter C++ würde der Fehler nicht auftreten).

  1.
     int i;
  2.
     for (i = 0; i < 10; i++) {
  3.
       printf("i: %d\n", i); // Ausgabe von lokal deklarierter Schleifenvariable
  4.
     }
  5.
     printf("i: %d\n", i); // Compilerfehler: hier ist i nicht mehr gültig!

getch oder getchar[Bearbeiten]

Im Text steht "getchar();" .In einer älteren Version des Artikel steht "getch();" das klappt bei mir. --79.233.235.202 17:30, 13. Jul. 2008 (CEST)

Vereinfachen[Bearbeiten]

Viel zu lang die ganze Einführung, es wird alles doppelt erzählt, von Datentypen, was float macht und welcher Platz reserviert wird. Das hat doch alles nichts mit Definition und Deklaration zu tun. Gleich das erste Beispiel - dessen Erklärung - wird unmittelbar darunter fast nochmal identisch wiederholt... --WissensDürster 13:33, 20. Feb. 2009 (CET)

Symbolische Konstanten[Bearbeiten]

Dieser Abschnitt ist sehr irreführend, wenn nicht gar falsch: "ACHTUNG: Das Arbeiten mit define kann auch fehlschlagen: Da define lediglich ein einfaches Suchen-und-Ersetzen durch den Präprozessor bewirkt, wird folgender Code [#define quadrat(x) x*x] nicht das gewünschte Ergebnis liefern:".

Gerade in diesem Beispiel findet eben nicht nur ein einfaches "Suchen-und-Ersetzen" statt, da "x" ja als Platzhalter für beliebige Argumente dient.

%d[Bearbeiten]

Vielleicht sollte man noch darauf hinweisen was %d bedeutet --M1rco 18:59, 14. Aug. 2009 (CEST)

Deklaration und Definition[Bearbeiten]

Ich bin in C absoluter neuling und lese gerade das Deklaration und Definition oftmals vereinheitlicht werden.Ich weiß aber immer noch nicht was eigendlich der unterschid zwischen den beiden ist wäre schön einfach mal in ein zwei Sätzen zu erklären was der unterschid ist bevor ganz viel gefachsimmelt wird.

Danke im Vorraus

Snake56 - 57.66.88.129 09:41, 11. Aug. 2011 (CEST)

Erledigt. Neue Diskussionen gehören übrigens ans Ende. -- Jürgen 09:53, 11. Aug. 2011 (CEST)

extern + Initialisierung[Bearbeiten]

"Wenn eine Variable als extern deklariert und dabei gleichzeitig mit einem Wert initialisiert wird, dann ignoriert der Compiler das Schlüsselwort extern. So handelt es sich bspw. bei

extern int c = 10;

nicht um eine Deklaration, sondern um eine Definition. extern sollte deshalb in diesem Falle weg gelassen werden."

Der gcc ignoriert bei mir die Zeile nicht sondern gibt mir beim Kompilierversuch eine error-Meldung zurück.

offen halten des Programmfensters[Bearbeiten]

Anstelle von "getch();" zum sichtbar halten des Programms kann auch "system ("pause");" verwendet werden, da erscheint sogar ein Text, der die Betätigung einer beliebigen Taste fordert.

Ja, auf einem Windows-System würde das funktionieren. Versucht man jedoch beispielsweise das Programm nach dem erfolgreichen Compilieren auf Linux auszuführen erhält man eine Fehlermeldung der Shell. system() führt so weit ich weiß das angegebene Programm zur Laufzeit aus. So gibt es unter Windows das kurze Programm 'pause'. Man kann es auch so in der Konsole ausführen. Unter Linux könnte man als Alternative 'read -p "Press any key to continue..."' benutzen. Aber das wäre plattformabhängig. getchar() ist hingegen Teil der Standardbibliothek.

Wieso %lo?[Bearbeiten]

Wieso wird dort jetzt die Größe als Oktalzahl ausgegeben? Unüblich und auch verwirrend. Wenn statt int dort long stände, stände da "Der Typ long hat auf diesem System die Größe 10 Byte.", was falsch ist bzw. als falsch erscheint. --Buchfreund~dewikibooks 22:03, 16. Nov. 2015 (CET)

Die Erklärung dafür, dass etwas geändert wurde, steht (fälschlich) bei der Benutzerdiskussion. Warum es so geändert wurde, bleibt unklar, ebenso wie der ursprüngliche Fehler. Wenn du @Buchfreund dir vorstellen kannst, was am vorherigen Code u.U. falsch sein kann, dann ändere es bitte. -- Gruß Jürgen 08:54, 17. Nov. 2015 (CET)