シリーズ記事の目次
第 1 章 「C」Hu Zhuan - 初めての C 言語入門 (初心者向け!)
目次
序文
おそらく、C言語に触れたばかりのお子さんもいると思いますが、私も編集者と同じように、 C言語が何を言っているのか全く分かりません。おめでとうございます。宝物を見つけました。それでは、早速、編集者の足跡をたどって、初めて C 言語について学んでください。
タイトルにあるように、C 言語の概要を理解し、C 言語のフレームワークを構築するのが初期 C 言語です。ということで、編集者が解説を始めます。この章は主に初期の C 言語の概要を説明するものであり、内容の各部分を詳細に説明するためのリンクが多数含まれています。
1.C言語とは
まずはC言語とは何かを自分の言葉で説明してください。(これは焦点を絞る必要があり、面接官が質問する可能性があります)
************************************************* *******************************************
言語:中国語、日本語、英語など 言語は自然言語であり、人々が互いにコミュニケーションするために使用する言語です。
コンピューター言語:類推すると、人間とコンピューター間のコミュニケーションです。
************************************************* ********************************************
C 言語は一般的なコンピューター プログラミング言語 (ここが C 言語の優れた点です) であり、低レベルの開発に広く使用されています。
読者が C 言語の関数と関数について詳しく知りたい場合は、Du Niang のこのリンクをクリックしてください: C 言語の関数と関数 。
一般に コンピュータは上位ソフトウェアと下位ソフトウェアに分けられ、下位ソフトウェアが最下位開発にあたり、C言語が広く使われています。。
コンピュータは「バイナリ情報」 を扱います(この点は非常に重要です。将来、メモリ関連の内容について話すときにこの点に持ち込まれるためです)。C言語を学習する場合、統合開発環境を使用する必要があります。統合開発環境には、編集、コンパイル、リンク、実行、デバッグなどの多くのサブプログラムが統合されています。(この内容については編集者も勉強中なので、この部分は説明できません。興味のある方は、こちらで編集者が紹介する書籍『プログラマの自己修養 ~リンク・ロード・ライブラリ~』をご紹介します。)この本では、これら 5 つのステップの役割が詳しく説明されています。編集者が読み終えたら、必ずブログを作成して説明し、分析します。)
2. 初めてのC言語プログラム
************************************************* ************************************************* ***
C 言語とは何かを理解した後、統合開発環境を使用して最初の C 言語プログラムを完成させる方法を理解する必要があります。以下に、C 言語を初めて学習する場合、ほとんどの人は統合開発環境を使用しません。他のコンパイラは古すぎるため、エディタでは VS2019 の使用方法も説明します。最初の一歩を踏み出すには、下の写真をご覧ください。
************************************************* ************************************************* ****
************************************************* ************************************************* ***
コンピューター言語の研究には、「hello world」というジョークがあります。基本的に誰でも最初の C 言語プログラムは「hello world」で始まるため、このような単純なプログラムの場合、そこから何を学ぶことができるでしょうか?
************************************************* ************************************************* ***
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
まず、 C 言語の文字はすべて英語の文字であることがわかります。次に、すべての C 言語コードは main 関数の最初の行から始まります。main関数はプログラムのエントリ ポイントであり、プロジェクトには main 関数が 1 つだけあります。コード内の printf 関数はコンパイラに付属する関数であり、直接使用できます。最後に、 <stdio.h> はヘッダー ファイルであり、.c ファイルはソース ファイルです。関数を使用する場合は、対応するヘッダファイルを参照してください。
最後に、 main 関数 について話しましょう: main 関数を記述するには 3 つの方法があります。1つ目はint main() (これが最も単純で最も一般的に使用されるものです)、2 つ目は int main(void) です。このように書くと、 main 関数はパラメータを受け取らないことが明記されています; 3 番目の型はint main (int argc, char* arr[]) です。このように書くと、2 つのパラメータが main() に送信されます。ライン パラメータの数、1 つは通常 argv と呼ばれるコマンド ラインの配列、コマンド ライン パラメータはすべて string です。詳細については、次のリンクを参照してください: [コマンドラインパラメータ_Baidu百科事典]
3. データ型
************************************************* ************************************************* ***
C言語のデータ型は、 char(文字データ型) short(short整数型)です。
int (整数型) long (長整数型)
long long (長めの整数) float (単精度浮動小数点数) double (倍精度浮動小数点数)。
************************************************* ************************************************* ***
データ型を理解する前に、なぜプログラムを作成する必要があるのかを 見てみましょう。それは、プログラムを使って人生の問題を解決することです。実生活では、私たちのさまざまなデータにはさまざまな型が存在しますが、生活上のさまざまな値をより豊かに表現するために、 C言語プログラムでは非常に多くのデータ型が設定されています。
それぞれのタイプのサイズはどれくらいですか?
************************************************* * ************************************************ **** *** コンピューターの一般的な単位は、ビット (ビット)、バイト (バイト)、KB、MB、GB、TB、PBです。単位変換は次のとおりです: 1 バイト = 8 ビット
1KB = 1024バイト
1MB = 1024KB
1 GB = 1024 MB
1TB = 1024GB
1 PB = 1024 TB。
************************************************* ************************************************* ***
4番目、変数、定数
人生においては、一定の値(円周率、性別、 ID番号、血液型など)もあれば、変数(年齢、体重、給与など)もある。変数と定数の概念が導入されます。
まず、変数について話しましょう。
4.1 変数の定義方法
構文は、タイプ + 名前です。コードは以下のように表示されます:
int age = 150;
float weight = 45.5f; //浮点数默认为双精度浮点数,在后面加个f,说明是单精度浮点数类型
char ch = 'w';
4.1.1 変数の命名
************************************************* ************************************************* ***
基本的なルールは次のとおりです。
1)文字 (大文字と小文字を含む)、数字、アンダースコアのみで構成できます。
2)数字で始めることはできません。
3)長さは63 文字を超えることはできません(これはまったくのでたらめであり、単なる通行人であり、必要ありません)。
4)大文字と小文字を区別します。
5)キーワードを変数名に使用することはできません。
6)変数の名前は、できるだけ意味のある(いくつかの英語の単語を理解できるように注意してください)。
************************************************* ************************************************* ***
4.2 変数の分類
変数はローカル変数とグローバル変数 に分けられ、グローバル変数とローカル変数の名前が同じ場合はローカル変数が優先されます。
4.3 変数の使用
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("请输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
vs をコンパイルすると、ここに4996 警告が表示されることがわかります。
この警告が表示されるのはなぜですか? これは、 vs に関数を入力するときに、それをscanf_sとして定義しており、scanf function を使用するのは安全ではないためです。
では、この警告を削除するにはどうすればよいでしょうか? (方法は全部で3つあります)
まず第一に、最初の方法は非常に単純であり、 scanf をscanf_sに直接変更することです。scanf_s 関数は vs によって提供されているため、 vs はエラーを報告しません。この方法はシンプルで高速ですが、欠点もあります。この方法で書かれたコードは移植性がなく、直接コピー&ペーストして他のコンパイル ソフトウェアで直接使用することはできません。次に、2 番目の方法が必要になります。
2 番目の方法では、 #pragma warning(disable:4996) コードを使用すると、4996 番の警告エラーが無効になり、vs はコードが正しいかどうかを気にしません。ただし、このメソッドはプロジェクトを作成するたびに記述する必要があり、面倒です。
最後に、3 番目の方法は、これで最後です。まず、vs フォルダーで newc++file.cpp という名前のファイルを見つけ、そのファイルに #define _CRT_SECURE_NO_WARNINGS を書き込み、保存して閉じます。新しいプロジェクトを作成すると、このコード行が自動的に最初の行に表示され、問題が効果的に完全に解決されます。
4.4 変数のスコープとライフサイクル
4.4.1 範囲
スコープは範囲であり、これはプログラミングの概念です。一般に、コードで使用される名前は常に有効であるとは限りません。名前の使用可能性を制限するコード範囲が名前のスコープです。
以下はエディターの範囲の概要です。
1)ローカル変数のスコープは、変数が配置されているローカル スコープです。
2)グローバル変数のスコープはプロジェクト全体です。
4.4.2 ライフサイクル
ライフ サイクルは期間であり、変数のライフ サイクルは、変数の作成から変数の破棄までの期間です。
1)ローカル変数のライフ サイクルは次のとおりです。ライフ サイクルはスコープに入ったときに始まり、スコープから出たときに終了します。
2)グローバル変数のライフ サイクルは、プログラム全体のライフ サイクルです。
以下は編集者によるライフサイクルの要約です。
プログラムをどのように理解すればよいでしょうか?(この内容については後ほど別途説明しますので、初心者の方は心配する必要はありません)
プロジェクトを作成する際、複数のソースファイルを作成することができ、例えば外部シンボル "extern" を宣言することで、あるソースファイルで定義したグローバル変数を別のソースファイルで使用することができます。以下に示すように:
次に定数について話します。
4.5 定数
C 言語の定数は、リテラル定数、const 修飾定数、#define 定義の識別子定数、列挙定数に分類されます。
以下のエディターを使用して、1 つずつ分析できます。
4.5.1 リテラル定数
リテラル定数には何も言う必要はなく、値を直接書き出すだけです。
4.5.2 const で変更された定数変数
C言語のconstで修飾された定数変数は文法レベルで変数を制限しているだけで直接変更することはできませんが、本質的には変数であることに変わりはないため、定数変数と呼ばれます。
なぜ C 言語では const 変更が定数変数なのでしょうか?
C 言語 では、配列内の角括弧が const 修飾された定数変数を参照している場合、コードのコンパイル時に警告が表示されますが、C++では、const 修飾された変数は定数とみなされます。
4.5.3 #define 定義された識別子定数
#define で定義された識別子は配列で使用できます。
4.5.4 列挙定数
列挙定数はデフォルトでは 0 から始まり、順番に 1 ずつ増加します。
5.文字列+転送文字+コメント
5.1 文字列
C 言語には文字列型はなく 、文字列型は文字配列に格納できます。
「hello world」などの二重引用符で囲まれた文字列は、文字列リテラル、または単にstring と呼ば。文字列の終了マークは '\0' エスケープ文字です。文字列の長さを計算するとき、\0は終了マークであり、文字列の内容としてカウントされません。
char arr[] = "hello world";
char arr[] = {'h','e','l','l','t'}; //最后输出该数组时会出现乱码的情况
char arr[] = {'h','e','l','l','t','\0'};
文字列を定義する配列では、配列の末尾に\0を追加して、それが文字列の末尾であることをコンパイラに示す必要があります。
5.2 エスケープ文字
名前が示すように、エスケープ文字は、一部のシンボルが一緒に書かれたときにコンパイラがその意味を誤解するのを防ぐために、元の意味を変更します。次に、よく使用されるエスケープ文字をいくつか紹介します。
文字はコンピュータのストレージ内でエンコードされます。ASCLL コード値の範囲は 0 ~ 127 ですが、後に 0 ~ 255 に拡張されました。
以下は古典的な質問です: (この質問の答えは 14 です)
#include <stdio.h>
int main()
{
printf("%d\n", "c:\test\628\test.c");
return 0;
}
この質問では、次のような落とし穴に注意する必要があります。 1)エスケープ文字。エスケープ文字には '\' が書かれていないため、文字として扱う必要があります。2)これは 8 進数のエスケープ文字です。これにより 8 が得られますが、数字の 8 は 8 進数では表示されません。
5.3 コメント
この部分は比較的単純です。プログラマの世界では、コードが冗長である場合があります。コードの一部の部分は理解しにくいため、その横にコメントを付ける必要があります。不要なコードを削除する必要がある場合もあります。コメントすることもできます。削除したくない場合は。
コメントには2 つのタイプがあります。1 つはC スタイルのコメント(通常は使用されません) : /* */、もう 1 つはC++ スタイルのコメント: //です。
6. ステートメントを選択します
if else 文は C 言語の選択構造です。
7. ループステートメント
ループ ステートメントには、while()、for()、 do while()の3 つの形式が あります。
これらには、さまざまなシナリオに適用できるように するいくつかの違いがあります。ループの数がわかっている場合は、for ループを使用します。ループの数が不明な場合は、while ループを使用します。1回ループしたい場合は、do while ループを使用します。 。
8. 機能
数学では関数は変数間の関係を記述しますが、C 言語では関数を使用して実際に関係を定義します。
#include <stdio.h>
//函数的定义和声明
int ADD(int x, int y)
{
return x + y;
}
int main()
{
int a = 0, b = 0;
int sum = 0;
scanf("%d %d", &a, &b);
//函数的调用
sum = ADD(a, b);
printf("%d\n", sum);
return 0;
}
関数の特徴は、コードの簡略化とコードの再利用です。
9. アレイ
C 言語では、配列は同じ型の要素のセットを格納するために使用されます。
9.1 配列の定義
配列は初期化される場合もあれば、不完全に初期化される場合もあります。
完全な初期化: int arr[4] = {2,3,4,5};
不完全な初期化: int arr[4] = {0};
9.2 配列の添字
C 言語では、配列の各要素に添字があり、添字は 0 から始まることが規定されています。配列には添字を使用してアクセスすることもできます。
9.3 配列の使用
#include <stdio.h>
int main()
{
int arr[10] = {0};
//利用循环 输入 输出
for(int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
for(int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
10. オペレーター
10.1 算術演算子
+ - * / %
10.2 シフト演算子
>> <<
10.3 ビット演算子
&^ |
10.4 代入演算子
= += -= *= /= ^= |= >>= <<=
10.5 単項演算子
!論理逆演算子 C 言語では、0 は false を意味し、0 以外は true を意味します
sizeof オペランドの型の長さ (バイト単位) これは最も演算子らしくないものです。覚えておいてください。
-- 前--、後-- 前位置は最初に 1 を追加してから使用し、後位置は最初に 1 を使用してから 1 を追加します。
++フロント ++、ポスト ++フロント、ポスト 記号の位置を見て自分で1足しても構いません
10.6 関係演算子
> >= < <= != ==
10.7 論理演算子
&& 論理積 AND すべてが true は true
|| 論理和 OR すべて false は false
ここで友人からの質問を思い出しました。
この質問を見たとき、選択肢 b と c が間違っているように思えたので混乱しましたが、そうではありませんでした。c オプションは、論理的な短絡があるため、知らない知識が含まれているため、C 言語では、演算を実行するときに、プログラムが演算の過負荷にならないようにコードを最適化する必要があります。プログラムでは、a||(b = c) は論理演算ですが、なぜ論理的短絡が発生するのでしょうか? C言語では、プログラムの計算量を減らすため、この論理演算を行う際、式の正確な値が決まった場合には後続の演算を計算せず、元の論理演算を正確に保ちつつ演算を簡略化する手法を採用しています。 。
OR 演算では、a が真であれば、その後の値が何であっても計算する必要はありません。プログラムの結果はすでにわかっているため、論理短絡を実行して、b を計算しません。 = c なので、c は計算されません。b に代入しても、b は元の値と同じです。a が false の場合、後続の結果が結果全体に影響を与える可能性があることを意味するため、論理短絡は実行できません。
10.8 条件演算子
経験値1? exp2: exp3 三項演算子、1 が true の場合は 2 を出力、そうでない場合は 3 を出力します。
10.9 カンマ式
exp1、exp2、exp3、exp4 は左から右に計算され、式全体の結果が最後の式の値になります。
10.10 添字参照、関数呼び出し、構造体メンバー
[ ] () 。->
11. よくあるキーワード
これらの一般的なキーワードは、タイプ、ループ、分岐、宣言、関数などに分類されます。
種類:auto(自動)、char、double、enum、float、int、long、short、signed、unsigned、union、void、sizeof、struct、typedef。
循環:休憩、継続、do while()、for、継続。
分支:switch,break,case,default,if else,goto。
宣言: extern (外部変数の宣言)、register、static、volatile。
機能: リターン。
11.1 キーワード登録
registerキーワード であり、register で宣言した変数がレジスタ変数となり、CPU のレジスタに格納されます。レジスタ変数と通常の変数では速度に大きな差があり、やはりCPUの速度の方がメモリの速度よりもはるかに速いのです。レジスタには動作速度が速いという特徴と、アドレスが取れないという2つの特徴があります。ただし、レジスタ内の変数のアドレスは取得できないため、コンパイラはエラーを報告します。
11.2 キーワード typedef
名前が示すように、 typedef は型定義であり、型の名前変更として理解する必要があります。目的はコードを簡素化することです。
11.3 キーワード静的
C 言語では、静的は変数や関数を変更するために使用されます。
使い方は次の 3 つがあります。
1) 静的ローカル変数と呼ばれるローカル変数を変更します。
2) 静的グローバル変数と呼ばれるグローバル変数を変更します。
3) 変更された関数は静的関数と呼ばれます。
11.3.1 ローカル変数の変更
C/C++ プログラムおよび言語では、メモリはスタック領域、ヒープ領域、静的領域の 3 つの部分に分割されます。
通常のローカル変数は、関数に入るときに作成され、関数から出るときに破棄されますが、static に変更された後は、入った関数がすでに作成されています(逆アセンブリでは、static に変更された変数にはアセンブリ言語がないため)。終了する関数は破棄されず、関数が複数回呼び出されます。=、変数を共有します。
本質: 通常のローカル変数はスタック領域に配置され、static によって変更された変数は static 領域に配置されます。
11.3.2 グローバル変数の変更
C 言語では、各 .c ファイルはコンパイラによって個別に処理され、グローバル変数には外部リンク属性があり、この属性によりグローバル変数が複数のファイル間で使用できるかどうかが決まります。ただし、static で変更すると、グローバル変数の外部リンク属性が内部リンク属性に変更されるため、グローバル変数はこのファイル内でのみ使用可能となり、他のソースファイルでは使用できなくなります。
11.3.3 変更された機能
関数の属性はグローバル変数に似ています。関数には外部リンク属性もあります(ファイル間で使用できます)。静的に変更すると、関数はこのファイル内でのみ使用でき、他のソース ファイルでは使用できません。
12. #define は定数とマクロを定義します
12.1 #define は識別子定数を定義します
12.2 #define はマクロを定義します
13. ポインター
13.1 メモリ
メモリはコンピュータにおいて特に重要なメモリであり、すべてのコンピュータ プログラムはメモリ内で実行されます。したがって、メモリを有効に利用するために、メモリを小さなメモリ単位に分割し、各メモリ単位のサイズを 1 バイト(最小のデータ型は char 型であり、char 型のバイトは 1 ワードであるため)とします。セクション) では、メモリの各ユニットに効率的にアクセスするために、メモリ ユニットに番号が付けられており、この番号をメモリ ユニットのアドレスと呼びます。
メモリとハードディスクは明確に区別する必要があります。
32 ビット マシンには 32 のアドレス ラインがあり、各アドレス ラインは 0/1、つまり 2 の 32 乗のアドレスがあり、4 GB のメモリを管理できます。2進数、8進数、10進数、16進数はすべて数値の表現です。
概要: 1. メモリはバイト単位のメモリユニットに分割されます。
2. 各メモリユニットには番号があり、番号 = アドレス = ポインタです。
3. C 言語で作成された変数は実際にメモリ内の空間に適用されます。
4. &aの場合、4バイトのうち小さい方のバイトアドレスを取り出します。
5. ポインタ変数にはアドレスが格納されます。
6. a はポインタ変数を通じて見つけることができます。
13.2 ポインタ変数のサイズ
ポインタ変数のサイズはアドレスのサイズによって異なります。32ビット マシン プラットフォーム上のアドレスは 32 ビット (つまり 4 バイト)、64 ビット マシン プラットフォーム上のアドレスは 64 ビット (つまり 8 バイト) です。 . .
14. 構造
C言語には配列という概念がありますが、配列には制限があり、同じ型のデータしか格納できません。しかし実際には、このデータは比較的複雑で、配列だけを使用してうまく表現することができないため、C 言語ではさまざまなタイプのデータを格納するためにこの構造が導入されています。
構造内の特定の要素が必要な場合、その要素に対応するポインタ型を使用してアドレスをフェッチする必要があります。