シンプルにすれば、人々はあなたに手を差し伸べるでしょう。

私は人生で独学しています。大学で「教えられた」FORTRANとPL / 1を除いて(それがどれくらい前かわかりましたか?)、私はプログラミングの知識のほとんどを専ら独学で得ました。 彼は、いつものように、PascalとDelphiの論理的継続から始めました。 優先順位が変わると、彼は第86ファミリー(MS DOS)のアセンブラーを習得し、その後、マイクロコントローラーに興味を持つようになり、ASM51とAVRアセンブラーを習得しました。 これらはすべて単純に私に与えられました。 上記のすべては、非常にシンプルで、最も重要な点として、明確に構造化された論理的な説明に役立ちます。つまり、言語の構文と原則を意味します。



次のステップは必然的に避けられませんでした-Cへの移行(私は強調します-私の場合、それはマイクロコントローラーのプログラミングに関するものです)、そしてここで、彼らが言うように、プロセスは行き詰まりました。 構文Cはささいなことですが、この言語に関する本は別の歌です。 K&Rの古典でさえ、最初の章から、「働くハローワード」は、構文、演算子などについての単一の単語ではないという事実にもかかわらず、初心者の脆弱な頭脳に落ちます。 言われなかった! C言語の標準を研究し始めたとき、以前は脳内に明確な規制として定着していた標準の概念がほぼ完全に破壊されたため、自殺抑うつ状態になりました!



そのため、「論理的に一貫した定義を実現するための規則」をいくつか用意しました。これにより、C言語を多少なりとも冷静に学び、時には(!)他の初心者を教えることができました。

初心者がXiを習得して、そのような「ルール」を少なくとも1つ学ぶことは良いことのように思えます。



私は既存のユーモアのセンスを使用しようとしました-読むときはオフにしないことをお勧めします。



最初に、一見シンプルに見えるデータ型とこれらの型の変数の説明について説明します。

説明がint varであることは誰もが知っています。 int型のvar変数、それぞれint var var1、var2、var3の拡張説明を記述します。 同じタイプの3つの変数については既に説明しています。 常識と人生の経験から、変数または複数の変数の記述は2つの部分で構成されていることが示唆されています: 最初は型の識別子(int)、次にスペースの後に変数の1つ以上の(コンマ区切りリスト)識別子があります

すべてがそうであり、これまでのところすべてが明確です。 しかしCでは、変数の説明にいくつかの接頭辞、たとえばconstを追加できます。これは、変数がその値を変更してはならないことを意味します。 ところで、たとえばautoなどの他のプレフィックスがありますが、現在はそうではありません。 そして驚くべきことに、接頭辞は型の前後に現れることがあります:

const int var1;

そして

int const var1;

完全に同一のエントリ。



私はあなたとの関係がわかりませんが、私の脳は回を不快にし始めます、なぜなら 前述のように、変数を記述するための明確なルールを作成することはしません(上記の選択されたテキストを参照)。 変数の説明は、識別子またはスペースで区切られた識別子のリストの前に、タイプ識別子および/またはアプリケーションの特性と変数の使用を示すプレフィックスが存在するという事実にあります。 私はそれらを見つけてユニオンを使用できることを書いたこと注意してください、 または -これは実際にそうです:C言語は変数の型の識別子の不在を許可します。この場合、デフォルトの型はintと見なされます。 つまり このエントリも有効です: const var;



ポインタにスムーズに移動しようとします。

const int * var; -値を変更できない変数へのポインター。

int const * var; -int変数への値を変更できないポインター。



あなたの脳はまだ爆発していませんか? 冷却圧縮のおかげで私の唯一の生き残りがありました。タイプとプレフィックスは互いにランダムな順序で配置できるように見えましたが、今では順序が説明の意味を大幅に変えることがわかりました! はい、文字列int const * varの正しい読み取り 左から右ではなく、右から左ではなく、何らかの種類のスパイラル:中央から開始し(ポインター、つまり*)、次に左に移動し(定数、つまりポインターは値を変更しません)、右(変数varの識別子を記憶します) )、再度左(int変数で入力)。 Brrr ...



ここで、値を変更しないポインタ、変更可能なポインタ、int型の不変変数を指すエラーをエラーなしで記述してみてください...何?! この段階では、多くの初心者がC本を壁に投げ込み、ビールを飲みに行ったと思います。



そして、関数へのポインター、ポインターの配列、関数へのポインターの配列へのポインターについてはまだ理解していません...

一般的に、これはひどいことです-C言語! 一方で、プログラマーからの考えを明確に提示する必要があり、他方では、非常に多くの可能性、仮定、許可、およびオプションを使用して、この非常に明確な考えを維持するのが単純に困難になります...すべてのオプションとニュアンスが言及されているわけではありません!)同じ脈絡のコメントを持つオプション:Cは次の手順を設定します...しかし、...の場合、許可されます...同時に...ルールが...に変わります-代わりに楕円を使用 電子。



もちろん、私はCが幅広い機会の道具であり、おそらく、各機会と各ニュアンスが真に重要な目標を達成するのに役立つことを理解していますが、誰もが第一人者であるべきではありません! プログラミングが趣味の普通の人になるには?



C言語の可能性の1つを使用することを提案します。C言語を正しく使用すると、どれほど複雑であっても心を維持し、同時に望ましい結果を得ることができます。 この機能、カスタムデータ型の定義と呼ばれます



私の観点から見ると、この機能の有能な使用法は、連続する2つ以上のキーワード(識別子)の型宣言を避けるための唯一のルールを単に観察することにあります。 したがって、単一の形式の変数定義、つまり、左側に1つのタイプ識別子、スペース識別子、または右側のスペースに続く変数識別子のリストを作成する必要があります。 私たちが(謙虚かつ自発的に)日常生活から除外する言語で許可されている他のすべてのオプション。



実際には、このように見えます。

const int var ; -説明には、2つの識別子を使用する必要があります。 私たちの場合。 これに新しいタイプを導入します:

typedef const int const_int;

B変数の定義が理想に変わる

const_int var;

厳密に私たちのルールに従って。



このようなレコードは絶対に明確に読み取られ、追加の作業が必要なのはconst_int型の定義を表示することだけです。 明らかに、タイプ識別子を適切に選択すると、その意味はコメントなしで明確になりますが、対応するtypedefで文字列を見つけても混乱しないでしょう。 typedefを含む行は、明確かつ簡単に読み取られます 。 ちなみに、新しいタイプを入力するときは、あまりにも多くのストーリーの録音を避けることもお勧めしますが、ここではすでにどのようになっているのか-私たちの世界には理想はありません。



この新しい型へのポインタを定義する場合、次のように記述できます。

const_int * var; そして、それは単純で簡単なものになりますが、新しいタイプを導入することができます。

typedef const_int * const_int_ptr;

「完璧な」記録を取得する

const_int_ptr var;



さて、先にst迷者に入力した説明を思い出してみましょう。値を変更しないポインター、変更可能なポインター、int型の不変変数を指します。 行われたことを考えると、次のようになります。

typedef const int const_int; //不変変数int

typedef const_int * const_int_ptr; //不変変数へのポインタ(可変)int

typedef const const_int_ptr * const_ptr; //前のポインターへの不変のポインター

ここで停止できますが、続行できます:

const_ptr var; //そして、これは変数の最終的な説明です



理解するのは難しいですか? 私の観点からは、これらのすべてのプレフィックスとサフィックスを1行でプッシュするよりもはるかに簡単です...新しいタイプを入力すると、これらのタイプのデータを関数のパラメーターとして転送したり、結果としてそれらを返す必要がある場合に便利です。



私は何を求めていますか? さて、ここにあるのは仲間のプログラマーと彼らになりたい人たちです! Cの深さに関する知識を自慢せず、これらの深さに不必要に飛び込んで、目標を達成するために最も単純な(録音と知覚の両方の)構造に制限しないでください! そして、人々はあなたに手を差し伸べるでしょう!



All Articles