[解決済み] C言語で使用されるブラケットとその目的
質問
以前にも質問されていたら申し訳ないのですが、私はC言語初心者で、どなたか
()
の括弧は、次のコードにあります。
オンラインのチュートリアルから取ったもので、問題なく動きますが、1つだけ理解できない部分があります。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int age;
printf("Please enter the age");
scanf("%d", &age);
if (age > 18 /*condition */ ) {
printf("You may enter the club");
if (age < 21)
{
printf("The age is greater than 18 but less than 21");
} else
(printf("The age is greater than 18 and greater than 21"));
} else if (age == 18)
{
printf("The age is equal to 18");
}
else {
printf("The age is not greater than 18");
}
return 0;
}
私が見たところ、丸括弧はif文の条件を入れるのに使われ、中括弧はその条件に続く操作を記述するのに使われているようです。 ただし、太字のネストされたelse条件は、else文の後に丸括弧でprintコマンドを囲んでいます。
なぜそうなるのか、どなたか説明してください。
解決方法は?
丸かっこ
()
(中括弧と同じように
{}
は、いくつかの異なる文脈で登場し、異なる役割を果たすことがあります。
の中のカーリーブラケット
if
は、ほとんどの場合、複数のステートメントを1つにまとめる必要があります。
複合
の真偽の分岐として機能します。
if
. あなたの場合、例えば、各ブランチが
if (age < 21)
はすでに1つの文であり、その枝の中の中括弧は実際には必要ないことを意味します。つまり
if
として
if (age < 21)
printf("The age is greater than 18 but less than 21");
else
printf("The age is greater than 18 and greater than 21");
のtrueブランチを同時に作成します。
if (age > 18)
は複数のステートメントを含むので、そこに中括弧が必要なのです。
一方、丸括弧で囲まれた
if
条件は、単なる構文要素である
if
文 - 文法では、丸括弧で
if
の中で丸括弧を要求するのと同じように、条件も丸括弧を要求します。
for
,
while
関数呼び出しなどの構文があります。
しかし、丸括弧はまったく別の役割でも使われます。
(2 + 2) * (5 - 3)
. ただし、式の中では、冗長な括弧を自由に使うことができます。
(((2))) + (3)
の代わりに
2 + 3
. また、式全体を囲む余計な括弧を追加することもできます。
(((2 + 3)))
の代わりに
(2 + 3)
といった具合です。
これは、あなたの例で観察されることと全く同じです。あなたの
printf("The age is greater than 18 and greater than 21");
は単なる式文、つまり一つの式からなる文です。その式は
printf
. もし望むなら、その呼び出しを任意の数の冗長な丸括弧で囲むことができます。
(((printf("The age is greater than 18 and greater than 21"))));
であり、その意味は変わらない。
が本当に必要ないこと、この2つの要素が組み合わさった結果です。
{}
その周りに
printf
をいくつでも置くことができます。
()
その周りに
printf
を好きなように設定することで、あたかもその
printf
のペア
{}
はなぜか
置き換え
を1組の
()
. 実際には、この2つは全く関係のない動作です。
いずれにせよ、これは単なる構文的な好奇心であり、実用的な価値を持つものではありません。チュートリアルのコードではどうなっているのか、それは誰にもわからないことです。
関連
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] C++のヘッダーファイルで#ifndefと#defineが使われているのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】execvp: バッドアドレスエラー