C言語の基礎(はじめてのC言語入門)

        プログラミング言語の学習は、難しくもあり、幸せな道でもあります。この道を選んだからには、C言語の基礎知識を理解しながら進みましょう。まず、 C 言語についての一般的な理解が必要です。ご紹介します。 C言語の基礎。

1. C言語とは何ですか。

        C言語は 、低レベルの開発で広く使用されている 一般的な コンピューター プログラミング言語です。 C言語の設計目標は、簡単にコンパイルでき、低レベルのメモリを処理でき、少量のマシン コードを生成でき、ランタイム環境のサポートなしで実行できるプログラミング言語を提供することです。
        C 言語は多くの低レベルの処理関数を提供しますが、依然として優れたクロスプラットフォーム特性を維持しています。標準仕様で記述された C 言語プログラムは、一部の組み込みプロセッサ (マイクロコントローラーまたは (MCU と 呼ば れる ) やスーパーコンピューターやその他のオペレーティング プラットフォーム。
1980 年代、さまざまな開発者が使用する C 言語構文の違いを         避けるために、 米国標準局は、 C言語の元の標準として、 ANSI Cと呼ばれる C 言語 米国国家標準構文の完全なセットを策定しました。言語です[1]現在、2011 年12 月8 日に国際標準化機構 (ISO ) と国際電気標準会議 ( IEC )によって発表されたC11標準は、 C言語の3番目の公式標準であり、 C 言語の最新の標準です。標準の方が良い 漢字関数名と漢字識別子をサポートし、ある程度の漢字プログラミングを実現します。
        C言語はプロセス指向のコンピュータプログラミング言語であり、 C++ Java などのオブジェクト指向プログラミング言語とは異なります。
そのコンパイラには主に Clang GCC WIN-TC SUBLIME MSVC Turbo C などが含まれます。
2. C 言語プログラミング コードの基本形式。
        
#include <stdio.h>
int main()
{
    printf("Hello\n");
    printf("Just do it!\n");
    return 0; 
}

       結果を出力します。

\n があります (これは後で紹介する改行演算子です)

なし\n

        2.1 #include <stdio.h> :すべての C 言語プログラム コードにはヘッダー ファイルが含まれています。 include はファイル インクルード コマンドと呼ばれ、その意味は山括弧 <> または引用符 "" で指定されたファイルをプログラムに含めることです。 、このプログラムの一部になります。インクルードされるファイルは通常システムから提供されており、拡張子は.hで、stdioとはStandard input Outputの略で「標準入出力」を意味し、プログラム内で固定の形式で入力することができます。

       2.2 int main() : main 関数はプログラムの入り口です。main 関数はプロジェクトに 1 つだけあります。C 言語での main 関数の宣言方法です。int main( の下に {} のペアがあります) )、コードが入力されます。

       2.3 printf :出力する結果を示します。結果は (" ") の二重引用符で囲まれます。特定の文字種を特に印刷する必要がある場合、一般的な形式は ("印刷するデータ型\n " ,出力するデータ型(変数青色の部分は固定形式を表します。緑色の部分は、対応するコンテンツを印刷するときに入力する必要があるさまざまな内容を示します。\n は改行を示します。これはオプションです。印刷結果の形式のみが異なり、印刷コンテンツには影響しません。必要な特定のタイプ印刷される内容を以下に示します。

       2.4 return 0 :戻り値は 0 ですが、詳細は説明しませんので、定型文で記録して入力するだけです。

注: 英語入力では、各ステートメントの後にセミコロンを付ける必要があります。

3. データ型

char              文字データ型
ショートショート            _
int                整形
              整数
長い長い      長い整形
float              単精度浮動小数点数( 有効数字8桁、表現範囲:-3.40E+38~3.40E+38
double          倍精度浮動小数点数( 有効数字16桁、表現範囲:-1.79E+308~-1.79E+308
注: スペースのタイプごとにサイズが異なります。
さまざまなデータ型のスペース サイズ:
#include <stdio.h>
int main()
{
    printf("%d\n", sizeof(char));
    printf("%d\n", sizeof(short));
    printf("%d\n", sizeof(int));
    printf("%d\n", sizeof(long));
    printf("%d\n", sizeof(long long));
    printf("%d\n", sizeof(float));
    printf("%d\n", sizeof(double));
    printf("%d\n", sizeof(long double));
    return 0; 
}

        コードでは、%d は整数型を出力し、sizeof() はデータ型のサイズを出力するために使用されます。

結果を出力します。

         数値サイズは、さまざまなデータ型のスペース サイズを表します。単位はバイト (バイト) 1GB=1024MB 1MB=1024KB 1KB=1024byte 1 byte=8 ビットです。ビット: はバイナリ データのビットであり、 b と省略され、次のように音訳されます。ビットは、コンピュータのストレージ データの最小単位です。

4. 定数と変数

定数: C言語の定数の概念で表される 不変の値 人生において不変の値もあります (例: 円周率、性別、ID 番号、血液型など)。
変数: C言語の変数で表される 変数値(例: 年齢、体重、給与)。
         4.1 変数の定義方法
int age = 150;
float weight = 45.5f;
char ch = 'w';

        定義する必要がある変数のタイプ (int、char、float など) を選択し、その変数に対応する変数名を付けます (柔軟に定義できます。たとえば、必要なときに自分の記憶を容易にすることが最善です)値を年齢に割り当てるには、年齢を変数名として使用します)、= を使用して続行します。値を割り当てるときは、通常どおり、値を等号とセミコロンの後に置きます。

        4.2 変数の分類

グローバル変数: int main() の外部で定義され、コード全体に有効

ローカル変数:一定の範囲内で{ }で囲まれた領域を定義します。範囲外になると無効になります。グローバル変数とローカル変数が混在する場合は、ローカル変数が優先されます。

#include <stdio.h>
int b = 2020;            //全局变量
int main()
{
    int b = 2021;        //局部变量
    
    int c = 2022;        //局部变量
    printf("b = %d\n", b);
    return 0;
 }

結果を出力します。

4.3 変数の使用

        2 つの数値の合計を計算する例を見てみましょう

#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; 
}

      2 つの乱数を入力します  

 

        コードでは、まず入力する必要がある 2 つのデジタル整数型 int num1=0; int num 2=0 を定義し、初期値 0 を割り当ててから、出力する必要がある値を格納する変数を定義します。 int sum=0; 両方の 0 に初期値を入れます; 最初にプロンプ​​トを出力し、2 つのオペランドを入力します:> scanf ("%d %d", &num1, &num2) を使用して、変数 num1 と num2 のアドレスを見つけて目的を達成します任意の時点で変数に値を代入する場合、 sum=num1+num2 アルゴリズムを定義します。つまり、2 つの数値の合計を求め、変数 sum を使用して結果を引き継ぎ、最後に printf を使用して sum の値を出力します。 。

4.4 変数のスコープとライフサイクル
        1. スコープ: これはプログラミングの概念であり、一般に、プログラム コードの一部で使用される名前は常に有効であるとは限りません。
であり、この名前の可用性を制限するコードのスコープは、この名前のスコープです。
                1. ローカル変数のスコープは、変数が配置されているローカル スコープです。
                2. グローバル変数のスコープはプロジェクト全体です。
        2. ライフ サイクル: 変数のライフ サイクルは、変数の作成から変数の破棄までの期間を指します。
                1. ローカル変数のライフ サイクルは次のとおりです。ライフ サイクルはスコープに入ったときに始まり、スコープから出たときに終了します。
                2. グローバル変数のライフサイクルは、プログラム全体のライフサイクルです。

4.5 定数

C言語では定数と変数の定義形式が異なります。

        1. リテラル定数:既知の値

        2.const 変更定数変数:割り当てられた変数に固定された効果があり、後で変更することはできません。

#include <stdio.h>
int main()
{
	const int num = 4;
	printf("%d\n", num);
	int num = 8;//此处对num再赋值已经无效了
	printf("%d\n", num);
	return 0;
}

         このうち、const 修飾された定数変数は代入された合計に対して固定の効果を持ち、その後の num への代入は効果がありません。num には固定値が代入されていますが、num の本質は変数であることに変わりはありません。検証は次のとおりです。

#include <stdio.h>
int main()
{
	const int n = 10;
	int arr[n] = { 0 };//数组[]中需要的是一个常量,虽然const修饰的n有常属性,但是他的本质是一个变量所以有错误
	return 0;
}

したがって、出力はありません。

        

        3. #define で定義された識別子定数:定義された識別子はメモリを占有せず、単なる一時的なシンボルであり、プリコンパイル後には存在しなくなります。例: MAX への代入は main 関数の外部で定義されます。

#include <stdio.h>

#define MAX 10
int main()
{
	int arr[MAX]={0};
	printf(" %d\n", MAX);
	return 0;
}

 

        4. 列挙型定数:列挙型定数を 1 つずつ列挙する必要があり、列挙型キーワード enum を使用する必要があります。列挙型に配置されたものを列挙型定数と呼びます。    

#include<stdio.h>
enum people
{
	KID,
	MAN,
	WOMAN,
};                //其中KID,MAN,WOMAN,叫做枚举常量
int main()
{
	printf("%d\n", KID);
	printf("%d\n", MAN);
	printf("%d\n", WOMAN);
	return 0;
}

5.文字列+エスケープ文字+コメント

        5.1 文字列: 二重引用符で囲まれたこの文字列は、 文字列リテラル ( String Literal)、または単に文字列と呼ばれます。たとえば、最初のコードの「Just do it!\n」
#include <stdio.h>
int main()
{
    printf("Hello\n");
    printf("Just do it!\n");
    return 0; 
}
        5.2 エスケープ文字: エスケープ文字は、「\」で始まり、その後に 1 つまたは複数の文字が続く文字で、バックスラッシュ「\」以降の文字を別の意味に変換することを意味します。
エスケープ文字 意味
\0 終了標識
\?
複数の疑問符を続けて書くときに、疑問符が 3 文字の単語に解析されるのを防ぐために使用されます。
\'
文字定数を表すために使用されます '
文字列内の二重引用符を表すために使用されます
\\
バックスラッシュを表すために使用され、エスケープ シーケンス文字として解釈されるのを防ぎます。
\a
警告文字、ブザー
\b
バックスペース文字
\f
紙送り文字
\n
改行
\r
入力
\t
水平タブ
\v
垂直タブ
\ddd
ddd は 1 ~ 3 の8 進数 を表します 例:\130 
\xdd
dd は 2桁の 16 進数 を表します 例: \x30         

        1. まずはエンドマークについてご紹介します\0

#include<stdio.h>
int main()
{
	char arr1[] = "bit";
	char arr2[] = { 'b', 'i', 't' };
	char arr3[] = { 'b', 'i','t', '\0' };
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
	return 0;
}

結果を出力します。

         文字列を配列に入れると、デフォルトでは最後に\0が入ります。つまり、配列 char arr1 [ ]={"bit"} には、実際に含まれる内容は 'b', ' になります。 i', 't' , '\0' なのでビットを出力したら終了ですが、array char arr2 [ ]={'b', 'i', 't'} のような単一文字が入力された場合、デフォルトでは末尾に\は入らない0なので、ビットを出力した後、出力は終了せず、いくつかのランダムな値が出力されます。したがって、「熱い、熱い、熱い、熱い、熱い、それ」がいくつかあります。末尾に手動で \0 を入力すると、配列 char arr3 [ ]={'b' のように終了マークを手動で付けることになります。 , 'i', 't', '\0'}、印刷後にビットが \0 に遭遇すると、印刷は終了します。

       

        2. エスケープ文字 \?:疑問符が 3 文字の単語に解析されるのを防ぐために、複数の連続した疑問符を記述するときに使用します。3 文字の単語は、コンパイラの古いバージョンに存在します。

#include<stdio.h>
int main()
{
	printf("(are you ok\?\?)\n");//   \?在书写连续多个问号时使用,防止他们被解析成三字母词
	return 0;
}

結果を出力します。

  

        3. エスケープ文字 \' および \":単に一重引用符と二重引用符を出力するためのもの

#include<stdio.h>
int main()
{
	printf("\'");
	printf("\"");
	return 0;
}
結果を出力します。
        4. エスケープ文字 \t: 水平タブ文字。出力結果は Tab キーを 1 回押して開いた距離に相当します。
#include<stdio.h>
int main()
{
	printf("a\ta");
	return 0;
}

出力結果:

              2 つの文字 a の間の距離は、\t によって開かれる 1 つのタブの距離です。
        5. エスケープ文字 \ddd および \xdd: ddd は 1 ~ 3 の 8 進数 を表します。 例:\130、
                                        
                                                dd は 2桁の 16 進数 を表します 例: \x30
                                               印刷時に出力されるのは、対応する表現基数を 10 進数に変換した後、その 10 進数が ASCII コード表に対応する文字に対応するものです。
#include<stdio.h>
int main()
{
	printf("\101\n");
	printf("\x42");
	return 0;
}

出力結果:

        このうち、8進数の\x42を10進数に変換した数値は65、16進数の\x42を10進数に変換した数値は66となります。

          6. エスケープ文字 \\: バックスラッシュがエスケープ シーケンス文字として解釈されるのを防ぐためにバックスラッシュを表すために使用されます。これは、二重否定がプラスの効果を持つのと同様に、\ でエスケープされた文字をキャンセルするのと同じです。また、\\ は、コード内で最も一般的に使用される用途の 1 つであり、コードの意味を説明し、対応するコードの機能の理解を容易にし、他の人が読みやすくするために使用されます。
#include<stdio.h>
int main()
{
	printf("c:\\test\41\test.c");       
	return 0;
}

出力結果:

          このうち、\t は水平タブ文字と呼ばれ、タブキーのスペース位置に相当しますが、\t をエスケープ文字として認識させないようにするため、\\ をバックスラッシュとして指定します。エスケープ文字として解釈されます。二重否定は肯定とほぼ同じ意味を持ちます。8 進数 \41 は 10 進数 33 に変換され、対応する ASCII コード文字は! 、他の文字はエスケープ文字なしで直接出力されます。

        7. エスケープ文字 \a: 警告文字、ブザー

#include<stdio.h>
int main()
{
	printf("\a");
	return 0;
}

         印刷時に「ドンドン」という音が発生します。

        8. エスケープ文字 \b: バックスペース文字

#include<stdio.h>
int main()
{
	printf("abcdef\b\b\b\b");
	return 0;
}

結果を出力します。

         \b はバックスペースを意味します。対応する位置に後退すると、対応する文字は印刷されません。バックスペースの場合は重ね合わせ効果があります。上記のコードでは、合計 4 つの \bs が入力され、対応する文字が 4 つ戻ります。入力 abcdef の下から 4 番目の数字 c は印刷されません。

        9. エスケープ文字 \f: ページ変更、現在位置を次のページの先頭に移動します。プリンタを使用する場合、ページは直接変更されますが、これはコンパイラでは明らかではありません。

        10. エスケープ文字 \v: 垂直タブ文字。印刷時にも使用されます。

        11. エスケープ文字 \r: キャリッジ リターン。現在位置をこの行の先頭に移動し、印刷を上書きします。

#include<stdio.h>
int main()
{
	printf("abcdef\r");
	return 0;
}

結果を出力します。

        5.3 注意事項: 1. コード内に不要なコードがある場合は、直接削除するか、コメントアウトしてください。

                        2. コード内の一部のコードがわかりにくい場合は、コメントを追加できます。
        コメントには 2 つのスタイルがあります。
                        C 言語スタイルのコメント /*xxxxxx*/
                        欠点: コメントをネストできない
                        C++ スタイルのコメント //xxxxxxxx
                        1行または複数行にコメントを付けることができます

例として、関数を使用して 2 つの数値の合計を計算します。

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int Add(int x, int y)
{
	return x + y;
}
/*C语言风格注释
int Sub(int x, int y)
{
    return x-y;
}
*/
int main()
{
	int a = 0;
	int b = 0;					//C++注释风格
	scanf("%d%d", &a, &b);		//用scanf取a,b的地址,能够随机赋值计算
	printf("sum=%d\n", Add(a, b));  //调用Add函数,完成加法
	return 0;
}

結果を出力します。

 

6. 選択ステートメント: if ステートメントと switch case ステートメントで実装

        一生懸命勉強すれば良い仕事が見つかるよ
        勉強しないと良い仕事に就けない
        これが選択です!
たとえば、if ステートメントを使用して次を実装します。
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
int main()
{
	int num = 0;
	printf("学习编程\n");
	printf("你能够坚持吗?(0不能/1能)");//>:为提示符
	scanf("%d", &num);
	if (1==num)
		printf("好工作,高薪资");
	else
		printf("平淡的生活");
	return 0;
}

7.ループ ステートメント: while ステートメント、for ステートメント、do... while ステートメントを使用して実装されます。

        勉強など、毎日やらなければならないことは常に行われなければなりません

たとえば、1 から 100 までの数値を連続して入力するには、while を使用します。

#include<stdio.h>
int main()						//代码功能:输出1-100的数字
{
	int a = 1;
	//int b = 0;
	while (a < 101)
	{
		printf(" %d", a );
		a += 1;			
	}
	return 0;
}

結果を出力します。

 8. 機能:コードを簡素化し、コードを再利用します。

        8.1 ライブラリ関数:基本関数を説明する場合、それらはビジネス コードではありません。C 言語の基本ライブラリは、移植性をサポートし、プログラムの効率を向上させるために、プログラマがソフトウェアを開発しやすいように、一連の同様のライブラリ関数を提供しています。のように:

1. C言語プログラミング         を学習するとき 、コードを書いた後は常に結果を知り、その結果を画面に表示したいと思うでしょう。このとき、情報を特定の形式で画面に出力する関数 ( printf ) を頻繁に使用します。
        2. プログラミング プロセス中に、文字列 ( strcpy ) を頻繁にコピーします。
3. プログラミングでは計算も行います。nのk 乗( pow )などの演算        を常に計算します
        C 言語のその他のライブラリ関数について詳しく知りたい場合は、C++ 公式 Web サイトにアクセスして以下を参照してください。
        C++公式サイト(英語版): cppreference.com
         C++ 公式 Web サイト (中国語版): cppreference.com
cplusplus.com - C++ リソース ネットワーク         にもアクセスしてください。
ライブラリ関数の簡単な分類:
                                        1.IO機能
                                        2. 文字列操作関数
                                        3.キャラクター操作機能
                                        4. メモリ操作機能
                                        5. 時刻/日付機能
                                        6. 数学的関数
                                        7. その他のライブラリ関数
: ただし、ライブラリ関数について知っておくべき秘密が 1 つあります。それは、ライブラリ関数を使用するときは、 #include に対応するヘッダー ファイルをインクルードする必要があるということです。

        8.2 カスタム関数:ライブラリ関数ですべてができるのであれば、プログラマは必要ありません。さらに重要なのはカスタム関数ですカスタム関数は、ライブラリ関数と同じ関数名、戻り値の型、および関数パラメータを持ちます。しかし、違うのは、これらを自分たちでデザインするということです。これにより、プログラマーには多くの余地が与えられます。

たとえば、2 つの数値の合計を計算します。

#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; 
}

関数を使用して 2 つの数値の合計を計算します。

#include <stdio.h>
int Add(int x, int y) 
{
   int z = x+y;
   return z; 
}
int main()
{
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    printf("输入两个操作数:>");
    scanf("%d %d", &num1, &num2);
    sum = Add(num1, num2);
    printf("sum = %d\n", sum);
    return 0;
}

        自己定義関数 int Add(int x, int y) を直接呼び出すため、コードを繰り返し入力する必要がなく、2 つの数値の合計を求める必要がある場合は、関数を直接呼び出すだけです。

9. アレイ

        9.1 定義:同じタイプの要素のセット

                例: 1 から 10 までの数字を保存するにはどうすればよいですか?

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
         9.2 配列の添字: C 言語では、配列の各要素には添字があり、添字は 0から 始まると規定されています。
配列には添字を使用してアクセスできます。
                
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//如果数组10个元素,下标的范围是0-9

配列内の各値に対応する添え字は次のとおりです。

配列内の値を出力します。

#include <stdio.h>
int main()
{
     int i = 0;
     int arr[10] = {1,2,3,4,5,6,7,8,9,10};
     for(i=0; i<10; i++)
 {
     printf("%d ", arr[i]);
 }
     printf("\n");
     return 0;
 }

 結果を出力します。

 10. 演算子: 算術演算子、シフト演算子、ビット演算子、代入演算子

        10.1 算術演算子: + - * (乗算記号) / (除算記号) % (剰余)

        1. % 演算子に加えて、他のいくつかの演算子が整数と浮動小数点数を演算できます。
        2. / 演算子の場合、両方のオペランドが整数の場合は、整数の除算を実行します。浮動小数点数が存在する限り、浮動小数点除算が実行されます。
        3. % 演算子の 2 つのオペランドは整数である必要があります。除算後の剰余を返します。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 1;        //对b赋的初始值不能为0,因为在后面要作为除数
	int c = (-8 + 22) * a - 10 + b / 2;
	int d = a % b;
	scanf("%d%d", &a, &b);
	printf("计算结果=%d\n", c);
	printf("取余=%d\n", d);
	return 0;
}

結果を出力します。

         10.2 シフト演算子:         <<左シフト演算子 >>右シフト演算子

        1. シフト演算子のオペランドは整数のみです。
        2. 10 進数から 2 進数に変換した後にバイナリ値をシフトすることを目的としています。
        3. 左シフト演算子の場合、左側は破棄され、右側は4. 演算子
        シフトする場合、負のビットを移動しないでください。これは標準では定義されていません。

int main()
{
	int a = 1;//int型有4个字节32个比特位转化为二进制00000000000000000000000000000001  转化为十进制就为1
	int b=a << 2;                               //00000000000000000000000000000100  转化为十进制就为4
    int b=a<<-1;//错误的移位
	printf("%d", b);
	return 0;
}

結果を出力します。

        シフト演算子は 2 進数をシフトするために使用されます。たとえば、上記のコードでは、int 型の 4 バイト = 4x8 = 32 ビットで、対応する整数がまず 32 ビットの 2 進数に変換され、その後 2 進数がシフトされます。ビット コンプライアンス - 左シフト演算子が使用される場合、左側は四捨五入され、右側はゼロで埋められます。右シフト演算子が使用される場合、右側は四捨五入され、左側はゼロで埋められます。最後に、シフトされた 2 進数が 10 進数に変換されて出力されます。

        10.3 ビット演算子:      & ビットごとの AND | ビットごとの OR ^ ビットごとの XOR (すべてバイナリの場合)

#include<stdio.h>

int main()
{
	int a = 1;			//0001
	int b = 2;			//0010
	printf("%d\n", a & b);			//0000
	printf("%d\n", a | b);			//0011
	printf("%d\n", a ^ b);			//0011     相同为0不同为1
	return 0;
}


結果を出力します。

         10.4 代入演算子: = +=         -=         *         = /         = &=         ^ =          |=            >>=   <<=                

        代入演算子は、これまで満足できなかった値を取得できるようにする優れた演算子です。つまり、自分自身を再割り当てすることができます。
        10.5 単項演算子:
オペレーター 効果
論理逆演算
- 負の値
+ 正の値
& アドレスを取得する
のサイズ オペランド型の長さ (バイト単位)
数値のバイナリ表現のビット単位の否定
-- フロント、リア--
++ フロント、リア++
* 間接アクセス操作料(逆参照操作方式)
(タイプ) キャスト

                最初の 5 つの演算子は以前に紹介しましたが、ここでは次の 5 つの演算子だけを紹介します。

       1. 2 進数のビットごとの反転~: ~ は 2 進数をビットごとに反転するために使用される単項演算子です。つまり、0 は 1 に変更され、1 は 0 に変更されます。例: 16 進数の 9 は、0x00000009 に対応します。否定され、~9 は 0xfffffff6 に対応します。

#include<stdio.h>
main()
{
	int a = 0;
	printf("%x", ~a);
}

結果を出力します。

        2. Prefix と post++: prefix ++ の役割は、最初に操作を実行してから値を割り当てることですが、postfix ++ は最初にコピーしてから操作を実行することです。

プレフィックス++:

#include <stdio.h>
main()
{
	int i = 2;
	int a=++i;
	int b = i;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
}

結果を出力します。

         コードでは、まず i に初期値 2 を与え、b を使用して i の最終値を反映します。Prefix ++ は、まず 2 に対して +1 演算を実行し、変数 a に 1 を加算した後、値 3 を代入します。つまり、a の値は 3 になります。演算と代入の後、i の値は 3 になるため、i は変更されます。最後の値 3 が b に割り当てられるため、b の値は 3 になります。

ポスト++:

#include <stdio.h>
main()
{
	int i = 2;
	int a = i++;
	int b = i;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
}

結果を出力します。

         コードでは、まず i に初期値 2 を与え、b を使用して i の最終値を反映します。Postfix ++ では、まずi の値 2 を a に代入し、次に i に 1 を加算します。その後、a の値は 2 になります。代入と演算の後、i の値は 3 になるため、変更された i の値 3 は次のようになります。 b

        3. 前置詞、後置詞 --:

接頭辞 --:

#include <stdio.h>
main()
{
	int i = 2;
	int a = --i;
	int b = i;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
}

結果を出力します。

         コードでは、まず i に初期値 2 を与え、b を使用して i の最終値を反映します。事前配置 - 最初に 2 に対して -1 演算を実行し、次に 1 を引いた後の値 1 を変数 a に代入します。つまり、a の値は 1 になります。演算と代入の後、i の値は 1 になるため、i は変更されます。後の値 1 は b に代入されるため、b の値は 1 になります

後置 --:

#include <stdio.h>
main()
{
	int i = 2;
	int a = i--;
	int b = i;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
}

結果を出力します。

        コードでは、まず i に初期値 2 を与え、b を使用して i の最終値を反映します。後置 --最初に i の値 2 が a に割り当てられ、次に i が 1 減算され、a の値は 2 になります。割り当てと演算の後、i の値は 1 になるため、変更された i の値 1が b

        4. 間接アクセス演算料(逆参照演算方式) ※:ポインタによく使われる演算子

#include<stdio.h>
int main()
{
	int a = 10;
	int* p= &a;
	*p =20;
	printf("%d\n", a);
	return 0;
}

 結果を出力します。

         このコードを理解するには、まずポインターの概念を理解する必要があります。最初に下にスクロールして、ポインターについて暫定的に理解することができます。コード内の*p=20 ; *は逆参照演算子で、p に格納されているアドレスから p が指すオブジェクトを検索することを意味し、*p は p が指すオブジェクトであり、変数 a を表します

        5. 強制的な型変換 (型):

#include<stdio.h>
int main()
{
	double a = 3.14;
	printf("%d\n", (int)a);
	return 0;
}

結果を出力します。

         元々定義されていた変数はdouble型です 強制変換(型)では変数aがint型に変換されます この演算子を使用する場合は変換したい型を括弧内に入れて、変換したい変数を入れてくださいポストカットは 1 つの変数に対してのみ有効です。() の後に変数が 2 つある場合は、その後に続く最初の変数に対してのみ有効です。変換はこのステートメントと他の場所でのみ有効です。変数 a は依然として double 型です。

        10.6 関係演算子:
> 以上
>= 以上
< 未満
<= 以下
!= 「不平等」をテストするために使用される
== 「平等」をテストするために使用されます

        10.7 論理演算子:
&& 論理積
|| 論理的または

        10.8 条件演算子: exp1 ? exp2 : exp3
        10.9 カンマ式: exp1 exp2 exp3 、...expN
        10.10. 添字付き参照、関数呼び出し、構造体メンバー:         [] () .          ->

11.共通キーワード: C言語には豊富なキーワードが用意されていますが、これらのキーワードは言語自体によってあらかじめ設定されており、ユーザーが自分でキーワードを作成することはできません。

auto           break            case           char           const            continue           default           do          ​ double         else           enum           extern         float           for            goto           if            int            long           register             return            short           signed                 sizeof           static         struct   switch           typedef        union           unsigned           void           volatile           while
十二、#define 定义常量和宏
        12.1 #define 定义常量
#include(stdio.h)
#define c 100
int main()
{
	printf("%d\n", c);
	int d = 100;
	printf("%d", d);
	return 0;
}

打印结果:

         12.2 #define 定义宏:

#include<stdio.h>
#define add(x,y)(x)+(y)    //宏名  参数 宏体
int main()
{
	int a = 10;
	int b = 20;
	int c = add(a, b);    //替换成int c=((a)+(b))
	printf("%d", c);
	return 0;
}

打印结果:

 十三、 指针

        13.1 想了解指针需要先了解一下内存:内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

        内存单元有相对应的编号,这一个编号就是地址,这个地址也叫做指针,也就是说地址就是指针,用来储存地址的变量叫指针变量。

        如何取出变量的地址呢?就要用到前面介绍的取地址符&

#include <stdio.h>
int main()
{
 int num = 10;
 &num;//取出num的地址。注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
 printf("%p\n", &num);//打印地址,%p是以地址的形式打印
 return 0;
 }

        &num的作用就是取出创建的变量num的地址

内存
一个字节 0xFFFFFFFF
一个字节 0xFFFFFFFE
一个字节 0xFFFFFFFD
0x0012FF47
0x0012FF46
0x0012FF45
0x0012FF44
一个字节 0x00000002
一个字节 0x00000001
一个字节 0x00000000

        变量num的类型是int类型,其大小为4个字节,红色的部分为num的地址,打印的地址就是读取到num的第一个地址。

        变量取出来后如果需要储存,就需要定义指针变量:

int num = 10;
int* p=&num;            //int说明指针变量p所指的变量num是一个整形

指针的具体使用:

#include<stdio.h>
int main()
{
	int a = 10;
	int* p= &a;
	*p =20;
	printf("%d\n", a);
	return 0;
}

打印结果:

        定义一个整型的变量a=10,用&a取出变量a的地址并放入指针变量p中,指针变量p的类型(也就是a的类型)是整型,用解引用符找到p变量的指向对象(a),并对指向对象重新赋值20,打印a的结果时发现打印的就是第二次赋值的20。
        13.2 指针变量的大小,用到前面所介绍的sizeof
#include<stdio.h>
int main()
{
    printf("%d\n", sizeof(char *));
    printf("%d\n", sizeof(short *));
    printf("%d\n", sizeof(int *));
    printf("%d\n", sizeof(double *));
    return 0; 
}

打印结果:

         结论:指针大小在32位平台是4个字节,64位平台是8个字节。

14. 構造:構造はC言語で特に重要な知識ポイントであり、構造によってC言語は複雑な型を記述することができます。
たとえば、学生を説明する場合、学生には名前+年齢+性別+学生番号といういくつかの情報が含まれますこれは、構造、具体的には単一のタイプを組み合わせて使用​​することによってのみ説明できます。
#include<stdio.h>
struct xs				//定义结构体类型要用struct,这个类型名叫xs(自己定义)
{
	char name[20];   //叫做结构体成员,其中要放的是字符串,需要将字符串放到字符串数组里面  
	int age ;
	char sex[10];
	char id[15];
};
void project(struct xs* dy)   //自定义函数project,将s的地址赋给dy,*dy表示的是s
{
	printf("%s %d %s %s\n", (*dy).name, (*dy).age, (*dy).sex, (*dy).id);			
	printf("%s %d %s %s\n", dy->name, dy->age, dy->sex, dy->id);
}
int main()
{
	struct xs s = { "张三", 21 ," 男 ","20209999" };//s为创建的结构体变量,访问其对象时,需要加.这个操作符
	printf("%s %d %s %s\n", s.name, s.age, s.sex, s.id);
	project(&s);           //自定义函数,取s的地址给自定义的函数
	return 0;
}

結果を出力します。

         構造体の印刷メソッドは上図の 3 つで、project() 関数内にあるものはポインタを使用して印刷し、外側のものはポインタを作成せずに直接印刷します。関数内部の印刷方法は外部のものと大きな違いはありません。

関数外:印刷する場合は、印刷したい型を記入し、最後に構造体変数を記述し、文字列の変数名(名前、年齢、性別、id)をこの形式で印刷します。

関数内: 構造体の変数名をポインタに置き換えます (形式が変わるだけで本質は変わりません) 最後に、演算子「.」を「->」に変更します。

おすすめ

転載: blog.csdn.net/m0_64616721/article/details/124147903