(編集:これは完全に作り直された回答です。コメントを参照してください。「論争」に感謝し、申し訳ありません。)
.で中括弧 (「中括弧」、{
および}
) を適切に使用しなかったためですmain
。
まず、コードのこの内部部分を見てみましょう:
if(n < 3)
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
else
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
その現在のインデントは「間違って」おり、誤解を招きます。これをコード エディターにコピー アンド ペーストし、自動書式設定 (自動インデントで十分です) を使用すると、次のようになります。
if(n < 3)
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
else
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
コードの本当の「意味」を示します。わかりやすくするために中括弧と空白行を追加した後:
if(n < 3)
{
cout << answer << " is the " << n;
}
cout << "st Fibonacci number\n";
else
{
cout << answer << " is the " << n;
}
cout << "rd Fibonacci number\n";
ご覧のとおり、最初のcout
ステートメントのみがif
. 2 つ目は常に実行されます。次にelse
、「条件付き」ステートメント/ブロックではなく、「プレーン」で「無条件」のステートメントに続く が続きます (ステートメントのブロック全体もステートメントです)。
この部分を修正するには、すべての条件付きステートメントを中かっこで囲む必要があります。
if(n < 3)
{
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
}
else
{
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}
またはよりコンパクトなスタイルで:
if(n < 3) {
cout << answer << " is the " << n;
cout << "st Fibonacci number\n";
} else {
cout << answer << " is the " << n;
cout << "rd Fibonacci number\n";
}
完全なブロックステートメントが条件付けられるように。
「内側」の if-else 部分が修正されたので、「外側」の if-else を見てみましょう。
if(n < 3 && n > 1)
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";
{
/* ... fixed inner if-else ... */
}
else
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
もう一度コードフォーマッタを使用しましょう:
if(n < 3 && n > 1)
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";
{
/* ... fixed inner if-else ... */
}
else
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
本当の意味が明確になったはずです (ここではコンパクト スタイルを使用)。
if(n < 3 && n > 1) {
cout << answer << " is the " << n;
}
cout << "nd Fibonacci number\n";
{
/* ... fixed inner if-else ... */
}
else {
cout << answer << " is the " << n;
}
cout << "th Fibonacci number\n";
真ん中のおかしなブロック (中かっこ内のコードで、if
/の直後ではないコードelse
) は、実際には無名ブロックであり、内部スコープを導入するだけです (内部で定義された変数は、終了後には存在しなくなります}
)。すぐ上のように、単純なステートメント (無条件) として見ることができますcout << "nd Fibonacci number\n";
。
繰り返しますが、修正は明らかです。
if(n < 3 && n > 1) {
cout << answer << " is the " << n;
cout << "nd Fibonacci number\n";
/* ... fixed inner if-else ... */
} else {
cout << answer << " is the " << n;
cout << "th Fibonacci number\n";
}