Cの書式についての疑問

このQ&Aのポイント
  • Cの書き方にはさまざまな書き方があるようですが一般的にはどのような書き方が好まれるのでしょうか?
  • 最近の言語と比べて、Cでは変数と演算子の間に空白を開けることが少ないようですが、一般的にはどちらが好まれるのでしょうか?
  • プログラミング初心者がCの書式について疑問に思っています。一般的に好まれるCの書き方や変数と演算子の間のスペースの使い方について教えてください。
回答を見る
  • ベストアンサー

Cの書式

プログラミング初めたばかりの者です そこでCの書式について疑問に思ったことがあります。Cの書き方にはさまざまな書き方があるようですが一般的にはどのような書き方が好まれるのでしょうか? 例えば int main(void) { } なのか int main(void) { } なのか (i=0;i<5;i++) なのか (i = 0; i < 5; i++) なのか 最近の言語とかだと変数と演算子の間は空白を開けてる場合が多いようですがCでは開けない場合が多いようにも思います。 他人にコードを見せるわけではないのですが知識として覚えて置きたいと思っています。 くだらない質問ですがよろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
noname#252929
noname#252929
回答No.2

その辺は会社によて変わりますが。 入れ子構造にすることが多いので、その入れ子のクラスを明確にしてミスを防ぐために、かっこの始めと終わりは同じ位置にするということが多いでしょう。 もしくは変数の頭のカラムと終わりの括弧を同じにするなど。 会社の方針があるはずです。 スペースは、あってもなくても関係はありませんが、そもそも意味のないものなので、ない方が間違いが少ないという考え方もあります。 基本的に、ソースコードは、他の人に見せるものとして作るのが基本です。 他の人が見てもわかるように作ります。

ashitanotenki11
質問者

お礼

回答有り難うございまいた。

その他の回答 (5)

  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.6

Unix/Linuxには、indentというプログラムがあります。 https://linuxjm.osdn.jp/html/GNU_indent/man1/indent.1.html これで、さまざまな標準形式に整えてくれますので、書くときはあまりこだわらずに書いて、適宜このプログラムで変換すると良いでしょう。 > 他人にコードを見せるわけではないのですが知識として覚えて置きたいと思っています。 ということであれば、標準的な GNU スタイル、Kernighan & Ritchie スタイル、 Berkeley スタイル を比べてみて気に入った物を使うといいかと思います。 上記ページの「一般的なスタイル」のセクションに書いてあります。 なお、indentコマンドは引数のファイルを「書き換え」ますので注意してください。

ashitanotenki11
質問者

お礼

回答有り難うございまいた。

noname#252332
noname#252332
回答No.5

https://www.gfd-dennou.org/arch/comptech/cstyle/cstyle-ja.htm 標準の書式を目指すならANSIのCで書きます。シュミシュミの世界です。 https://www28.atwiki.jp/msx-sdcc/pages/73.html そのまえはK&Rでした。

ashitanotenki11
質問者

お礼

回答有り難うございまいた。

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.4

自分がわかりやすいように書けばいいです。 ただし仕事でやる場合にはコーディング規約として決められていることもあります。

ashitanotenki11
質問者

お礼

回答有り難うございまいた。

  • jack-a3
  • ベストアンサー率34% (197/576)
回答No.3

ぶっちゃけて言うといろんな流儀があって統一されてません。 大昔は端末で表示できる縦横の文字数が固定化されていたので、画面内になるべく多く表示できるように詰めて記述することが多かったのです。最近はウインドウ幅も文字フォントも自由自在なので見やすさを優先することが多いです。しかしどんな書き方が見やすいかは個人によって、あるいは経験によって変わってきますので、これはこれでいろんな流儀がある理由の一つです。 なお、チームで開発する時には、人によって書き方が異なるのはいろいろ面倒なので書き方を統一することがあります。その場合は記載を統一するために整形ツールを使うことが多いです。すると、それはそれでどんな書き方をしても最終的にはツールが整形してくれるので、自分の書きやすいように書けばいい、ってことになります。 コーディング規約とか字下げスタイル、などのキーワードで検索してみるといろいろ情報あります。

ashitanotenki11
質問者

お礼

回答有り難うございまいた。

  • GENESIS
  • ベストアンサー率42% (1102/2582)
回答No.1

私は過去にプログラマをやっていて、そのときは int main(void) { } この記述を使っていました。 文法エラー云々が無ければ、個人で学習して個人で使う分にはどの記述でも良いと思います。しかしプログラム開発等を行う会社の場合、会社によっては記述方法を明確に決めているところもあります。 当然プログラムとして成り立っていることは基本ですが、記述方法も解りやすさが必要でしょう。プログラムを開発してシステムを完成、納品となりますがその後のメンテナンスも必要になります。不具合・機能追加・仕様変更等々でプログラムの更新等が必要になってきますが、その時に最初の開発者が退職等で不在になった場合、誰かが引き継がなければなりません。その時にわかりづらい記述になっていると結構大変です。 (i=0;i<5;i++)は(i=0; i<5; i++)と記述していた気もしますが、スペースを入れなかったような気もします。なんせ30年以上も前の話なんで…。だしコメントは出来る限りつけていましたが…。 当時、C言語ではありませんがBASICのシステム(個人の小さな会社が開発・商品化されているもの)の改修の仕事がありました。実際に動かしたり説明書等を読んで何をやっているのかは理解できましたが、ソースコードを見たとたん絶句しました。上から処理命令が淡々と下へ向かって記述されているのですが、所々でgotoが多用、典型的なスパゲッティでした。システム内容は専門分野的なものでしたが、コーディングは初心者に毛が生えたレベルでした。 改修を実現するにはまず構造化にしないと何ともならず、試行錯誤はしたのですが、試運転をすると結果がおかしい!。改修内容自体はそれほど難しいものではなく、入力・修正をしやすく見た目もスッキリさせると言う内容だったので、当時の社長も簡単に(良い顔しーのお友だち感覚・なーなーで)引き受け納期も僅か。まあ私もまだ若く経験も浅く力不足だったのもあるのですが、ソースjコードの解析に思わぬ時間を取られ結果タイムオーバー。客からはブーブー言われるわで…でも私も言いたかったが立場的に言えない。ハァ!。せめてコメントを付けて置くなりフローチャートぐらいは描いておいて欲しかったと…。 個人での利用で誰にも見せることは無いかもしれませんが、もしその道に行こうと思うなら第三者が見ても見やすく解るような記述が出来るように学んでください。長文で失礼しました。

ashitanotenki11
質問者

お礼

回答有り難うございまいた。

関連するQ&A

  • void main()って誰が最初?:ANSI-C

    ANSI-C言語に関することです。 ベンダー拡張やOS固有機能は除外してください。 よく、書籍でvoid main(void)と書いたサンプルを見かけます。 プログラミング言語Cではint main(void)だし、C言語FAQでも「void main(void)は間違いである」と書いてあるのに…。 過去の質問への回答で「ANSI-Cでは…」と解説している人がいたのでANSI-Cの仕様を調べてもint main(void)の方が正しいように書かれていました。 これだけ資料が揃っているのにいまだにvoid main(void)と書かれた書籍がイッパイあるのはなぜなんでしょう? 最初にvoid main(void)って書いた人がものすごく影響力のある人だったのか?と想像してしまいます。 いったい誰が最初にvoid main(void)と書き始めたのでしょうか?

  • 【C】fizzbuzzのトリッキーなコードについて

    C言語でのfizzbuzz問題の回答を探していたら、以下のようなコードがありました。 #include <stdio.h> int main(void){ int i; for(i = 1 ; i <= 100 ; i++){ printf("%d \0Fizz \0FizzBuzz "+(i%5?(i%3?0:4):(i%3?14:10)),i); } printf("\n"); return 0; } (引用元:http://revilog.com/2010/08/c-fizzbuzz-printf.html) このコードについての質問です。 printf("%d \0Fizz \0FizzBuzz "+(i%5?(i%3?0:4):(i%3?14:10)),i); で、以下のことは理解しました。 ・\0で区切って文字列の終わりを作っておく ・+演算子でポインタ演算を行なっている ・三項演算子でポインタ演算する量を決めている ・+演算子によって指定したポインタから\0までの文字列を出力する ・Buzzを出力する際は、「FizzBuzz」の途中の「Buzz」を出力している わかっていないところは、 ・特殊文字(\0など)や「%d」は何バイトとして計算するのか ・数字以外を出力する際、%dによって桁数がずれ、変なところから出力されてしまうのではないか(でも実際はならない) です。 以上2点について回答よろしくお願いします。

  • C言語のポインタについて教えてください。

    C言語のポインタについて教えてください。 ・pointer1.c  int main(){   int a;   int *p;   p = &a;     a = 123;   printf("%d", *p);   return 0;  } ・pointer2.c   int main(){ int a[100]; int *p; p = &a[0]; int i; for(i = 0; i < 100; i++) a[i] = i; for(i = 0; i < 100; i++) printf("%d", *p++); return 0; } と二つのソースコードがあるとき、pointer2.cの「p = &a[0]」をpointer1.cのように「p = &a」と書けないのはなぜですか?  また、「&a」は動かすことのできなく、「aを指し示す*p」は動かすことができる変数のようなもの、という認識に誤りはないでしょうか?  宜しくお願いします。

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

  • 教えてください。

    プログラミング言語論です。 C言語のプログラミングmain.cを実行した際に、(1)、(2)で表示される変数aの値それぞれを教えてください。 #include<stdio.h> void threeTimesByValue(int a){ a = 3*a; } void threeTimesByRefference(int* a){ *a=3**a; } int main(){ int a = 10; threeTimesByValue(a); printf("a=%d\n",a)//(1) threeTimesByRefference(&a); printf("*a=%d\n",a);//(2) return 0; }

  • C言語で困っています

    C言語で 100:1 99:2 98:3 .......ループ 1:100とやりたいんですが このやりかたがわかりません goto文などを使うのでしょうか? 一応コードは #include <stdio.h> int main(void) { int i,a; for(i=100; i>=1; i--){ for(a=1; a<=100; a++){ printf("%d:\n",i); break; printf("%d",a); } } return 0; } です まったくこれだと右側が出力されなくてだめみたいです どなたかお知恵をください お願いします

  • C言語でのプログラミング

    C言語でのプログラミング プログラミングの勉強中で少し疑問が出てきたので、教えていただけるとありがたいです。 1から10までの数を足していくという次のプログラミングについてです。 #include <stdio.h> void main(void) {    int a = 0, i;    for (i=1; i<=10; i++) {      a = a + i;    }    printf("1から10の合計は%dです¥n", a); } 変数として、aとiを定め、aには0が代入されています。 つぎにforループが発動する際に、iに1が代入されiが10以下であるため、a = a + iが実行されます。 このとき、右辺が先に実行されa = 1となるはずです。 ここで疑問なのですが、aには1だけ入っているのでしょうか? それとも0と1が入っているのでしょうか? そしてa = a + iが実行されたのち、i++によりiには2も入ることになると思います。 ここでも同じ疑問として、iには1と2が入っているのか? それとも2だけが入っているのか良く分かりません。 もし仮にaにもiにも数字がどんどん格納されていくのなら、なぜ足し算の式において一つの値だけを取り出して足し算を実行できるのか分かりません。 長くなりましたが、ご解答よろしくお願いします。

  • C言語で四則演算を使って結果が10になる数式

    C言語のプログラミングについて質問です。 四つの一桁の数字を入力して四則演算を使って結果が10になる数式を作りたいのですが、イメージが湧きません。 教えていただけますか? 例:1234enterkey 答え2*3+1*4 数値の変数はint型でお願いします。int型ですので小数点以下を使って10になる結果は出さなくて宜しいです。お願いします。

  • C++ ポインタ初級

    C++で、自作関数内でメインの数字をインクリメントします。 自作関数はVOIV型でやりたいんです。 #include <stdio.h> void plus( int * ); main( ){  int a = 1;  int *&p = &a;  plus( p );  printf( "%d" , *p ); } void plus( int *i ){  ( *i )++; } int型の変数を2つ宣言したけど、1つでやる方法はないですか? #include <stdio.h> void plus( int * ); main( ){  int a = 1;  plus( &a ); // aのアドレスを渡して、  printf( "%d" , a ); } void plus( int *i ){ // アドレスの値を  ( i )++; // インクリメントしたつもりだけど } 結果は1のままでした。

  • C言語の変数について

    C言語の変数について教えていただきたいです。 C言語で下記のような設定をした場合、変数A、Bに設定する値にはバイト数制限 はないのでしょうか? バイト数制限がなくなる場合、なぜそうなるのかを教えていただきたいです。 よろしくお願いします。 #include <stdio.h> void test( char **B); int main( int argc, char *argv[] ) { char *A = NULL; char *B = NULL; A = argv[1]; test( B ); return 0; } void test( char **B ) { strcpy(B, "ABCD"); return 0; }

専門家に質問してみよう