cの簡単なプログラムのコード。 簡単な C プログラムの例。 命名規則

09.12.2020

タグ: C言語で書かれた最初のプログラム。 基本。 シ・ボーランド。 Cコードギア。 シ・エンバカデロ。 CMSビジュアルスタジオ。 CMSエクスプレス。

初めての C プログラムの作成

まず、インストールする必要があります ソフトウェア。 原則として、どのソフトウェアを使用するかは重要ではありません。 オペレーティング·システム。 ただし、コース全体を通じて、MS Visula Studio 2012 を使用した例を示します。 エクスプレス版。 Visual Studio 2012 Express Edition は無料で、コース全体を学習するには十分です。 さらに、実践が示しているように、コードに関してはより厳密になり、エラーと警告についてより完全な説明が提供されます。 言語を学習するときは、Borland (別名 CodeGEAR、別名 Embarcadero など)、Dev Cpp、MinGW、または gcc、またはその他の好きなものを使用できます。

MS Visual Studioの例

1. IDE を開き、[ファイル] | [ファイル] に移動します。 プロジェクトを作成...

2. 選択します コンソールアプリケーションそして名前を付けます。 で この場合最初のプログラム

4. 「空のプロジェクト」チェックボックスをオンにします。

5. その後、空のプロジェクト構造が得られます。 新しい要素を追加します: フォルダーを右クリックします
「ファイル ソースコード" | 追加 | 要素の作成...

新しい cpp ファイルを追加しますが、拡張子 .c を付けて保存します。

ファイルに main.c という名前を付けました。すべての準備が整ったので、プログラムを作成できます。 他のプラットフォームの手順。

ボーランド

私は Code Gear C++Builder 2007 のみをインストールしていますが、他の (および以前の) リリースでもすべて同じように行われます。

1. 新しいプロジェクトを作成しましょう。 新しい | 他の...

2. コンソール アプリケーションを追加する

3. C言語を選択します

4. 完成したプロジェクトを受け取ります。 任意の名前を付けて保存する必要があります。 それまでは、プロジェクト自体とすべてのファイルにはデフォルトの名前が付けられます。 デフォルトでは、Borland がプログラム テキストに記述した内容を削除できます。

ターミナルの cc/gcc の例

ああ、お気に入りを開いてください テキストエディタそこにプログラムコードをコピーします。

#含む int main(int argc, char* argv) ( printf("Hello, World!"); scanf("1"); return 0; )

プログラムを hello.c というファイルに保存した場合は、ターミナルにコマンドを入力します。

Cc こんにちは。c -o こんにちは

Gcc こんにちは - こんにちは

この場合、当然のことながら、プログラムのあるフォルダー内にいる必要があります。 gcc が作成します 実行可能ファイルこんにちはという名前で。 実行すると、Hello, World! が出力されます。

場合によっては、アクセス権に問題が発生する可能性があります。 実行可能ファイルがあることを確認してください。そうでない場合は、それを実行するためのアクセス許可を自分に与えてください。

Chmod 760 こんにちは

複数のファイルがある場合は、すべてのファイルの名前を順番にリストする必要があります。 たとえば、さらに 2 つのファイル simple.h と simple.c がある場合、次のように記述する必要があります。

Cc hello.c simple.c -o hello

プログラムコード

最初のプログラムでは Hello, World! を表示するのが通例です。 画面に。

#含む #含む int main(int argc, char* argv) ( printf("Hello, World!"); _getch(); return 0; )

プログラムを実行します (Borland の場合は [実行] | [実行] または F9、MS の場合は [ビルド] | [ソリューションのビルド] または F5) プログラムに「Hello, World!」と表示されます。 そして、いずれかのキーが押されるのを待ちます。

コードをさらに詳しく見てみましょう。 最初の 2 行

#含む #含む

標準ライブラリ stdio (標準入出力) と conio (コンソール入出力) を接続するためのコンパイラへのディレクティブ。 .h 拡張子は、これらがヘッダー ファイルであることを示します。 コンパイラは、conio ライブラリと stdio ライブラリのコードをコピーし、これらのライブラリに記述されている関数を使用できるようにします。

Int main(int argc, char* argv)

これ メイン関数。 これがエントリ ポイントであるという点で、定義できる他の関数とは異なります。プログラムの実行はそこから始まります。

main 関数には 2 つのパラメーターがあります。それは、パラメーターの数 argc と、渡されたパラメーターの配列 argv です。 これらの引数はオプションであるため、記述する必要はありません。 それらの使用法については後で説明します。

#含む #含む int main() ( printf("Hello, World!"); _getch(); return 0; ) main 関数は整数を返す必要があります。 0 の場合、関数はエラーなしで動作しました。 で 現代の標準 0 を返して関数を void main として記述することはできません。 #含む #含む

void main() ( printf("Hello, World!"); _getch(); ) プログラムは非常に単純に見えます。 Line printf("Hello, World!"); Hello, World! という行を出力します。 モニター画面上で。
_getch() はキー押下を待ちます。
新しいファイルをプログラムに追加する方法を学ぶために、より複雑なことをやってみましょう。 ここで、新しいファイルを追加する方法を学ぶことが重要です。コードの一部が不明瞭なままであっても問題ありません。
1. 「ヘッダー ファイル」フォルダーに新しいヘッダー ファイルを作成し、simple.h という名前を付けます。

2. Source Files フォルダーに新しいファイル simple.c を作成します。 #含む 3. simple.h に追加します。

#ifndef _SIMPLE_H_ #define _SIMPLE_H_ #include void doSomething(); #endifここで発表させていただきました
新機能

#include "simple.h" void doSomething() ( printf("It works!"); _getch(); )

simple.c にヘッダー ファイルをインクルードします。 に書かれています 二重引用符これは標準ライブラリ ファイルではないためです。 標準ライブラリ ファイルは通常、IDE 自体のインクルード フォルダーにあります。 ファイルをそこに配置すると、山かっこで宣言することもできます。 二重引用符で囲んだ絶対ファイル パスを使用することもできます。 conio ライブラリと stdio ライブラリはすでに .h ファイルに含まれているため、それらは .c ファイルで「表示」されます。
次に、main.c で

翻訳者より。 私は、C++ でプログラムを作成するためのシンプルで簡単に適用できるガイドラインをインターネットで探していました。 選択肢の 1 つが気に入ったので、翻訳して出版することにしました。 このトピックが Habra ユーザーに好評であれば、他の関連ドキュメントや、他社のコード作成ガイドラインも翻訳できます。

1 はじめに

このドキュメントには、C++ でプログラムを作成するためのガイドラインが含まれています。

しかし、これらの情報源に加えて、別の推奨事項のリストが登場する理由はいくつかあります。 主な理由は、多くの場合、プライベート ルール (特に名前付けルール) を指定する必要があるため、その過度の汎用性です。 この文書コメントが含まれているため、他の既存のドキュメントよりもコードの修正に使用しやすくなります。 さらに、プログラミング ガイドラインには通常、スタイルの問題と 技術的な問題、これは完全に便利ではありません。 このドキュメントには、スタイルの問題に焦点を当てた、C++ に関する技術的なアドバイスは含まれていません。

利用可能な開発環境では、アクセス修飾子の表示、コードの強調表示、自動書式設定などによりコードの読みやすさを向上させることができますが、プログラマはこれらのツールに依存すべきではありません。 ソース コードは、使用されている開発環境を超えて考慮される必要があり、環境に関係なく可読性を最大限に高めるように作成する必要があります。

1.1 文書フォーマット
推奨事項はトピックごとにグループ化され、番号が付けられているため、コードレビュー中に参照できます。 推奨事項は、重要性の順に、必須、強く推奨、一般に分類されます。 1. 可読性を向上させる場合には、推奨事項への違反は許可されます。

2. 個人的な異議がある場合、ルールに違反する可能性があります。

これは、単一のスタイルを全員に押し付けることなく、一連の一般的なガイドラインを作成する試みです。 経験豊富なプログラマは通常、自分に合うようにスタイルをカスタマイズします。 このようなガイドラインのリストを手元に置くと (または、少なくともそれを見るように要求すると)、人々は自分のプログラミング スタイルについて考え、自分のプログラミング実践を評価する傾向があります。

一方、経験の浅い新人プログラマは、通常、プログラミング専門用語をよりよく理解するためにスタイル ガイドラインを使用します。

3 命名規則

3.1 一般的な命名規則
3. 型を表す名前は、大文字から始めて大文字と小文字を混合して記述する必要があります。

回線、普通預金口座

4. 変数名は、小文字から始めて大文字と小文字を混合して記述する必要があります。

回線、普通預金口座
C++ 開発者コミュニティにおける一般的な慣行。 変数と型を簡単に区別できるようになり、潜在的な名前の衝突を防ぐことができます。次に例を示します。

5. 名前付き定数 (列挙値を含む) は、区切り文字としてアンダースコアを使用して大文字で記述する必要があります。

MAX_ITERATIONS、COLOR_RED、PI
C++ 開発者コミュニティでの一般的な慣行。 このような定数の使用は最小限に抑える必要があります。 ほとんどの場合、値をメソッドとして実装することが最善の解決策です。

Int getMaxIterations() // NOT: MAX_ITERATIONS = 25 ( return 25; )
この形式は読みやすく、クラスに格納されている値への単一のインターフェイスを保証します。

6. メソッドおよび関数の名前は、大文字と小文字を混合して小文字で始まる動詞でなければなりません。

GetName()、computeTotalWidth()
変数のルールと同じですが、それらの違いはその特定の形式にあります。

7. 名前空間名は小文字で記述する必要があります。

Model::analyzer、io::iomanager、common::math::geometry
C++ 開発者コミュニティにおける一般的な慣行。

8. テンプレート内のタイプ名には、大文字 1 文字を使用して名前を付ける必要があります。

テンプレート ...テンプレート ...
C++ 開発者コミュニティでの一般的な慣行。 テンプレート名を他の使用されている名前と区別できるようにします。

9. 名前の略語および略語は小文字で記述する必要があります。
エクスポートHtmlSource(); // 禁止:exportHTMLSource(); openDvdPlayer(); // そうではありません: openDVDPlayer();
大文字を使用すると、前述の名前の競合が発生する可能性があります。 それ以外の場合、変数には dVD、hTML などの名前が付けられ、読み取れなくなります。 別の問題についてはすでに上で説明しました。 名前が別の名前と関連付けられると、可読性が低下します。 略語に続く単語は必要以上に目立ちません。

10. グローバル変数は常にスコープ解決演算子 (::) とともに使用する必要があります。

::mainWindow.open()、::applicationContext.getName()
グローバル変数の使用は避けてください。 シングルトンを使用することをお勧めします。

11. 修飾子を持つクラスメンバープライベート アンダースコア接尾辞を割り当てる必要があります。

クラス SomeClass (プライベート: int length_; )
名前とタイプを除けば、スコープが最も重要です。 大切な財産変数。 アクセス修飾子をアンダースコアの形式で明示的に指定すると、クラス メンバーとローカル変数の間の混乱がなくなります。 クラス変数はメソッド変数よりも重要であり、より慎重に扱う必要があるため、これは重要です。

アンダースコア接尾辞の追加の効果は、値設定メソッドとコンストラクターの名前付けの問題を解決することです。

Void setDepth (int 深さ) ( Depth_ = Depth; )
問題は、アンダースコアには接尾辞としてと接頭辞としての 2 つのオプションがあることです。 どちらのオプションも広く使用されていますが、読みやすさが向上するため、最初のオプションをお勧めします。 変数のアクセス修飾子の決定は、時々物議を醸す問題であることに注意してください。 ただし、この推奨方法は支持者を獲得しており、専門家の間でより一般的になりつつあるようです。

12. カスタム変数には、その型と同じ名前を付ける必要があります。

Void setTopic(Topic* topic) // NOT: void setTopic(Topic* value) // NOT: void setTopic(Topic* aTopic) // NOT: void setTopic(Topic* t) void connect(Database* Database) // NOT : void connect(Database* db) // NOT: void connect (Database* oracleDB)
使用される用語や名前の数を減らして複雑さを軽減します。 また、変数名だけで型を認識しやすくなります。

調整不可能な変数には、その目的とタイプに基づいて名前を付けることができます。

点の開始点、中心点;

名前ログイン名;

13. すべての名前は英語で書く必要があります。

一時的な値やインデックスを格納するために使用される一時変数名は短くするのが最善です。 このような変数を読み取るプログラマは、その値がコードの数行を超えて使用されないと想定できるはずです。 通常、これらは変数です , j, k, , メートル, n(整数の場合)、また cそして d(シンボル用)。

15. オブジェクト名は明示的に指定されません。メソッド名にオブジェクト名を指定することは避けてください。

(第 16 条が欠落しています。 - 訳者注)

3.2 特別な命名規則
17. 言葉取得/設定 属性に直接アクセスする場合はどこでも使用する必要があります。

従業員.getName(); 従業員.setName(名前); マトリックス.getElement(2, 4); マトリックス.setElement(2, 4, 値);
C++ 開発者コミュニティでの一般的な慣行。 Java では、この規則は多かれ少なかれ標準になっています。

18. 言葉計算する 何かを計算するメソッドで使用できます。

ValueSet->computeAverage(); 行列->computeInverse()
これが時間のかかる操作であることを読者にすぐに理解してもらいます。

19. 言葉探す 任意の検索を実行するメソッドで使用できます。

Vertex.findNearestVertex(); マトリックス.findMinElement();
これは多くの計算を必要としない単純な検索方法であることを読者にすぐに知らせてください。

20. 言葉初期化する オブジェクトまたはエンティティが初期化される場合に使用できます。

Printer.initializeFontSet();
イニシャルのアメリカ版が優先されるべきです zイギリスのイニシャルではなく e s e. 略語 init は避けてください。

21. GUI を表す変数には、コンポーネントの型名に対応する接尾辞を付ける必要があります。

MainWindow、propertiesDialog、widthScale、loginText、leftScrollbar、mainForm、fileMenu、minLabel、exitButton、yesToggle など。
名前によって変数の型、つまりオブジェクトのリソースに関する直接のヒントがユーザーに与えられるため、読みやすさが向上します。

22. オブジェクトのセット (コレクション) を表すには複数形を使用する必要があります。

ベクター ポイント; int 値;
名前によって、変数の型とそれらの要素に適用できる操作についての直接のヒントがユーザーに与えられるため、読みやすさが向上します。

23. プレフィックス n オブジェクトの数を表すために使用する必要があります。

N ポイント、n ライン
この表記法は数学から取られており、オブジェクトの数を表すための確立された規則です。

24. サフィックスいいえ エンティティ番号を示すために使用する必要があります。

テーブルNo、従業員No
この表記法は数学から取られており、エンティティの数を表すための確立された規則です。

もう 1 つの良い代替手段はプレフィックスです : iTable、iEmployee。 これにより、これが名前付きイテレータであることが明確になります。

25. イテレータ変数には名前を付ける必要があります私、j、k

For (int i = 0; i< nTables); i++) { : } for (vector::iterator i = list.begin(); i != list.end(); i++) ( 要素 element = *i; ... )
この表記法は数学から取られており、反復子の表記法として確立された規則です。

名前付きの変数 j, kネストされたループ内でのみ使用することをお勧めします。

26. プレフィックスブール変数とメソッドにのみ使用してください。

IsSet、isVisible、isFinished、isFound、isOpen
C++ 開発コミュニティでは一般的な手法で、Java でも使用されることがあります。

このプレフィックスを使用すると、次のような名前が削除されます。 状態または フラグ. ステータスまたは フラグです単純に適合しないため、プログラマはより意味のある名前を選択する必要があります。

場合によっては、接頭辞 別のものに置き換えた方が良いでしょう: もっている, できるまたは すべき:

ブール値 hasLicense();

bool canEvaluate();

bool shouldSort();
27. 適切な操作には対称名を使用する必要があります。

取得/設定、追加/削除、作成/破棄、開始/停止、挿入/削除、増分/減分、古い/新しい、開始/終了、最初/最後、上/下、最小/最大、次/前、古い/新規、開く/閉じる、表示/非表示、一時停止/再開など。

対称性により複雑さを軽減します。
28. 名前の略語は避けるべきです。

ComputeAverage(); // そうではありません: compAvg();

2種類の言葉を見てみましょう。 1 つ目は、辞書に掲載されている、省略できない一般的な単語です。 決して省略しないでください:

コマンドの代わりに Cmd、copy の代わりに cp、point の代わりに pt、compute の代わりに comp、initialize の代わりに init など。

2 番目のタイプは、特定の領域に固有の単語であり、省略形/短縮形で知られています。 省略して書く必要があります。 決して書かないでください:

html の代わりに HypertextMarkupLanguage、CPU の代わりに CentralProcessingUnit、pe の代わりに PriceEarningRatio など。
29. ポインターの追加の名前付けは避けるべきです。

行* 行; // 推奨されません: Line* pLine;

// 推奨されません: Line* linePtr;
このような名前が、二重否定を伴う論理否定演算子と組み合わせて使用​​される場合に問題が発生します。 結果がマイナスになる必要はない !が見つかりません.

31. 列挙型の定数には、型の共通名であるプレフィックスを付けることができます。

列挙型カラー (COLOR_RED、COLOR_GREEN、COLOR_BLUE);
これにより、 追加情報宣言がどこにあるか、1 つの列挙でどのような定数が記述されているか、また定数がどのような概念を表しているかについても説明します。

もう 1 つのアプローチは、定数をその一般的な型 (Color::RED、Airline::AIR_FRANCE など) で参照することです。

enum 名は通常、enum Color (...) のように単数形で記述されることに注意してください。 複数名は、宣言するときは適切に見えますが、実際の使用ではうまく機能しません。

32. 例外クラスにはサフィックスを付ける必要があります例外 .

クラス AccessException ( : )
例外クラスは実際にはプログラム アーキテクチャの一部ではなく、このように名前を付けることで他のクラスから分離されます。

33. 関数 (値を返すメソッド) は、何を返すかに応じて名前を付ける必要があり、プロシージャは、何を実行するか (void メソッド) に応じて名前を付ける必要があります。

可読性を向上させます。 この名前付けにより、メソッドが何を実行し、何を実行しないのかが明確になり、コードから潜在的な可能性が排除されます。 副作用.

4つのファイル

4.1 ソースファイル
34. C++ ヘッダー ファイルには拡張子を付ける必要があります。.h (好ましい) または.hpp 。 ソースコードファイルには拡張子が付いている場合があります.c++ (推奨).C , .cc または.cpp .

MyClass.c++、MyClass.h
これらは、C++ 標準によって承認された拡張機能です。

35. クラスはヘッダー ファイルで宣言し、ソース コード ファイルで定義 (実装) する必要があります。ファイル名はクラス名と同じです。

MyClass.h、MyClass.c++

クラス関連のファイルを見つけやすくなります。 明らかな例外はテンプレート クラスであり、ヘッダー ファイルで宣言および定義する必要があります。

36. すべての定義はソース コード ファイル内に存在する必要があります。

Class MyClass ( public: int getValue () (return value_;) // NOT! ... private: int value_; )
ヘッダー ファイルはインターフェイスを宣言し、ソース コード ファイルはインターフェイスを実装します。 プログラマーが実装を見つける必要がある場合、ソース コード ファイル内でそれが見つかることを確認する必要があります。

37. ファイルの内容は 80 列を超えてはなりません。

80 桁は、エディタ、端末エミュレータ、プリンタ、デバッガで広く使用されている解像度です。 ファイルは異なる人の間で転送されるため、これらの制限に従う必要があります。 適切な改行により読みやすさが向上します。 一緒に働くソースコードの上にあります。

38. 使用できません 特殊文字(TAB など) と改ページ。

このようなシンボルは、共同開発プログラムやクロスプラットフォーム環境で使用されるエディタ、ターミナル エミュレータ、およびデバッガで多くの問題を引き起こします。

39. 破線の不完全性は明らかであるはずです。

合計合計 = a + b + c + d + e; 関数 (param1、param2、param3); setText("長い行を" "2 つの部分に分割"); for (int テーブル番号 = 0; テーブル番号< nTables; tableNo += tableStep) { ... }
行区切りは、上記の 80 列制限に違反すると表示されます。 内訳に対する厳密なルールを与えるのは困難ですが、上記の例は一般原則を示しています。

一般的に:

  • 小数点の区切り;
  • 演算子の後にブレーク;
  • レベリング 改行前の行の式の始まりで。
4.2 ファイルのインクルード
40. ヘッダー ファイルにはネスト保護が含まれている必要があります。

#ifndef COM_COMPANY_MODULE_CLASSNAME_H #define COM_COMPANY_MODULE_CLASSNAME_H: #endif // COM_COMPANY_MODULE_CLASSNAME_H
この設計により、コンパイル エラーを回避できます。 この規則により、プロジェクト構造内でのファイルの位置を確認できるようになり、名前の競合を防ぐことができます。

41. 包含ディレクティブは、(システム階層内の場所、下位レベルから上位の位置によって) ソートし、グループ化する必要があります。 グループの間には空白行を入れてください。

#含む #含む #含む #含む #include "com/company/ui/PropertiesDialog.h" #include "com/company/ui/MainWindow.h"
包含パスは絶対パスである必要はありません。 代わりにコンパイラ ディレクティブを使用する必要があります。

42. Include ディレクティブはファイルの先頭にのみ配置する必要があります。

一般的な練習。 ソース コード ファイルの途中にある「隠し」インクルードによって引き起こされる可能性のある望ましくない副作用を回避します。

5 表現

5.1 種類
43. 1 つのファイルで使用されるローカル型は、そのファイル内でのみ宣言する必要があります。

情報の隠蔽を改善します。

44. クラスセクション公共 , 保護された そしてプライベート 並べ替える必要があります。 すべてのセクションを明示的に指定する必要があります。

まずセクションがあるはずです 公共これにより、クラスについて知りたい人はセクションを読む手間が省けます。 保護された/プライベート.

45. 型キャストは明示的に行う必要があります。 暗黙的な型キャストには決して依存しないでください。

FloatValue = static_cast (intValue); // そうではありません: floatValue = intValue;
これにより、プログラマは型の違いを認識しており、混乱が意図的であることを示します。

5.2 変数
46. 変数は宣言された場所で初期化する必要があります。

これにより、変数がいつでも使用できることが保証されます。 しかし、場合によってはこれができない場合があります。

Int x、y、z;
getCenter(&x, &y, &z);

このような場合、変数に値を割り当てるのではなく、変数を初期化しないままにしておく方が良いでしょう。

47. 変数には二重の意味があってはなりません。

提示されるすべての概念に一貫性があるようにすることで、読みやすさが向上します。 副作用によるエラーの可能性を軽減します。

48. グローバル変数の使用は避けるべきです。

C++ ではグローバル変数を使用する理由はありません (実際にはあります。 - 翻訳者注)。 スコープがファイル全体であるグローバル関数と (静的) 変数についても同様です。 49. クラス変数を次のように宣言しないでください。 .

公共 これらの変数は、情報の隠蔽とカプセル化の原則に違反します。 代わりに、修飾子付きの変数を使用してくださいプライベート

および関連するアクセス機能。 例外は、動作を持たないクラスであり、実際にはデータ構造 (C 言語の構造と同等) です。 この場合、これらの変数を非表示にしても意味がありません。

C++ の構造は C との互換性のためだけに保持されていることに注意してください。 これらを使用すると、コードの可読性が損なわれます。 構造体の代わりにクラスを使用します。

(第 50 条が欠落しています。 - 訳者注)
Float* x; // 推奨されません: float *x; 内部&Y; // 非推奨: int

変数がポインターまたは参照であるということは、名前ではなく型を指します。 C プログラマーは別のアプローチを取ることがよくありますが、C++ ではこの推奨事項に従う方が賢明です。

(第 52 条が欠落しています。 - 訳者注)

53. ブール (論理) 変数とポインターとゼロとの暗黙的な比較は避けるべきです。
If (nLines != 0) // 推奨されません: if (nLines) if (value != 0.0) // 推奨されません: if (value)

C++ 標準では、ゼロに等しい int および float 変数の値がバイナリ 0 として表現されることは保証されていません。また、明示的な比較では、比較される型が表示されます。

たとえば、if (line) ではなく if (line == 0) のように、ポインタも暗黙的にゼロと比較されるべきではないと考えるのは論理的です。 後者は C/C++ では非常に一般的な方法なので、使用することもできます。

これにより、変数の効果と副作用を制御しやすくなります。

5.3 サイクル
55. for() 構造には、ループ制御に関連しない式を含めることはできません。

合計 = 0; // NOT: for (i = 0, sum = 0; i< 100; i++) for (i = 0; i < 100; i++) sum += value[i]; sum += value[i];
サポートと読みやすさを向上させます。 サイクルの制御は、サイクルに含まれるものとは厳密に分離してください。

56. ループに関連する変数はループの直前に初期化する必要があります。

57. Do-while ループは回避できます。

このようなループは、条件が本文の後に記述されるため、読みにくくなります。 読者はサイクル全体を見て、それがどのように機能するかを理解する必要があります。

Do-while ループは厳密にはまったく必要ありません。 このようなループは次のように置き換えることができます。 while ループまたはのために。

使用する構成要素が少なくなると、可読性が向上します。

58. 使用を避ける壊す そして続く サイクルで。

このような表現は、可読性を高める場合にのみ使用してください。

(第 59 条が欠落しています。 - 訳者注)

60. 無限ループの場合は、次の形式を使用する必要がありますその間(本当) .

While (true) ( : ) for (;;) ( // NO! : ) while (1) ( // NO! : )
誰かのためのテストは不必要であり、意味がありません。 for (;;) 形式はあまり読みにくくなっています。 ループが無限であることも明らかではありません。

5.4 条件文
61. 複雑なキャッチフレーズは絶対に避けてください。 代わりに、ブール変数を入力します。

Bool isFinished = (要素番号< 0) || (elementNo >maxElement); bool isRepeatedEntry = elementNo == lastElement; if (isFinished || isRepeatedEntry) ( : ) // NOT: if ((elementNo< 0) || (elementNo >maxElement)||
elementNo == lastElement) ( : )

式にブール変数を設定すると、プログラムが自己文書化されます。 設計は読みやすく、デバッグし、保守しやすくなります。 62. 期待されるパーツはパーツ内にあるはずです もし、例外 - 一部 .

それ以外
Bool isOk = readFile(ファイル名); if (isOk) ( : ) else ( : )

これは、例外によって通常の実行が難読化されないようにするのに役立ちます。 読みやすさとパフォーマンスにとって重要です。

63. 条件は別の行に配置する必要があります。

64. 利用規約における実行可能な表現は厳密に避けるべきです。
ファイル* fileHandle = open(fileName, "w"); if (!fileHandle) ( : ) // そうではない: if (!(fileHandle = open(fileName, "w"))) ( : )

条件内の実行可能な式は読みやすさを複雑にします。 これは、C/C++ の初心者に特に当てはまります。
5.5 その他

数値自体に明確な意味がない場合は、名前付き定数を導入することで可読性が向上します。 別のアプローチは、定数へのアクセスに使用できるメソッドを作成することです。

66. 浮動小数点定数は小数点を使用して記述し、次のように示す必要があります。 少なくとも小数点以下 1 桁。

二重合計 = 0.0; // 推奨されません: 二重合計 = 0; 倍速 = 3.0e8; // 推奨されません: 倍速 = 3e8; 二重和。 : 合計 = (a + b) * 10.0;
これは、整数と浮動小数点数を扱うときのさまざまなアプローチを強調しています。 数学的な観点から見ると、これら 2 つのモデルは完全に異なり、互換性がありません。

また、(上の最後の例で示したように) 変数 (合計) の型が明確ではない場所で強調されています。

67. 浮動小数点定数は、常に小数点の前に少なくとも 1 桁を付けて記述する必要があります。

C++ の数値と式のシステムは数学から派生したものであるため、可能な限り従来の表記法に従う必要があります。 とりわけ、0.5 は .5 よりも読みやすいです (最初のオプションを数字の 5 と混同しないでください)。

68. 関数は戻り値の型を指定する必要があります。

Int getValue() // NOT: getValue() ( : )
明示的に指定しない限り、C++ は戻り値が int 型であると想定します。 これに慣れていないプログラマが混乱する可能性があるため、これに依存しないでください。

69. 使用すべきではない後藤 .

このステートメントは構造化プログラミングの原則に違反します。 他のオプションが明らかに可読性を損なう非常にまれなケース (たとえば、深くネストされたループを終了する場合) にのみ使用する必要があります。

70. 「NULL」の代わりに「0」を使用する必要があります。

NULL は C 標準ライブラリの一部であり、C++ では非推奨です。

6 デザインとコメント

6.1 設計
71. メインのインデントは 2 つのスペースである必要があります。

(i = 0; i の場合)< nElements; i++) a[i] = 0;
1 つのスペースのインデントは、コードの論理構造を反映するのに十分な大きさです。 スペースが 4 つを超えるインデントがあると、深くネストされたコードが読めなくなり、改行が必要になる可能性が高くなります。 2、3、または 4 個のスペースを使用するオプションが広く使用されています。 そして2と4 - より広範囲に。

72. コード ブロックは例 1 (推奨) または例 2 に示すようにフォーマットする必要がありますが、例 3 に示すようにフォーマットすることはできません。関数とクラスのフォーマットは例 2 に従う必要があります。

While (!done) ( doSomething(); 完了 = moreToDo(); )

While (!done) ( doSomething(); 完了 = moreToDo(); )

While (!done) ( doSomething(); 完了 = moreToDo(); )
例 3 では、不必要なインデントが使用されているため、コードの論理構造が明確に示されていません。

73. クラス宣言

クラス SomeClass: public BaseClass ( public: ... protected: ... private: ... )
上記のルールの特定の結果。

74. メソッドの定義は次のようにフォーマットする必要があります。

Void someMethod() ( ... )

75. 建設 if-else 次のようにフォーマットする必要があります。

If (条件) ( ステートメント; ) if (条件) ( ステートメント; ) else ( ステートメント; ) if (条件) ( ステートメント; ) else if (条件) ( ステートメント; ) else ( ステートメント; )
上記のルールから必然的に得られます。 さらに、書くことは、 それ以外最初のブロックの右中括弧と同じ行にあるのは不正ではありません。

If (条件) ( ステートメント; ) else ( ステートメント; )
各 if-else 部分を別の行に配置することをお勧めします。 これにより、ブロックの移動などのコードの操作が容易になります。 それ以外.

76. サイクルのために 次のようにフォーマットする必要があります。

For (初期化; 条件; 更新) (ステートメント; )
上記のルールから必然的に得られます。

77. サイクルのために 本文が空の場合は、次のようにフォーマットする必要があります。

For (初期化; 条件; 更新) ;
本文が空であることを読者に強調します。 ただし、肉体のないサイクルは避けるべきです。

78. サイクルその間 次のようにフォーマットする必要があります。

While (条件) (ステートメント; )
上記のルールから必然的に得られます。

79. サイクルしながら 次のようにフォーマットする必要があります。

Do ( ステートメント; ) while (条件);
上記のルールから必然的に得られます。

80. 建設スイッチ 次のようにフォーマットする必要があります。

Switch (条件) ( case ABC: ステートメント; // 「break」がありません case DEF: ステートメント; Break; case XYZ: ステートメント; Break; デフォルト: ステートメント; Break; )
すべての単語に注意してください 場合構造全体に対してインデントがあり、それを強調表示するのに役立ちます。 コロンの前のスペースにも注意してください。 キーワードがどこかに欠けている場合 壊す、その場合、コメントはこれに関する警告として機能するはずです。 プログラマはこの単語を入れ忘れることが多いため、意図的に省略する場合は特別に説明する必要があります。

81. 建設トライキャッチ 次のようにフォーマットする必要があります。

Try ( ステートメント; ) catch (例外&例外) ( ステートメント; )
上記のルールから必然的に得られます。 構成内の閉じ中括弧に関する質問 if-else、こちらもお申込みください。

82. デザインが if-else 本文に式が 1 つだけ含まれている場合、中括弧は省略できます。

If (条件) ステートメント; while (条件) ステートメント; for (初期化; 条件; 更新) ステートメント;
中括弧は省略しないことをお勧めします。

83. 関数の戻り値の型は、関数自体の名前の上に配置できます。

Void MyClass::myMethod(void) ( : )
このようにして、関数は 1 列に整列されます。

6.2 スペース
84.

演算子はスペースで区切る必要があります。
- 予約後 キーワード C++ ではスペースを使用する必要があります。
- カンマの後にはスペースを入れる必要があります。
- コロンはスペースで区切る必要があります。
- ループ内のセミコロンの後 のためにスペースを含める必要があります。

A = (b + c) * d; // 推奨されません: a=(b+c)*d while (true) // 推奨されません: while(true) ( ... doSomething(a, b, c, d); // 推奨されません: doSomething (a ,b,c,d); case 100: // 推奨されません: case 100: for (i = 0; i< 10; i++) { // НЕ РЕКОМЕНДУЕТСЯ: for(i=0;i<10;i++){ ...
式の個々の部分を強調表示します。 可読性が向上します。 C++ の空白に関する包括的な推奨事項を提供することは困難です。 上記の推奨事項は一般原則を示す必要があります。

85. メソッド名の後に別の名前が続く場合は、スペースを続けることができます。

DoSomething(現在のファイル);
個人名を強調表示します。 可読性が向上します。 それ以上の名前がない場合は、スペースを省略できます (doSomething())。

もう 1 つの方法は、左括弧の直後にスペースを指定することです。 doSomething(currentFile); のように、これを使用する人は通常、閉じ括弧の前にスペースを入れます。 これにより、個々の名前を強調表示することができます。 右括弧の前のスペースは不自然に見えますが、それがないと式が非対称に見えます (doSomething(currentFile);)。

86. コード内の論理ブロックは空行で区切る必要があります。

Matrix4x4 行列 = 新しい Matrix4x4(); double cosAngle = Math.cos(角度); double sinAngle = Math.sin(角度); 行列.setElement(1, 1, cosAngle); 行列.setElement(1, 2, sinAngle); 行列.setElement(2, 1, -sinAngle); 行列.setElement(2, 2, cosAngle); 乗算(行列);
可読性が向上します。

これにより、より目立たせることができます。

88. 宣言内の変数は整列させることができます。

AsciiFile* ファイル; int nPoints; 浮動小数点 x、y;
可読性が向上します。 カップルがよりはっきりと見える 型 - 変数.

89. 読みやすさを向上させる場合は、配置を使用します。

If (a == lowValue) compueSomething(); else if (a == mediaValue) computeSomethingElse(); else if (a == highValue) computeSomethingElseYet(); 値 = (ポテンシャル * 油密度) / 定数 1 + (深さ * 水密度) / 定数 2 + (z座標値 * ガス密度) / 定数 3; minPosition = computeDistance(min, x, y, z); 平均位置 = computeDistance(平均, x, y, z); スイッチ (値) ( case PHASE_OIL: strcpy(phase, "Oil"); ブレーク; case PHASE_WATER: strcpy(phase, "Water"); ブレーク; case PHASE_GAS: strcpy(phase, "Gas"); ブレーク; )
以前に確立されたルールに違反している場合でも、コードをさらに調整できる場合が多くあります。

6.3 コメント
90. トリッキーな動きを使って書かれた複雑なコードはコメントするべきではなく、書き直す必要があります。

コメントはできるだけ少なくし、適切な名前を選択し、明確な論理構造を作成することでコードを自己文書化する必要があります。

91. すべてのコメントは英語で書かれるべきです。

国際的な環境では、英語が優先される言語です。

92. 使用する//複数行のコメントを含むすべてのコメント。
// 複数行にわたるコメント。 //
この推奨事項に従う場合、複数行のコメント /* */ デバッグやその他の目的に使用できます。

// スペースを入れる必要があり、コメント自体は大文字で始まりピリオドで終わる必要があります。

93. コメントは、説明している内容に関連するように配置する必要があります。

94. クラスとメソッドのヘッダーに関するコメントは、JavaDoc の規則に従う必要があります。

Java プログラマーは、開発キットの一部である標準 Javadoc 自動化ツールのおかげで、ドキュメントに対してより高度なアプローチを採用しています。このツールを使用すると、コード内のコメントから HTML ドキュメントを自動的に生成できます。

同様のツールが C++ にも存在します。 これらは JavaDoc と同じタグ構文規則に従います (たとえば、Doc++ または Doxygen を参照)。

7 リンク

  • コードの完成、Steve McConnell - Microsoft Press
  • C++ でのプログラミング、ルールと推奨事項、M Henricson、e. ナイキスト、エレムテル (スウェーデンの通信):

いくつか説明してみましょう。 C 言語では、プログラムは複数のプログラム単位で構成されており、それぞれが関数です。 C の関数は、Fortran の関数やサブルーチン、Pascal のプロシージャに似ていますが、関数名は任意に選択されます (ラテン文字のみ)。 主要、ここでプログラムの実行が始まります。 このようなメイン関数は通常、メイン プログラムと同じファイル内にある他の関数、または事前トレーニングされた関数のライブラリから取得された他の関数を呼び出します。 主要には引数がないので、リストは次のようになります。 () 。 括弧 { } アルゴリズム自体を実装する演算子をフレーム化します。 これらの括弧は、Pascal の BEGIN - END に似ています。
ライン int a、b、c;発表する a、b、c整数型の変数。 プログラムで使用される変数はすべて宣言する必要があります。 次に代入演算子が来ます。 ある意味 5 、そしてへ b - 7 , - それらの合計の値。 型変数の値 整数範囲内にあります [-32768; 32767]. 関数 プリントフ表示: 合計 = 12.

では関数を考えてみましょう スキャンフフォーマットされたデータ入力用に設計されています。 関数 スキャンフ変数アドレスの値ではなく、実際のパラメータとして変数アドレスを使用します。 これを行うには、対応するパラメータの前に記号を配置します。 & - アドレスを取得するための記号。 例えば、 &XL「変数アドレス」を意味します XL"、変数が現在持っている値ではありません。

関数の形式文字列 スキャンフどのようなデータが入力として期待されるかを指定します。 関数の書式指定文字列に記号が含まれている場合 % 変換文字が後に続く場合、空白以外の文字が見つかるまで文字をスキップします。

以前のプログラムには 1 つの欠点があります。合計を計算するプログラムは、次のような 1 つの特定のケースにのみ適しています。 a=5、b=7。 対応する代入演算子を関数呼び出しに置き換えて改善してみましょう。 スキャンフ(例 1.2):

フォーマット文字列は関数を指定します スキャンフ変数に入れる10進数を入力します ある次に、変数に割り当てる必要がある 2 番目の 10 進数をスペースで区切って入力します。 bプログラムは commintarium という行で始まることに注意してください。 /* .. */ , コンパイラは /* と */ の間の文字をスキップし、説明のために使用できます。