【C言語】C言語のマクロフレームワークをわかりやすくわかりやすく解説

はじめに:
この記事では、C 言語の基本的な理解、C 言語の知覚的理解、そのフレームワークを提供し、後でさらに詳細に補足します。



C言語

C言語とは何ですか?

C 言語は人間と機械の間の通信用の言語です。初期の人間はバイナリ システム (科学研究者) を使用してコンピュータと通信し、後にアセンブリを簡素化 (一部のオタク)、次に B 言語、C 言語 (普及)、そして最後に C++/Java になりました。 ..., C言語はコンピュータと通信してアイデアを実現するプログラミング言語です


最初の関数

C言語/C++では、IDE(統合開発環境)でプロジェクトを作成するとデフォルトで以下のコードが表示されます。

int main()
{
    
    
	return 0;
}
//或者是
int main(int argc,char *argv[])
{
    
    
	return 0;
}
//这里的argc 和  argv是命令行参数,argc是有多少个指令 argv就是指令啦,挖坑。

初めて見ると「これは何だろう?」と疑問に思う人もいるかもしれません。使用は何ですか?食べてもいいですか?3問連続です。幸運なことに、あなたは私に出会えました。次のように説明してください。

main 関数はプログラムのエントリ ポイントであり、これが実行する唯一の方法です。彼はこんな感じだと思うかもしれませんが但是他还有许多的坑或者说细节:一个项目中只能有一个main函数,一个项目只能有一个main函数,一个项目只能有一个main函数重要的事情说三次、複数書いたらどうでしょうか?
ここに画像の説明を挿入
那当然是报错喽,运行不起来。

次の機能を導入します。
ここに画像の説明を挿入


変数

変数は単にデータを格納するために使用され、組み込みタイプやカスタム タイプなど、複数のタイプの変数があります。次に、なぜその型が必要なのかを尋ねるかもしれません。如果抽象成现实生活中事情,那就是买房子,每个人的需求不一样买的房子也不一样,但是造房子有对应的户型,当然是你也可以买地皮自己造.......当然计算机也是创建变量本质也就是向内存申请空间

//内置类型 
	// sort(短整型)、int(整型)、long(长整型)、long long(长长整型) 、char(字符型)、float(单精度浮点型)、double(双精度浮点型)
//sizeof是一个关键字,也是一个操作符,计算变量的大小(字节)
printf("%d",sizeof(short)) //sort 和short int  result: 2字节
printf("%d",sizeof(int)) // result:4
printf("%d",sizeof(long)) // result:4 
printf("%d",sizeof(long long)) //result:8 
printf("%d",sizeof(char)) //result:1
printf("%d",sizeof(float)) //result:4
printf("%d",sizeof(double)) //result:8


//自定义类型
	//struct 所定义的变量,现在感性理解他就是内置类型的集合体
	//union 联合体
	//变量类型大小涉及到特殊存储规则,挖坑

なぜバイトが使われるのか疑問に思う人もいるかもしれません。バイトとは何ですか?

図に示すように、コンピュータの単位と換算:
ここに画像の説明を挿入
では、なぜバイトなのでしょうか? コンピュータは0101というバイナリ列しか認識しないので、データの格納もメモリ上にバイナリで格納されることになるので、上図のように当然バイトを
使うのがベストです。byte少了kb又太多、などが保存されています)それはわずか4mbです(オペレーティングシステムを見てください)、kbの場合、ほとんどのプロジェクトは変数を作成するのに十分ではありません〜ASCII


テーブルを展開します
ここに画像の説明を挿入

ローカル変数とグローバル変数

簡単に理解すると、スコープ(つまり、変数が使用できる範囲)またはライフサイクル(つまり、変数の作成から破棄までの範囲)を次のように見ます。

int global; //全局变量
int main()
{
    
    
	int local;//局部变量 
	return 0;
}

//全局变量:从创建到程序结束才释放
//局部变量:从创建到花括号/大括号({})结束,但是可以用static修饰导致他出了作用域爷不会销毁,挖坑

興味深い例/機能

#include<stdio.h>

int a =1;
int main()
{
    
    
	int a = 2;
	printf("%d",a);
	return 0;
}

答えは何だと思いますか: (1, 2)?
2 を選択した場合は、おめでとうございます。正しいものを選択したことになります。なぜですか? 真剣に聞いてくださったので、親切に教えます。这个就是局部优先的原则,全局变量和局部变量重名时局部优先。ただし、通常はこのようなコードを書くことはお勧めしませんが、これはタイトルに表示されますので、注目してください。

絶え間ない

名前の通り、作成後に変更することはできません。変更するとエラーが報告されます。C言語では以下のような作成方法があります。

#include<stdio.h>
int main()
{
    
    
	//1.字面常量
	10;
	//2. const所修饰的常变量,后面和指针数组结合会有奇怪的化学反应
	const int a;  int const a; //俩者一致
	//3. 宏定于的标识符常量
	#define MAX 100;
	return 0;
	//4.枚举类型就是一一可以列举的值,可以理解给数字起名字,如下代码Read默认从0开始后面依次递增,也可以赋值赋值后已赋的常量为起点依次递增
	enum 类型
	{
    
    
		Read,
		Green,
		Blue	
	}	
}

質問があるかどうかわかりませんが、それ以外はすべて定数ですが、変更された const はなぜ定数変数と呼ばれるのでしょうか?

//在C11标准之前创建数组只可以用常量,数组就是同类元素的集合
const int count = 10;
int arr[count]; //这样就会报错

文字列とエスケープ文字

文字列は、二重引用符のペアで囲まれた複数の文字の文字列であり(“ ”)、文字列の終了表現は\0次のようになります。
リソース マネージャーの検証:
ここに画像の説明を挿入

コードで確認する

ここに画像の説明を挿入
sizeof から、a2 は a1 よりも要素が 1 つ多いことがわかりますが、strlen の文字列長 a2 は a1 よりもはるかに長く、strlen も \0 で終了していることがわかります。 \0 を探してください

エスケープ文字:

ここに画像の説明を挿入


ヘッドファイル

printf や scanf (入出力ライブラリ関数) を使用するときに、なぜヘッダー ファイルを引用する必要があるのか​​考えたことがあるでしょうか。

ライブラリ関数は使用頻度が高いので、公式に実装されていると便利です。
ヘッダー ファイルを引用する必要があるのは、コンパイル時にヘッダー ファイルに含まれるすべてのコード (ライブラリ関数) が現在のファイルに自動的にコピーされるためです。

拡大する

// 当你使用函数的时候是从上往下查找的后实现的代码写到下面去如下所示
int add(int x , int y);

int main()
{
    
    	
	prinft("%d",add(10,20));
}
int add(int x , int y)
{
    
    
	return x+y;
}

分岐とループ

私たちは日常生活で何かを選択したり繰り返したりしていますが、もちろんプログラミングでは選択が分岐、繰り返しがループとなります。次のコードを使用します。

// 分支
	//单分支 if/else if/ else
	//多分支 switch
if(条件)//条件真则执行语句1
	语句1;
else//条件假执行语句2
	语句2;

if(条件1)//条件1真则执行语句1
	语句1;
else if(条件2)//条件1假且条件2真则执行语句2
	语句2;
else//条件1且条件2都是假则执行语句3
	语句3;

//当switch的值和case值一样时则执行对应的语句,如果都不满足且有default则执行default中的语句
switch()
{
    
    
	case1:
		语句1;
	case2:
		语句2;		
	case3:
		语句3;
	default:
		语句4;
}
//循环
	//while
	while(条件) //当条件满足时会一直循环执行语句不满足时候则退出循环
	{
    
    
		语句;
	}
	//for:一般用于已经知道循环多少次
	for(变量;条件;退出条件)
	{
    
    
		语句;
	}
	do
	{
    
    
		语句;
	}while)(条件); //do while无论条件是否满足都会执行语句 

ループと分岐の両方で使用できるキーワード:

  1. continue このステートメントを実行すると、このサイクルがスキップされます。つまり、次のコードは実行されません。
  2. Break ループから直接抜け出す
int main()
{
    
    
	for(int i=0;i<10;i++)
	{
    
    
		if(i ==5)
		{
    
    
			continue;
		}
		printf("%d ",i);
	}
	//result:0 1 2 3 4 6 7 8 9


	for(int i=0;i<10;i++)
	{
    
    
		if(i ==5)
		{
    
    
			break;
		}
		printf("%d ",i);
	}
	//result:0 1 2 3 4	
}



注記

プログラミングの学習には枝葉があり、コメントを書くのが嫌い、コメントを書かないのが嫌いです。では、コメントは何に使用されるのでしょうか? それは、あなたや他の人がコードを理解するのに役立つことです。C言語でコメントする方法

  1. //
  2. /**/、ネストできないため、この方法はお勧めできません

ここに画像の説明を挿入

/**/ 便利なテクニック: 関数を実装し、多くのパラメーターがある場合、次のようにパラメーターに注釈を付けることができます。

int add(int x/*参数1*/,int y /*参数2*/)
{
    
    return x+y;}
int main()
{
    
    
	add(10,20);
}

配列

同じ型の変数のセット。構文は次のとおりです。

// 类型 + 数组名 + [数组变量个数]  = {数据}
int arr[10];

特殊な構文: C11 より前のバージョンでの配列作成定義の数は一定要是常量,不変数にすることができますが、定数である必要があります。

変数にアクセスして変数に入れるにはどうすればよいですか?

//[](下标访问操作符) 或者 *数组名+值
//注意,下标是从0开始的一定要记住,不然就越界访问了
int arr [10];
for(int i =0;i<=10;i++)
{
    
    
	arr[i] = i;
	printf("%d ",arr[i]);//result:0 1 2 3 4 5 6 7 8 9
}

for(int i =0;i<=10;i++)
{
    
    
	printf("%d ",arr+i);
}


キーワード

C 言語には、次のような特別な機能を備えた文字であるキーワードが多数あります。
ここに画像の説明を挿入

静電気の役割

  1. ローカル変数を変更する
//static 会改变局部变量的生命周期
int fun1()
{
    
    
	int a = 0;
	a++;
	printf("%d ",a);
}

int fun2()
{
    
    
	static int a = 0;
	a++;
	printf("%d ",a);
}

int main()
{
    
    
	for(int i =0;i<3;i++)
		fun();
}
//result fun1: 1 1 1
//result fun2: 1 2 3

ここに画像の説明を挿入

  1. グローバル変数と関数の宣言は、
    宣言後、この .c ファイル内でのみ使用できます。通常、同じプロジェクト ファイル内では、宣言 (extern) されている限り、他の .c ファイルも使用できます。
    ここに画像の説明を挿入

しかし、もしかしたらそのようなシーンがあった在多人开发时A1写了个add的函数但是他的功能是俩数相加在加1,A2后面在开发别的功能想要用add函数但是他想要的就是简单的俩数相加,他偷懒声明看看有没有如果有場合、大きなトラブルを引き起こす可能性があるため、static を変更することでそのようなウーロンを回避できます。
ここに画像の説明を挿入

オペレーター

ここに画像の説明を挿入

//算数操作符
	printf("加:%d",1+2); //3
	printf("减:%d",1-2); //-1
	printf("乘:%d",1*2);//2
	printf("除:%d",1/2);//0
	printf("取模:%d",1%2);//1,取余数
//除法在这里是向下取整,并不是小数,但是只要除数和被除数其中一个是小数则结果也是小数
//取模俩边一定是整数不然会报错



//移位操作符(移动的是存储的二进制位,如上所述每个值在底层存储都是以二进制存储的,然后其实简单理解就是二进制位向左/右移动)
	printf("左移:%d",1<<2); //2
	printf("右移:%d",1>>2); //0
//8进制位例子
	00000001 >> 1 = 00000000	
	
	
//位操作符
printf("加:%d",1&1);// 1,对应的二进制位都是1时则保留,其余都为0
printf("加:%d",1|0); //1,对应的二进制位只要一个是1就为1
printf("加:%d",1&0); //0,对应的二进制位不同时则保留
//8进制位例子
	00000001			   | 00000001
		&	--->000000000  |		&    --->00000000
	00000001			   | 00000000		


//单目操作符
printf("! %d",!0001); // 0 ,逻辑反,非零数值变零,零变1
printf("sizeof %d",sizeof(int)); // 4,计算大小,也就是字节数
printf("前后置++/-- %d",++1); //2 就是自增或者自减,后置则为 1 先输出在加减
printf("~%d" ,~0001);//-2,全部二进制位取反
int a =10;
printf("& %p",&a);//0xadada 取地址,取出a在内存中的地址/编号 
printf("* %d",*(&a)); //10 解饮用,就是拿着地址去找对应的值



//逻辑操作符
printf("&& 与 %d",1&&1); // 1 ,逻辑与,操作符俩边都要是真的则为真
printf("|| 或 %d",1||0); //0 ,逻辑或,操作符俩边只要一个是真的则为真


//条件操作符/三目操作符
printf("%d",1>2?1:2); // 2 ,语法格式 a>b:a:b a>b真则为a反之b


大きい

実際、これは #define で定義された関数であり、通常は短い関数です。

#define ADD(X,Y) X+Y
int add(int x,int y)
{
    
    
	return x+y;
}
int main()
{
    
    
	printf("%d",add(1,1)); // 2
	printf("%d",ADD(1,1));// 2
}

結果は同じですが、マクロの方が効率的ですが、なぜでしょうか?
ここに画像の説明を挿入

ポインタ

展開:記憶(簡単な理解)
ここに画像の説明を挿入

上で述べたように、変数の作成はメモリ内のスペースを申請することです。では、メモリ内で変数をどのように見つけたいでしょうか?

それは、メモリを1バイトの領域に分割し、家の番地のように番号を付けることです。

ポインタを作成して使用するにはどうすればよいですか?

//类型 * 变量名
int a =10;
int *pa = &a;// pa此时存的就是a的地址

printf("%d",*pa);//用解引用操作符则可以找到a的值

では、ポインタのサイズはどれくらいでしょうか?

printf("%d",sizeof(int *));
printf("%d",sizeof(char *));
printf("%d",sizeof(short *));
//结果都是4

結果がすべて 4 バイトになるのはなぜですか?

これはコンピュータの桁数に関係します。32 ビット コンピュータの場合、コンピュータには 32 のアドレスがあります。各アドレス ラインの電源がオンになると、結果は 0/1 になります。32 ビットが使用されている場合は、アドレスを表すにはちょうど 4 ワード、セクションの対応する 64 ビットは 8 バイトです

おすすめ

転載: blog.csdn.net/Legwhite/article/details/131623087