Kann jemand den folgenden gcc-Fehler näher erläutern?
$ gcc -o Ctutorial/temptable.out temptable.c
temptable.c: In function ‘main’:
temptable.c:5: error: ‘for’ loop initial declaration used outside C99 mode
versuchbar.c:
...
/* print Fahrenheit-Celsius Table */
main()
{
for(int i = 0; i <= 300; i += 20)
{
printf("F=%d C=%d\n",i, (i-32) / 9);
}
}
PS: Daran erinnere ich mich vage int i
sollte vor a deklariert werden for
Schleife. Ich sollte sagen, dass ich nach einer Antwort suche, die einen historischen Kontext des C-Standards gibt.
for (int i = 0; ...)
ist eine Syntax, die in C99 eingeführt wurde. Um es zu verwenden, müssen Sie den C99-Modus durch Passieren aktivieren -std=c99
(oder ein späterer Standard) zu GCC. Die C89-Version ist:
int i;
for (i = 0; ...)
BEARBEITEN
Historisch hat die C-Sprache Programmierer immer gezwungen, alle Variablen am Anfang eines Blocks zu deklarieren. Also sowas wie:
{
printf("%d", 42);
int c = 43; /* <--- compile time error */
muss umgeschrieben werden als:
{
int c = 43;
printf("%d", 42);
Ein Block ist definiert als:
block := '{' declarations statements '}'
C99, C++, C# und Java erlauben die Deklaration von Variablen überall in einem Block.
Der wahre Grund (Vermutung) besteht darin, interne Strukturen (wie das Berechnen der Stapelgröße) so schnell wie möglich zuzuweisen, während die C-Quelle analysiert wird, ohne einen weiteren Compilerdurchgang zu durchlaufen.
Vor C99 mussten Sie die lokalen Variablen am Anfang eines Blocks definieren. C99 hat die C++-Funktion importiert, mit der Sie lokale Variablendefinitionen mit den Anweisungen mischen und Variablen in der definieren können for
und while
Steuerausdrücke.
Weitere Informationen finden Sie in dieser vorherigen Frage zur Deklaration von C-Variablen: stackoverflow.com/questions/288441/…
– Kyle Walsh
17. August 2009 um 13:12 Uhr
Beachten Sie, dass die Temperaturumrechnungsformel falsch ist; in ganzzahliger Arithmetik sollte es so sein
(5 * (i - 32)) / 9
(das5
wird vermisst). Normalerweise benötigen Sie Fließkommaarithmetik – aber dann müssen Sie Ihr printf-Format von ändernC=%d
zuC=%./2f
oder etwas ähnliches (und Sie konvertieren mit(5.0 * (i - 32)) / 9.0
).– Jonathan Leffler
2. September 2019 um 17:50 Uhr