🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

7回答

3519閲覧

関数の波括弧の開始位置について

B.E.

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/12/01 22:12

私は全ての関数の波括弧の開始位置を丸括弧の次の行にしていますが、丸括弧のすぐよこにするメリットは何でしょうか?
そちらの方が見やすいという人のためでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

ベストアンサー

ifforwhileなどでは同一行に書くというスタイルでやっている場合は、揃えるのが一貫性のある姿勢だと思います。これらでも行を分けるのであればどうぞ分けてください。

ちなみに「関数定義のときだけ行を分ける」書き方にも理由があって、いにしえのC(ANSI Cの前)では関数の引数リストが

C

1void foo(hoge, fuga, ...) //引数は名前だけの宣言 2int hoge, fuga; //型の宣言です 3... 4{ 5 ... 6} 7

という構文だったので、関数定義では自然と波括弧を行を分けて書くようになり、その名残が今も続いている・・・とされていると思います。関数定義以外では同じ行に書くのは、紙媒体で出版するときに行数を圧縮するためみたいなことが言われていますね。

私は学び始めの頃この意味がわからなかったので、すべて行を分けないで丸括弧の隣に書く書き方で覚えてしまいましたが。

K&Rスタイルで納得できないこと - 涼の成長記録
字下げスタイル - Wikipedia
プログラミング言語C - Wikipedia

投稿2019/12/01 23:24

編集2019/12/02 00:13
hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/12/02 12:31

昔は gcc -traditional で、上記引数形式をコンパイルできていたのですが、いつの間にかできなくなっています。
guest

0

いろいろな人がいるので、いろいろな流儀があります。
Man page of INDENT

{を同じ行に書く理由は行数を減らすためです。画面は有限なので、情報の少ない行(括弧だけの行)を減らしたほうが、1画面で見えるコード量が増えますので、読んだりデバッグしたりするとき効率的です。。
また、ifwhile等と同じ行に{を書くスタイルの場合は、それと統一するという意味があります。

投稿2019/12/01 22:50

otn

総合スコア85886

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

見やすいと感じるかどうかは人それぞれですね。今どきの若い人には想像もつかないことでしょうが、昔は「80桁×25行」が画面に表示できる最大文字数だったことが長い期間ありました。その中に納まるようになるべく行数を減らそうとしたものです。その習慣が今も続いているのでしょう。どこぞのコーディング規約では「1行は80文字以内」などと決めているところもあります。

まぁ、おそらく多くの人は特にメリットとか気にせずに、単に勉強の過程で参考にしたソースコードが制御文と同じ行に{を書くスタイルだったので、そういうものだと思ってそう書いているだけだとは思いますけどね。あとは、今どきのテキストエディターには大抵コード整形機能が付いていますが、デフォルトの設定では制御文と同じ行に書くスタイルのものも結構あります。

ちなみに、私も{は改行してから書く派です。ブロックの範囲が一瞬で判るのでプログラムの制御構造が把握しやすいということと、行単位での編集がしやすいというメリットがあります。デバッグの際も、「一時的にif文をコメントアウトしてブロックの中身を実行させてみたい」などということがやりやすいですし。

投稿2019/12/02 05:26

編集2019/12/02 05:28
catsforepaw

総合スコア5944

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

既に複数の回答があるように、 { を関数定義と同じ行に書くのは書式ルールを単純化しつつ行数を削減できるというメリットがあります。これはこれで有用な視点と思います。
ただ、私は個人的な見解ですが、それはメリットよりデメリットの方が痛いと思うので、逆の視点を補足させていただきます。

C++で複雑な引数を持つ関数や複雑な条件式を書いていると、なが~~~~い文が超痛いです。
下記は今サンプルとして書いただけですが、実際のプログラミングの場面ではこれを遥かに越えるものが結構発生します。

C++

1#include <iostream> 2#include <functional> 3#include <vector> 4#include <list> 5 6std::list<int> extract(std::vector<int> const& iVector, std::function<bool(int)> iCondition) { 7 std::list<int> ret; 8 for (int elem : iVector) { 9 if (!iCondition(elem)) { 10 ret.push_front(elem); 11 } 12 if (iCondition(elem)) { 13 ret.push_back(elem); 14 } 15 } 16 return ret; 17} 18 19int main() { 20 auto extracted = extract({-152, 44, 9, -29, 33}, [](int x){return x >=0;}); 21 for (int item : extracted) { 22 std::cout << item << "\n"; 23 } 24}

そのような時は、パラメータ毎に改行する人が多いと思いますが、その際に) {という行は泣きたくなる程 意味不明なので、パラメータ毎の改行をするのかどうかその度に悩みます。

更に、上記はまだforブロックやifブロックの中が僅かしか無いのでましですが、数行~十数行を越えてくるとブロックの区切りを見落とし易くなりますが、{}のインデントを揃えることで対策になります。

C++

1#include <iostream> 2#include <functional> 3#include <vector> 4#include <list> 5 6std::list<int> extract 7( 8 std::vector<int> const& iVector, 9 std::function<bool(int)> iCondition 10) 11{ 12 std::list<int> ret; 13 for (int elem : iVector) 14 { 15 if (!iCondition(elem)) 16 { 17 ret.push_front(elem); 18 } 19 if (iCondition(elem)) 20 { 21 ret.push_back(elem); 22 } 23 } 24 return ret; 25} 26 27int main() 28{ 29 auto extracted = extract({-152, 44, 9, -29, 33}, [](int x){return x >=0;}); 30 for (int item : extracted) 31 { 32 std::cout << item << "\n"; 33 } 34}

ただ、流石に下記は間延びしすぎて「見苦しい」レベルになので悩ましいのですが、私は長い文の分割に悩まないことやブロックの見落としを回避する方を優先することにしています。

C++

1if (foo) 2{ 3 bar(); 4} 5else 6{ 7 baz(); 8}

投稿2019/12/02 04:39

編集2019/12/02 05:31
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

改行は空白と同じ扱いと思いますので, 言語(コンパイラ?)的には改行の位置は問題では無いでしょう.
ですので, 「人のため」であっていると思います.

投稿2019/12/02 05:05

jimbe

総合スコア13202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

要するに関数の「宣言」を関数ブロックに含むかどうか、ということなんですけど、全体で統一が取れているならどっちだっていいと思います。

個人的には改行しない派です。if や for, while でも改行しないので、それと合わせている感じです。
if で改行しないのは、

C

1if (...) { 2 ... 3} else { 4 ... 5}

と、ブロックの区切りが一行にまとまるから……ですかね。これが

if (...) { ... } else { ... }

と、とくに else の部分が間延びしてしまう感じがします。(else if なら見やすいかも知れませんが)

投稿2019/12/02 00:37

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そこらへんは人の好み、ということで。
同一行にしたほうが行数増えなくて見やすくなるって程度ですね

投稿2019/12/01 22:31

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問