C プラスプラス言語標準。 C プログラミング言語を効果的に学習する理由と方法: モジュール性の問題を習得するためのリソースの包括的なセレクション

07.12.2023

歌詞の紹介。
コンピュータサイエンス学部にはYaSiTP(C言語とプログラミング理論)という科目があります。 ISIT の学生は 3 年生でこの分野を学びますが、原則として特別な問題はありません。 そして、ICを持つ不幸な学生は、大学滞在の最初の数週間からICを使ってプログラミングの勉強を始めなければなりません。 学校でコンピュータサイエンスを少なくとも少しは勉強していて、Pascal に精通していれば、すべてがうまくいくでしょう。彼は構文を学び、冒とく的な言葉や個別の言葉に駆り立てられ続けるでしょう。 教えていない、知らない場合はどうなりますか? つまり、完全にでも?
それならあなたのビジネスはくだらない\悪いです。
第一に、フレボストロエフの講義中は眠らないこと。 4 番目のペアで彼の測定された声の下で昼寝をしないことほど難しい課題はありませんが、... すべてはあなた次第です。
2 番目: http://www.ph4s.ru/bookprogramir_1.html などの本を読み始めます。そこでは、ボガティレフの本「完全バカのためのプログラミング ガイド」またはその他の好みに合わせた本が見つかります。
3 番目、そしておそらく最も重要なことは、「練習」です。 それについて私は話します。
自宅で何かを書く前に、適切なスタジオをセットアップする必要があります。 ほぼすべての MKN 2012 の経験に基づくと、Vidul Studio 2010 C++ Express のセットは動作しません。 大学のコンピューターに完璧に書かれているものを、彼女は修正の余地なくエラーで読んでいます。 なぜ私たちのビジネスではないので、Visual Studio 2010 (2012) Ultimate (Visual Studio Ultimate 2012) を探しています。 たとえばここ: http://www.microsoft.com/visualstudio/ru... 。 体験版をインストールしてから練習を始めてください。

(注1:
ファイル - 追加の保存パラメータ - キリル文字ドキュメント。 そうすれば、コンソールは通常通りロシア語の文字を読み上げます。

注2: 提示されたコードから本格的なプログラムを取得するには、Visual Studioで新しいプロジェクトを作成し、「空のプロジェクト」項目を選択し、「ソースコードファイル」フォルダー内でプロジェクト名を指定する必要があります。をクリックして新しい要素「C++ ファイル」を追加し、表示されたウィンドウにコードをコピーしてコンパイルし (コントロール キー + F5)、その後、自分で同様の内容を作成してみてください。)

練習する。
古典的なプログラミングは、基本的な「hello world!」プログラムを書くことから始まります。
フォーラムには、C++ 以外のさまざまな言語でこのプログラムに関するスレッドがいくつかあります。コードは次のとおりです。

#include "stdio.h" #include "conio.h" int main(int argc, char* argv) ( printf("Hello, World!\n"); )

このタイプの簡単なプログラムをいくつか作成することも役に立ちます (たとえば、これは、事前にわかっているデータを使用して方程式の結果を表示します)。

// tytytyty.cpp: コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv) ( int x , y , z; x = 9; y = 4; z = x*y; printf("%d", z) ;)

次に、より複雑になります (このプログラムは 2 つの入力値を読み取り、入力された値を使った方程式の結果を返します)。

#include "stdio.h" void main() ( int x , y , z; scanf("%d, %d", &x, &y); z = x*y; printf("%d", z); )

「hello world!」の後に先生が与えた次のプログラムは次のようになりました。
条件: 正方形とそれに内接する円が与えられます。 正方形の一辺がわかっている場合は、円の外側に残っている正方形の面積の半分を求めます。
解決:

#include "stdio.h" #include "math.h" #define PI 3.1415926535897932384626433832795 void main() ( double x; printf("正方形 x の辺の値を入力 = "); scanf("%lf", &x); ダブル y = x / 2; ダブル f = x * x; ダブル s = (f - z);

オプションとして定数ライブラリを使用します。

#define _USE_MATH_DEFINES #include "stdio.h" #include "math.h" void main() ( double x; printf("x = "); scanf("%lf", &x); double y = x / 2;ダブル f = x * x; ダブル z = M_PI * y * y;

タスク 2 のプログラム番号 5。 条件: 指定された係数を使用して二次方程式を解きます。
実装:

#include "stdio.h" #include "math.h" #include "conio.h" int main() ( float x , x1, sq, a, b, c; printf("Vvedite znachenija a, b, c: "); scanf("%f, %f, %f", &a, &b, &c); if (a == 0) ( x = - c / b; printf("%f", x); ) else ( float k; k = b * b - 4 * a * c; if (k< 0) { printf("Kornei net!"); } else if (k == 0) { x = - b / (2 * a); printf("%f", x); } else { sq = sqrt(k); x = (-b + sq) / (2 * a); x1 = (-b - sq) / (2 * a); printf("%f, %f", x, x1); } } getch(); return 0; }

(注意!! ライブラリを指定する場合、大なり小なり記号の代わりに引用符があらゆる場所に表示されます)

追記: 他のタスクは後で追加されます。

この本は C++ プログラミング言語の入門書です。 この本と C++ for Dummies の以前の版の主な違いは、内容の簡潔さにもかかわらず、以前の版では読者の C プログラミング言語の知識に依存していたのに対し、この版では読者に追加の知識が必要ないことです。 、この本では非常に厳密に説明されているため、この本の助けを借りて C++ でのプログラミングの基礎を学習した読者は、もう困難に遭遇することはありません。
さらなる言語学習中に。
この本は、Windows 用のプログラミング方法や、マウスを 2 回クリックするだけで美しいインターフェイスを作成する方法を教えているわけではありません。 その中で提示されている内容は、特定のコンパイラーやオペレーティング システムに関連付けられていません。 プロのプログラマーには役に立たないと思われますが、プログラミング言語についての深い知識を得ることが目標で、どこから始めればよいかわからない場合には、この本が最適です。

C++とは何ですか。
C++ は、ANSI および国際標準化機構 (ISO) の標準を満たすオブジェクト指向の低レベル プログラミング言語です。 オブジェクト指向 C++ は、大規模なプログラムのコーディングと拡張を容易にするプログラミング スタイルをサポートすることを意味します。 C++ は低レベル言語であるため、非常に効率的で高速なプログラムを生成できます。

オブジェクト指向プログラミング言語である C++ は柔軟性と拡張性に優れているため、大規模なプロジェクトに適しています。 現在、C++ は、あらゆるタイプのアプリケーションを開発するための最も人気のあるプログラミング言語の 1 つです。 パーソナル コンピューター上で実行される最新のプログラムのほとんどは C++ で書かれています。

コンテンツ
目次6
はじめに 17
パート 1. C++ についての最初の知識 23
第 1 章: 初めてのプログラムの作成 25
第 2 章 変数宣言の知恵 41
第 3 章: 数学の実行 50
第 4 章: 論理演算の実行 55
第5章 プログラム制御ステートメント 66
パート 2. 関数型プログラマーになる 79
第 6 章: 関数の作成 81
第7章 シーケンスを配列に保存する 92
第 8 章 C++ でのポインター入門 105
第 9 章 ポインタの 2 番目の知識 117
第10章 C++ プログラムのデバッグ 128
パート 3: クラスの紹介 143
第 11 章: オブジェクト指向プログラミングの概要 145
第12章 C++ のクラス 149
第13章 クラスの操作 154
第14章 オブジェクトへのポインター 167
第 15 章 保護されたクラスのメンバー: 邪魔しないでください! 181
第16章 オブジェクトの作成と削除 188
第17章 デザインの議論 198
第18章 コピーコンストラクター 213
第19章 静的メンバー 224
パート 4. 継承 231
第20章 クラスの継承 233
第 21 章: 仮想メンバー関数の紹介: それは本当ですか 240
第22章 クラス分解 249
パート 5. 便利な機能 269
第23章 代入演算子 271
第 24 章: I/O ストリームの使用 277
第 25 章: エラーと例外の処理 290
第26章 多重継承 298
第27章 C++ テンプレート 308
第28章 標準テンプレートライブラリ 317
パート 6. マグニフィセント テン 329
第29章 間違いを避ける10の方法 331
第 30 章 Dev-C++ のトップ 10 機能 336
第 31 章 予算 343 プログラム
応用。 付属CD379の内容
ピクトグラム
主題インデックス 380。


電子書籍を便利な形式で無料でダウンロードして、視聴して読んでください。
書籍 C++ for Dummies、Stefan Randy Davis をダウンロード - fileskachat.com、高速かつ無料でダウンロードできます。

C++ プログラミング言語(「サイ プラス プラス」と発音) は、オブジェクト指向プログラミングをサポートするマルチパラダイム プログラミング言語です。 Bell Labs の Bjarne Stroustrup は、C プログラミング言語を基礎として、1980 年代に C++ プログラミング言語を開発しました。 C の絶大な人気のおかげで、C++ プログラミング言語は 1990 年代を通じて最も人気のある言語になりました。 初心者向けのプログラミング。 そして、今日に至るまで商用アプリケーションで非常に広く使用されています。 C++ プログラミング言語は、プログラマーが C のルーツ (プレーン C で書かれたライブラリなど) を放棄することなく、ますます複雑になるシステムを開発できるため、商用アプリケーションで C に取って代わりました。 オブジェクト指向設計に加えて、今日の C++ は、汎用プログラミングとテンプレート メタプログラミングのサポートにおいて C とは異なります。 これは、型エイリアス、インライン拡張、テンプレート、および // コメント スタイルのコメントを通じて実装されます (ただし、C ではその後 // コメントが採用されたことに注意してください)。 ダミー向けのプログラミング。

C++の歴史
Stroustrup は、プログラミング フレームワークとして Simula67 に触発されて、1979 年にこの言語の開発に取り組み始めました。 AT&T は 1983 年 8 月にこの言語を初めて使用しました。 元のコンパイラは Cfront と呼ばれていました。 最初の商用リリースは 1985 年 10 月に行われました。 C++ は 1998 年に ISO/IEC 14882-1998 によって標準化されました。

「C++」という名前の歴史
このタイトルは Rick Mascitti (1983 年中頃) のもので、1983 年 12 月に初めて使用されました。 以前、この言語の研究開発期間には、それを「クラス付きの C」と呼ぶのが一般的でした。 最終的な名前は、C と「++」演算子 (変数の値を 1 つ増やす) およびコンピュータ プログラムの拡張機能を示す「+」を含む一般的な名前 (例: 「Wikipedia +」) に由来しています。 (簡単に言えば、プラス記号はプログラムを改良し、新しい機能を与えることを意味します) Stroustrup 氏によれば、「この名前は、C からの変更の進化的な性質を表しています。」 ほとんどの C コードは C++ に対して有効ですが、C は C++ のサブセットではありません。
一部の C プログラマーは、x=3 を宣言すると、次のようになります。 そしてy=x++; 実行すると x= 4 および y = 3; x はその値が y に割り当てられた後にインクリメントされるためです。 ただし、 y=++x; と書くと、 、次に y=4 と x=4 です。
このように考慮すると、実際には C++ のより適切な名前は ++C になる可能性があります。 ただし、C++ と ++C は C の拡張であるため、C++ 形式の方が ++C よりも一般的です。
衒学者は、C++ の導入後も C 言語自体は変更されておらず、最も正確な名前は「C +1」である可能性があることに気づくかもしれません。

C++ の所有権
C++ を話せる人は誰もいません。 Stroustrup と AT&T は、C++ の使用に対してロイヤルティを受け取りません。

番組「こんにちはウィキペディア!」
以下のコードは、メッセージのテキストを出力するプログラムにコンパイルできます。

Include // ヘッダーは std::cout に必要です // main() 関数の始まり int main(int argc, const char**argv) ( // ( ... ) はコード std:: のブロックをインクルードするために使用されます。コート<< "Hello, Wikipedia!\n"; // Outputs the text enclosed by "" return 0; }

クラス定義

std::string を使用してインクルードします。 class InetMessage ( string m_subject, m_to, m_from; public: InetMessage (const string& subject, const string& to, const string& from); string subject () const; string to () const; string from () const; );

C++ ライブラリ
C++ 標準ライブラリは、ほとんどが C 標準ライブラリのスーパーセットです。C++ ライブラリのほとんどには、標準テンプレート ライブラリ (STL) が含まれています。 STL は、イテレータ (高レベルのポインタのようなもの) やコンテナ (新しい要素を含めるために自動的に拡張できる配列のようなもの) などの便利なツールを提供します。 C と同様に、ライブラリ アクセス機能は、標準ヘッダー ファイルをインクルードする #include ディレクティブを使用して実行されます。 C++ では、50 の非推奨の標準ヘッダーが提供されています。

言語の未来
C++ プログラミング言語は、高まる需要に応えるために進化し続けています。 今日に至るまで、コンパイラと開発環境の開発者は、すべての C++ 機能をサポートするのに苦労し続けています (2004 年頃)。この状況は 1998 年から 2003 年の間に大幅に改善されました。 特にグループの 1 つである Boost.org は、C++ プログラミング言語を今日知られているものにするために懸命に努力し、機能する機能と改善が必要な機能について標準委員会に助言しています。 現在の研究は、C++ がマルチパラダイムの性質に基づいて構築されることを示しています。 たとえば、Boost.org でホストされている作品は、C++ プログラミングの機能およびメタ機能を大幅に拡張します。 C++ には変数や関数の命名に関する標準がまだ存在しないため、異なるコンパイラで生成されたコードには互換性がありません。

C プログラミング言語の人気は、特にその過去の成果を思い出すと、過大評価することはできません。 おそらくすべての開発者は、少なくともその存在については知っており、せいぜい、それを使ってプログラミングを試みたことがあるでしょう。 C は、C++、Objective-C、C#、Java などの言語の前身です。

Microsoft は、.Net プラットフォームのネイティブ言語を開発するために C に似た構文を選択しました。 さらに、多くのオペレーティング システムは C で書かれています。

もちろん、C は完璧ではありません。この言語の作成者である Ken Thompson と Dennis Ritchie は長い時間をかけて C 言語を改良しました。 C の標準化はまだ進行中です。 45 年以上前から存在しており、積極的に使用されています。

多くの場合、1 つではなく 2 つのプログラミング言語、C/C++ に関連付けられます。 ただし、以下では「純粋な」C について具体的に説明します。

C 言語のルーツは、1958 年にチューリッヒ工科大学の会議でヨーロッパとアメリカのコンピューター科学者の委員会によって作成された ALGOL (ALGorithmic Language) にあります。 この言語は、FORTRAN 言語のいくつかの欠点に対応し、それらを修正する試みでした。 さらに、C の開発は、Ken Thompson と Dennis Ritchie も取り組んだ UNIX オペレーティング システムの作成と密接に関連しています。

UNIX

MAC (Multiple Access Computer、Machine-Aided Cognition、Man and Computer) プロジェクトは、1963 年に MIT の純粋な研究プロジェクトとして始まりました。

MAC プロジェクトの一環として、CTSS (互換性タイムシェアリング システム) オペレーティング システムが開発されました。 60 年代後半には、BBN、DTSS、JOSS、SDC、多重化情報およびコンピューティング サービス (MULTICS) など、他のいくつかのタイムシェアリング システムが作成されました。

Multics は、MIT、ベル電話研究所 (BTL)、およびゼネラル エレクトリック (GE) の共同作業で、GE-645 コンピューター用のタイムシェアリング オペレーティング システムを開発しています。 Multics を実行している最後のコンピュータは、2000 年 10 月 31 日にシャットダウンされました。

しかし、BTL は 1969 年の初めにこのプロジェクトを放棄しました。

彼の従業員の中には(ケン・トンプソン、デニス・リッチー、スチュ・フェルドマン、ダグ・マキロイ、ボブ・モリス、ジョー・オッサナ)何人かが自分たちで仕事を続けたいと考えていました。 トンプソンは GE-635 で Space Travel ゲームに取り組みました。 最初は Multics 用に書かれ、その後 GE-635 上の GECOS の下で Fortran で書き直されました。 このゲームは太陽系の天体をシミュレートしており、プレイヤーは惑星か衛星のどこかに船を着陸させる必要がありました。

このコンピュータのソフトウェアもハードウェアもそのようなゲームには適していませんでした。 トンプソンは代替手段を探し、放棄された PDP-7 用にゲームを書き直しました。 メモリは8K 18ビットワードで、当時としては美しいグラフィックスを表示するベクトル表示プロセッサも搭載されていた。


画像はslideshare.netより

トンプソンとリッチーは GE のクロスアセンブラーですべての開発を行い、コードをパンチテープに転送しました。 トンプソンはこれを積極的に嫌い、ファイル システムから始めて PDP-7 用の OS を書き始めました。 こうしてUNIXが誕生しました。

トンプソンは、利用可能なあらゆる手段を使用して、自分の設計に従って構築された快適なコンピューティング環境を構築したいと考えていました。 明らかに振り返ってみると、彼のアイデアには、管理の基礎としてのプロセスの概念、ツリーベースのファイル システム、ユーザー プログラムとしてのコマンド インタプリタ、テキスト ファイルの簡素化された表現、および一般的なアクセスなど、Multics の多くのイノベーションが組み込まれていました。デバイス。

PDP-7 UNIX は、BCPL 言語の影響を受けた高級 B 言語の始まりでもありました。 デニス・リッチーは、B は型なしの C であると言いました。 BCPL は 8 KB のメモリに収まり、Thompson によって慎重に再設計されました。 BさんはSさんの中で徐々に成長していきました。


画像はit-world.comより

1973 年までに C 言語は十分に強力になり、もともと PDP-11/20 アセンブリ言語で書かれていた UNIX カーネルの多くが C で書き直されました。 これは、アセンブリ言語以外の言語で書かれた最初のオペレーティング システム カーネルの 1 つです。

C は、UNIX オペレーティング システムの作成時に得られた「関連製品」であることがわかりました。

習近平の祖先

ALGOL-60 言語に触発されて、ケンブリッジ大学の数学研究所はロンドン大学のコンピュータ学部と協力して、1963 年に CPL (Combined Programming Language) 言語を作成しました。

CPL 言語は難しいと考えられていましたが、これに応えて Martin Richardson は 1966 年に BCPL 言語を作成しました。その主な目的はコンパイラーを作成することでした。 今ではほとんど使われなくなりましたが、携帯性の良さからかつては重要な役割を果たしていました。

BCPL は、1970 年代初頭に、OS6 オペレーティング システムや初期段階の Xerox PARC 開発など、いくつかの興味深いプロジェクトで使用されました。

BCPL は Bi (B) 言語の祖先として機能し、ケン トンプソンとデニス リッチーにもよく知られている、すでによく知られている AT&T ベル電話研究所で 1969 年に開発されました。

当時の他のオペレーティング システムと同様に、UNIX はアセンブリ言語で書かれていました。 アセンブラーでプログラムをデバッグするのは本当に面倒です。 トンプソン氏は、OS をさらに開発するには高級言語が必要であると判断し、小規模言語 B を考案しました。トンプソン氏は BCPL 言語を基礎としました。 言語 B は、型のない C と考えることができます。

BCPL、B、および C は、多くの詳細で構文的に異なりますが、基本的には似ています。 プログラムは、一連のグローバル宣言と関数 (手続き) 宣言で構成されます。 BCPL では、プロシージャをネストできますが、プロシージャを含むプロシージャ内で定義された非静的オブジェクトを参照することはできません。 B と C は、ネストされたプロシージャがまったく存在しないという、より厳格な制限を導入することでこの制限を回避します。 各言語 (B の最も古いバージョンを除く) は個別のコンパイルをサポートし、名前付きファイルからのテキストを含める機能を提供します。

B の作成中に発生した広範囲にわたる構文の変更とは対照的に、BCPL の核となるセマンティクス (その型構造と式の評価ルール) はそのまま残りました。 どちらの言語もタイプレスです。つまり、固定長のビットのセットである「ワード」または「セル」という単一のデータ型を持ちます。 これらの言語のメモリはそのようなセルの配列であり、セルの内容の意味はそれに適用される操作によって異なります。 たとえば、「+」演算子は単に add machine 命令を使用してオペランドを加算するだけであり、他の算術演算もオペランドの意味には無関係です。

BCPL、B、C のいずれも、言語内に文字データを割り当てません。 これらは文字列を整数のベクトルとして扱い、一般規則にいくつかの規則を追加します。 BCPL と B の両方で、文字列リテラルは、セルにパックされた文字列文字で初期化された静的領域のアドレスを意味します。

C はどのように作成されたか

1970 年、ベル研究所はプロジェクトのために PDP-11 コンピュータを購入しました。 B は PDP-11 上で実行する準備ができていたため、トンプソンは B の UNIX 部分を書き直しました。

しかし、モデル B と BCPL では、ポインターを扱うときにオーバーヘッドが発生します。ポインターを単語の配列のインデックスとして定義する言語の規則により、ポインターは単語のインデックスになります。 実行中の各ポインター アクセスにより、プロセッサーが予期していたバイト アドレスへのポインターのスケーリングが生成されました。

したがって、文字およびバイトのアドレス指定に対処し、今後の浮動小数点計算のハードウェア サポートに備えるためには、タイピングが必要であることが明らかになりました。

1971 年、リッチーは B の拡張バージョンの作成を開始しました。最初はそれを NB (New B) と呼んでいましたが、言語が B と大きく異なるようになったため、名前は C に変更されました。リッチー自身がそれについて次のように書いています。

私は、その構造が抽象オブジェクトを特徴付けるだけでなく、ディレクトリから読み取れるビットのセットを記述することも望んでいた。 コンパイラはセマンティクスが必要とする名前へのポインタをどこに隠すことができるでしょうか? 構造体がより抽象化されることを意図しており、ポインター用のスペースをどこかに隠すことができたとしても、複雑なオブジェクト (おそらく構造体を含む配列を含む構造体など) にメモリを割り当てるときに、これらのポインターを正しく初期化するという技術的問題をどのように解決すればよいでしょうか。任意の深さまで?

この解決策は、型なし BCPL と型付き C の間の進化の連鎖における決定的な飛躍でした。これにより、ストレージへのポインタの実体化が排除され、代わりに式で配列名が指定されたときにポインタが作成されるようになりました。 現在の C にも引き継がれているルールは、配列値が式で参照されると、その配列を構成する最初のオブジェクトへのポインターに変換されるというものです。

C を以前のバージョンと最も明確に区別する 2 番目の革新は、このより完全な型構造、特に宣言構文の表現力です。 NB は、基本型 int と char、およびそれらの配列とそれらへのポインタを提供しましたが、それらを構成する他の方法はありませんでした。

一般化が必要でした。どの型のオブジェクトでも、複数のオブジェクトを配列に結合したり、関数から受け取ったり、そのオブジェクトへのポインタである新しいオブジェクトを記述できる必要があります。



C 言語からの画像: M. ウェイト、S. Prata、D. Martin

このような複合型のオブジェクトについては、その一部であるオブジェクトを指す方法がすでに存在していました。つまり、配列のインデックスを作成し、関数を呼び出し、ポインタで間接演算子を使用しました。 同様の推論により、名前が使用される式の構文を反映する名前を宣言するための構文が生まれました。 それで

整数、整数へのポインタ、および整数へのポインタへのポインタを宣言します。 これらの宣言の構文は、式で使用すると i、*pi、**ppi がすべて int 型になるという事実を反映しています。 同様の方法で
整数を返す関数、整数へのポインタを返す関数、整数を返す関数へのポインタを宣言します。
整数へのポインタの配列、整数の配列へのポインタを宣言します。

これらすべての場合において、変数の宣言は、宣言の先頭にある型の式での使用に似ています。

70年代:「困難の時代」と誤った方言

1973 年までに、この言語は UNIX を書き換えられるほど安定しました。 C に切り替えると、移植性という重要な利点が得られました。 ベル研究所の各マシン用に C コンパイラを作成することで、開発チームは UNIX をそれらのマシンに移植することができました。

C 言語の出現に関して、ピーター・モイランは著書『The case Against C』の中で次のように書いています。信頼性。 以前はアセンブリ言語かマシンコードレベルでしか実行できなかったことを実行できる言語が必要でした。」

C は 70 年代にも進化を続けました。 1973 年から 1980 年代にかけて、この言語は少し成長しました。型構造は符号なし、長い型、共用体、列挙型を受け取り、構造はクラス オブジェクトに近くなりました (リテラルの表記のみが欠けていました)。

Cに関する最初の本。 ブライアン・カーニハンとデニス・リッチーによって書かれ、1978 年に出版された C プログラミング言語は、C プログラマーのバイブルとなっています。 公式の標準がないため、この本 (K&R または C ファンが好んで呼ぶ「ホワイト ブック」とも呼ばれる) は事実上の標準となっています。


画像はlearnc.infoより

70 年代には C プログラマはほとんどおらず、そのほとんどが UNIX ユーザーでした。 しかし、80 年代になると、C は UNIX 世界の狭い範囲を越えるようになりました。 C コンパイラは、さまざまなオペレーティング システムを実行するさまざまなマシンで利用できるようになりました。 特に、C は、急速に発展している IBM PC プラットフォーム上で普及し始めました。

K&R は次の言語機能を導入しました。

構造体 (データ型 struct);
long integer (long int データ型);
符号なし整数 (データ型 unsigned int);
演算子 += および類似の演算子 (古い演算子 =+ は、たとえば、式 i =+ 10 と i = +10 を比較する場合に C コンパイラの字句解析器を混乱させました)。

K&R C は、C コンパイラーがサポートする必要がある言語の最も重要な部分であると考えられています。 ANSI C のリリース後も、長年にわたり、プログラムの移植性を最大限に高めることを望むプログラマが遵守すべき最低レベルと考えられていました。当時、すべてのコンパイラが ANSI C をサポートしていたわけではなく、優れた K&R C コードは ANSI C に適していたためです。 。

人気の高まりとともに問題も生じました。 新しいコンパイラを作成したプログラマーは、K&R で説明されている言語を基礎としました。 残念ながら、K&R では言語の一部の機能が曖昧に記述されていたため、コンパイラーが独自の裁量でそれらを解釈することがよくありました。 さらに、この本では、言語の機能と UNIX オペレーティング システムの機能が明確に区別されていませんでした。

K&R C の公開以来、いくつかの機能がこの言語に追加され、AT&T およびその他のメーカーのコンパイラでサポートされています。

値 (void 型) を返さない関数、および型 (void * 型) を持たないポインター。
共用体と構造体を返す関数。
構造ごとに異なる名前空間にあるこれらの構造のフィールドの名前。
構造の割り当て。
定数指定子 (const);
さまざまなメーカーが導入したほとんどの機能を実装する標準ライブラリ。
列挙型 (enum);
単精度の小数(浮動小数点数)。

状況をさらに悪化させたのは、K&R の公開後も C が開発を続け、新しい機能が追加され、古い機能が削除されたことです。 すぐに、この言語の包括的で正確かつ現代的な説明が明らかに必要になるようになりました。 このような標準がなければ、言語の方言が現れ始め、言語の最大の強みである移植性が妨げられました。

規格

1970 年代後半、当時マイコン プログラミングのリーダーであった BASIC に代わって C 言語が普及し始めました。 1980 年代に、IBM-PC アーキテクチャに適応され、その人気が大幅に高まりました。

米国規格協会 (ANSI) は、C 言語標準の開発を開始しました。 彼の下で 1983 年に X3J11 委員会が設立され、規格の開発が始まりました。 この規格の最初のバージョンは 1989 年にリリースされ、C89 と呼ばれていました。 規格に若干の変更を加えた後、1990 年に国際標準化機構 ISO に採用されました。 その後、ISO/IEC 9899:1990 というコードで知られるようになりましたが、プログラマーの間では、規格が採用された年に関連付けられた名前「C90」が定着しました。 この規格の最新バージョンは ISO/IEC 9899:1999 (C99 とも呼ばれる) で、2000 年に採用されました。

C99 標準の革新の中で、変数の宣言場所に関するルールの変更は注目に値します。 新しい変数を複合ブロックの先頭やグローバル スコープ内だけでなく、コードの途中でも宣言できるようになりました。

C99 のいくつかの機能:

インライン関数 (インライン);
任意のプログラム テキスト ステートメントでのローカル変数の宣言 (C++ と同様)。
Long Long int (32 ビット数値から 64 ビット数値への移行を容易にするため)、明示的なブール データ型 _Bool、複素数を表す複合型などの新しいデータ型。
可変長配列。
制限付きポインター (制限) のサポート。
構造体の名前付き初期化: struct ( int x, y, z; ) point = ( .y=10, .z=20, .x=30 );
C++ から借用した // で始まる単一行コメントのサポート (多くの C コンパイラは以前、追加としてコメントをサポートしていました)。
snprintf などのいくつかの新しいライブラリ関数。
stdint.h などのいくつかの新しいヘッダー ファイル。

C99 標準は、最新のすべての C コンパイラで多かれ少なかれサポートされるようになりました。 理想的には、標準に準拠し、ハードウェアやシステム依存の呼び出しを使用せずに C で記述されたコードは、ハードウェアとプラットフォームの両方に依存しないコードになります。

2007 年に、次の C 言語標準の開発が始まりました。 2011 年 12 月 8 日、C 言語の新しい規格 (ISO/IEC 9899:2011) が発行されました。 新しい標準の一部の機能は、GCC および Clang コンパイラですでにサポートされています。

C11の主な特徴:

マルチスレッドのサポート。
Unicode サポートの改善。
一般化されたマクロ (型ジェネリック式、静的オーバーロードが可能)。
匿名の構造体と共用体 (入れ子になった構造体へのアクセスを簡素化)。
オブジェクトの配置制御。
静的なアサーション。
危険なgets関数を削除(安全なgets_sを優先)。
関数クイック終了;
関数指定子 _N​​oreturn;
新しい排他的なファイルを開くモード。

'11 標準の存在にもかかわらず、多くのコンパイラは依然として C99 バージョンさえも完全にはサポートしていません。

習氏が批判される理由

参入障壁がかなり高いため、初めてのプログラミング言語として教育に使用するのは困難です。 C でプログラミングする場合、考慮すべき詳細が数多くあります。 「ハッカーの背景から生まれたこのプログラムは、安全性が低いことが多く、複雑なコードの作成を奨励​​するプログラミング スタイルを奨励します」とウィキペディアには書かれています。

ピーター・モイランは、より深く理にかなった批判を表明した。 12ページを費やして習氏を批判した。 以下にいくつかのスニペットを示します。

モジュール性の問題
C でのモジュラー プログラミングは可能ですが、それはプログラマがいくつかのかなり厳密なルールに従った場合に限られます。

ヘッダー ファイルはモジュールごとに 1 つだけ存在する必要があります。 エクスポート可能な関数プロトタイプ、説明のみを含め、その他は何も含めないでください (コメントを除く)。

外部呼び出しプロシージャは、このモジュールについてヘッダー ファイル内のコメントのみを認識する必要があります。

整合性をチェックするには、各モジュールが独自のヘッダー ファイルをインポートする必要があります。

別のモジュールから情報をインポートするには、各モジュールに #include 行と、インポートされる内容を示すコメントが含まれている必要があります。

関数プロトタイプはヘッダー ファイル内でのみ使用できます。 (このルールが必要なのは、C 言語には関数がそのプロトタイプと同じモジュールに実装されているかどうかをチェックするメカニズムがないためです。そのため、プロトタイプを使用すると、「関数が見つからない」エラーが隠蔽される可能性があります。)

モジュール内のすべてのグローバル変数、およびヘッダー ファイルを通じてインポートされた関数以外のすべての関数は、静的として宣言する必要があります。

コンパイラ警告「プロトタイプなしの関数呼び出し」を提供する必要があります。 このような警告は常にエラーとみなされます。

プログラマは、ヘッダー ファイルで指定された各プロトタイプが、同じモジュール内で同じ名前で実装された非プライベート (つまり、通常の C 用語では非静的) 関数に対応していることを確認する必要があります。 残念ながら、C 言語の性質上、これを自動的にチェックすることは不可能です。

grep の使用には疑う必要があります。 プロトタイプが正しい場所にない場合、これはエラーである可能性が高くなります。

理想的には、同じチームで作業するプログラマーが互いのソース ファイルにアクセスできないようにする必要があります。 オブジェクト モジュールとヘッダー ファイルのみを共有する必要があります。

明らかな問題は、コンパイラーがこれらのルールに厳密に従うことを要求していないため、これらのルールに従う人がほとんどいないことです。 モジュール式プログラミング言語は、悪いプログラマーが引き起こす混乱から優れたプログラマーを少なくとも部分的に保護します。 しかし、C言語ではこれができません。



画像はsmartagilee.comより
ポインタの問題
データ構造の理論と実践はこれだけ進歩しているにもかかわらず、ポインターは依然としてプログラマーにとって大きな障害となっています。 ポインタの操作はプログラムのデバッグに費やされる時間のかなりの部分を占めており、開発を複雑にする問題のほとんどはポインタによって発生します。

重要なポインタと重要でないポインタを区別できます。 私たちの理解において重要なのは、データ構造を作成および維持するために必要なポインターです。

データ構造を実装する必要がない場合、ポインターは重要ではないと考えられます。 典型的な C プログラムでは、重要でないポインタの方が重要なポインタよりも多く存在します。 これには 2 つの理由があります。

1 つ目は、C 言語を使用するプログラマの間では、たとえば配列要素を表示する場合など、それと何ら遜色のない他のアクセス方法がすでに存在する場合でも、ポインタを作成することが伝統になっているということです。

2 番目の理由は、すべての関数パラメーターを値で渡す必要があるという C 言語の規則です。 Pascal VAR または Ada inout と同等のものが必要な場合、唯一の解決策はポインターを渡すことです。 C プログラムの可読性の低さは主にこれで説明されます。

重要なポインタを入出力パラメータとして渡す必要がある場合、状況はさらに悪化します。 この場合、関数にはポインターへのポインターを渡す必要があり、最も経験豊富なプログラマーにとっても困難が生じます。

シ - 生きています

2016 年 6 月のデータによると、プログラミング言語の人気の伸びを測定する TIOBE インデックスでは、C が 2 位にランクされています。

誰かが、C は時代遅れであり、C が広く使用されているのは幸運と積極的な PR の結果だと言ってみましょう。 UNIX がなければ C 言語は決して作成されなかったでしょう。

タグを追加する

C 言語は、1969 年から 1973 年にかけてデニス・リッチーとブライアン・カーニハンによって開発されました。 C は UNIX オペレーティング ネットワークを実装することを目的としていましたが、後により幅広い用途が発見されました。

現時点では習氏は安定した2位を占めている。

なぜCが必要なのでしょうか?

C言語の重要性についてはすでに述べたので、要点を見ていきましょう。

そもそも、ほとんどのシステム ソフトウェアは C で書かれています。 最も人気のあるオープンソース Linux OS のカーネルは C で書かれています。

C の大きな利点は、言語のすべての命令が直接かつわかりやすい方法でマシンコードに変換されることです。 プログラマーが画面に表示しているコードが正確に実行されます。 ただし、最新のコンパイラでは、もちろん使用できますが、使用できるケースは少数です。

最も人気のあるプログラミング言語は何らかの形で C に関連していることも注目に値します。 たとえば、Java と C# にはいわゆる C のような構文があり、C++ と Objective-C は何らかの形で C の拡張機能です。

PHP、JavaScript、Python などの動的プログラミング言語でコードを作成する場合、そのインタプリタ、ランタイム、およびほとんどのライブラリは主に C で作成されます。 したがって、特定の言語の動作の特徴を理解するには、C 言語の特徴を知る必要があります。 そして、プログラミング言語の能力を超えてしまうと、いつの間にか C で新しい拡張機能を書き始めることになります。

さらに、C の知識があれば、プログラマは高級プログラミング言語のすべての魅力と、それを使用する際に生じる制限を真に理解することができます。

これらが C を学ぶ理由です。

次は何でしょうか?

C 言語が必要な理由がわかったので、次は「どうやって学習すればよいですか?」という論理的な疑問が生じます。

書籍「Cプログラミング言語」

このプログラミング言語の作成者以上に C について詳しく説明できる人はいません。 したがって、デニス・リッチーとブライアン・カーニハンが書いた『The C Programming Language』という本は、何らかの形で C に人生を結びつけようと決心したすべての人にとって必需品です。

このコースでは、言語の基本的な側面と、グラフィックス プログラミング、メモリ モデルなどのより高度な側面の両方をカバーします。 コース中には、データベース管理システムや独自のコンピューター ウイルスなど、7 つのエキサイティングなプロジェクトを作成します。

有料コースですが、それだけの価値は間違いなくあります。 次に無料素材をご紹介します。

ハーバード大学の有名コース「CS50」

今彼は話しています。 何よりもCS50は考え方を教えてくれます。 コース中に取り上げるトピックには、抽象化、アルゴリズム、データ構造、カプセル化、リソース管理、セキュリティ、ソフトウェア開発、Web 開発などがあります。 使用する言語: C、Python、SQL、JavaScript、および HTML と CSS。 そして最も重要なのは、コースは無料です。

無料講座「初心者のためのCチュートリアル」

このプログラムでは、C 言語の基礎を学び、ポインタ、構造体、共用体を理解し、簡単なプログラムの書き方を学びます。

フィンランドの 2 つの主要大学による無料のオンライン C コース

包括的な資料と多くのプログラミング演習、自動テスト システムが含まれています。

このコースはアアルト大学とヘルシンキ大学 (リーナス・トーバルズがかつて学んだ大学と同じ) が共同で開発したもので、そこで説明されている内容はこれらの大学で教えられている C コースと完全に重複しています。

書籍『C をザ・ハード・ウェイで学ぶ』

この本では、抽象的なメカニズムや衒学的な理論ではなく、実際のプロジェクトを作成するために実際に使用される C を教えます。 また、アルゴリズム、データ構造、自動テストなど、いくつかの重要なトピックについても学習します。 興味のある方はロシア語への翻訳をご覧ください。 Tproger では、優れたプログラミング書籍も頻繁に推奨しているので、ぜひチェックしてください。