Fibonacci-Funktion mit C.
Ich möchte den i-ten Satz der Fibonacci- Sequenz berechnen :
#include <stdio.h>
int fibo(int i);
int main()
{
return 0;
}
int fibo(int i)
{
switch (i)
{
case 1:
return 0;
break;
case 2:
return 1;
break;
default:
int a = 0, b = 1;
for (int p = 3; p <= i; p++)
{
b += a;
a = b - a;
}
return b;
break;
}
}
Aber es hat einen Fehler für 18 Zeilen int a = 0, b = 1;wie folgt :
10.c: In function 'fibo':
10.c:18:9: error: a label can only be part of a statement and a declaration is not a statement
18 | int a = 0, b = 1;
| ^~~
Ich benutze VS Code für IDE.
Antworten
in C, in einer switchAnweisung, in a case, um eine lokale Variable zu haben, muss der Körper von casein geschweiften Klammern '{' und '}' eingeschlossen sein.
#include <stdio.h>
int fibo(int i);
int main()
{
return 0;
}
int fibo(int i)
{
int a = 0, b = 1;
switch (i)
{
case 1:
return a;
break;
case 2:
return b;
break;
default:
for (int p = 3; p <= i; p++)
{
b += a;
a = b - a;
}
return b;
break;
}
}
Hier habe ich den Deklarationsteil außerhalb des Switch-Falls verwendet, da innerhalb des Labels nur Anweisungen erlaubt sind, keine Deklaration.
Die C-Grammatik erlaubt es nicht, eine Deklaration zu kennzeichnen. default:und case <expr>:sind Etiketten. Es gibt drei Möglichkeiten, um das Problem in Ihrem Code zu beheben:
Verschieben Sie die Deklarationen aus dem Hauptteil der
switchAnweisung:int fibo(int i) { int a, b; switch (i) { case 1: return 0; case 2: return 1; default: a = 0, b = 1; for (int p = 3; p <= i; p++) { b += a; a = b - a; } return b; } }Deklarationen in einen Block einschließen:
int fibo(int i) { switch (i) { case 1: return 0; case 2: return 1; default: { int a = 0, b = 1; for (int p = 3; p <= i; p++) { b += a; a = b - a; } return b; } } }Fügen Sie nach dem Label eine Null-Anweisung hinzu:
int fibo(int i) { switch (i) { case 1: return 0; case 2: return 1; default:; // this is a null statement int a = 0, b = 1; for (int p = 3; p <= i; p++) { b += a; a = b - a; } return b; } }
Beachten Sie auch diese Bemerkungen:
Die
break;Aussagen in IhrerfiboFunktion werden nie erreicht und sollten entfernt werden.Das
case 2:ist redundant: Derdefault:Code würde das gleiche Ergebnis liefern.Ihr Code implementiert nicht die klassische Fibonacci-Sequenz:
1 1 2 3... stattdessen erzeugt er0 1 1 2... Sie sollten die Tests folgendermaßen ändern:int fibo(int i) { switch (i) { case 0: return 0; default:; // this is a null statement int a = 1, b = 1; for (int p = 2; p < i; p++) { b += a; a = b - a; } return b; } }Sie sollten wahrscheinlich auch
0für negative Zahlen zurückkehren. Vereinfachen Sie den Code einfach wie folgt:int fibo(int i) { int a = 1, b = 0; while (i-- > 0) { b += a; a = b - a; } return b; }