Programm um die Anzahl der Ziffern einer Zahl zu ermitteln.
-
drakon schrieb:
redrew99 schrieb:
Ja,genau - Danke für die Codes und die Erklärung. In for-Schleifen inialisierte Variablen existieren also nur innerhalb dieser
Exakt.
Sicher?
{ int i; //Definition for(i = 0/*Initialisierung*/; i < 5; ++i); ... //i existiert noch immer }
Fazit:
In for-Schleifen definierte Variablen existieren also nur innerhalb dieser
-
Wenn schon deklarariert, wenn man so genau sein will.
Ich probiere es zu vermeiden Anfänger mit so Kleinigkeiten zu belästigen. Er scheint die Semantik ja verstanden zu haben.
-
Nix 'deklariert'.
int i;
reserviert den Speicher an der Stelle --> Definition.
Und ob der TE die Semantik kennt ... keine Ahnung. Mich jedenfalls haben Definition/Deklaration/Initialisierung immer mal wieder verunsichert, auch als ich kein blutiger Anfänger mehr war.
Bei Deklaration/Definition bin ich mir in manchen Situationen heute noch nicht sicher; allerdings denke ich, es ist meist auch eher von akademischem als praktischem Interesse.
-
Deklaration und Definition sind je Objekt ja nochmal leicht anders definiert. Bei ner Variable ist eigentlich fast jede Deklaration auch eine Definition, weil Speicher reserviert wird. Eine extern-Deklaration wäre da z.B. was anderes. Grundsätzlich ist Deklaration erstmal nur "Nennung" und bei Definition wird dann wirklich was gebastelt (nicht zwangsläufig Speicherallokation wie man an einer Klassendefinition sieht). Da in einer Schleife eine Deklaration ohne Definition nicht in Frage kommt, ist obige Aussage mit "deklariert" nicht richtiger sondern verwirrender, da man annehmen könnte, dass man irgendwie eine Variable deklarieren könnte ohne sie zu definieren.
*ausatm*
-
Belli schrieb:
Nix 'deklariert'.
int i;
reserviert den Speicher an der Stelle --> Definition.
Und ob der TE die Semantik kennt ... keine Ahnung. Mich jedenfalls haben Definition/Deklaration/Initialisierung immer mal wieder verunsichert, auch als ich kein blutiger Anfänger mehr war.
Bei Deklaration/Definition bin ich mir in manchen Situationen heute noch nicht sicher; allerdings denke ich, es ist meist auch eher von akademischem als praktischem Interesse.Ob eine Variable in einem Scope sichtbar ist hängt lediglich davon ab, ob in dem Scope der Name eingeführt wurde (deklariert) oder nicht. Dass das dort eine Deklaration und Definition stimmt schon, aber grundsätzlich muss man auf Deklarationen achten und nicht auf Definitionen. Jede Definition ist eine Deklaration, aber nicht umgekehrt. Die Initialisierung hat auch nichts mit dem Sichtbarkeitsbereich zu tun.
Oftmals spielt das ganze aber auch nicht eine Rolle, wie du auch selbst sagst. Vielleicht hätte ich nicht "Exakt" schreiben sollen, aber verstanden hat er es ja und auf den Namen rumzureiten verwirrt denke ich nur in diesem Stadium.
@Eisflamme
Es ging mir darum, dass nicht die Definition verantwortlich ist ob es sichtbar ist, sondern die Eigenschaft, dass es eine Deklaration ist.EDTI:
Da in einer Schleife eine Deklaration ohne Definition nicht in Frage kommt, ist obige Aussage mit "deklariert" nicht richtiger sondern verwirrender, da man annehmen könnte, dass man irgendwie eine Variable deklarieren könnte ohne sie zu definieren.
Das geht schon:
int main() { for(extern int i;;) { } }
-
Das geht nicht nur innerhalb des globalen Scopes? Dann hast Du natürlich Recht.
Aber ich verstehe das nicht. Wo soll man die denn jetzt definieren?
-
Meine Lösung des Problems: http://ideone.com/V4g7m
-
Eisflamme schrieb:
Das geht nicht nur innerhalb des globalen Scopes? Dann hast Du natürlich Recht.
Aber ich verstehe das nicht. Wo soll man die denn jetzt definieren?
Naja, auch wenn man das innerhalb des globalen Scopes deklariert, muss man es ja woanders definieren.
Antwort auf Deine Frage also: Irgendwo anders.
-
Was heißt irgendwo anders? Innerhalb der Funktion? Was macht man dann bis zur Definition? Und außerhalb der Funktion, wie wäre da die Syntax?
-
Eisflamme schrieb:
Was heißt irgendwo anders?
Na, irgendwo, Beispiel:
#include <iostream> //extern char i = 1; int main() { for(extern char i; i < 10; ++i) std::cout << static_cast<int>(i) << std::endl; } extern char i = 1;
oder in einer anderen Quelltextdatei, die dann natürlich dazugelinkt werden muss. Wie man extern deklarierte Variablen halt irgendwo definieren muss.
-
drakon schrieb:
Wenn schon deklarariert, wenn man so genau sein will.
Ich glaube, Du hast doch recht,
#include <iostream> int main() { for(extern char i; i < 10; ++i) std::cout << static_cast<int>(i) << std::endl; std::cout << i; } char i = 1;
kompiliert nämlich nicht, wegen Zeile 8.
-
Naja. Deine Aussage war nicht falsch, sondern einfach nicht vollständig. Definitionen sind eine Untermenge von Deklarationen und was die Sichtbarkeit anbelangt ist eben die Deklaration der Variable wichtig und nicht ob sie dort definiert wurde.
Ich hoffe ich habe hier nicht Leute unnötig verwirrt. ^^
-
Mittels Logarithmus kannst du die Anzahl Ziffern sogar einfach für jedes beliebige Zahlensystem bekommen.
#include <iostream> #include <limits> #include <cmath> using namespace std; int main() { /* Die Zahl x hat im Ber-System int( ln(x)/ln(B) )+1 Ziffern. B = Basis des Systems ln = natürlichen Logarithmus int = Damit ist die Abrundung auf die nächst kleinere Ganzzahl gemeint. */ int x = 0; cout << "Eingabe: "; cin >> x; cout << endl << "#Ziffern Hex: " << static_cast<int>( log(x)/log(16) )+1; // in cmath log = ln cout << endl << "#Ziffern Dez: " << static_cast<int>( log(x)/log(10) )+1; cout << endl << "#Ziffern Bin: " << static_cast<int>( log(x)/log(2) )+1; cin.ignore(numeric_limits<streamsize>::max(),'\n'); cin.get(); return 0; }
lg