2. 基本的なデータ型と変数

1.データの種類

今回は主に基本的なデータ型とブール型を理解します。
ここに画像の説明を挿入します

注: [ ] は省略できることを意味します
1.1 文字
char
[signed] char
unsigned char

1.2 Integer
short 整数型
short [int]
[signed] short [int]
unsigned short [int]

整型
int
[signed] int
unsigned int

⻓整型
long [int]
[signed] long [int]
unsigned long [int]

より長い整数型 (C99 で導入)
long long [int]
[signed] long long [int]
unsigned long long [int]

1.3 浮動小数点型
float 単精度浮動小数点型
double 倍精度浮動小数点型
long double

1.4. ブール型 (C99 以降導入)
1. ブール型は _Bool で表されます
2. ブール型を使用するにはヘッダー ファイル <stdbool.h> を参照する必要があります
3. ブール型変数の値は true または false

//布尔类型
#include <stdio.h>
#include <stdbool.h>
int main() {
    
    
	_Bool flag = true;
	if (flag) {
    
    
		printf("i'm true");
	}
	else{
    
    
		printf("i'm false");
	}
	return 0;
}

ここに画像の説明を挿入します

2.署名付きと署名なし

C 言語では、符号付きキーワードと符号なしキーワードを使用して文字型と整数型を変更します。
signed キーワードは、型に符号があり、負の値が含まれることを示します。unsigned
キーワードは、型に符号がなく、ゼロと正の整数 (非負) のみを表すことができることを示します。

したがって、上記のデータ型を導入するときに、データ型が非負の整数のみを表す必要がある場合は、unsigned キーワードを使用して変更する必要があります。それ以外の場合は、signed キーワードを使用して変更できますが、ほとんどのデータ型範囲自体に正の整数が含まれます。整数。負の値なので、符号付きは基本的に省略できます。

例:

//定义整型变量a
signed int a;
int a;//signed可以省略

//定义非负整型变量a
unsigned int a;

整数型を例に挙げると、int 変数を符号なしで宣言する利点は何でしょうか?
利点は、同じメモリ長で表現できる最大整数値が 2 倍になることです。
例:
16 ビット signed short int の値の範囲は -32768 ~ 32767、最大値は 32767、
unsigned short int の値の範囲は 0 ~ 65535、最大値は 65535 です。

3. データ型の値の範囲

limits.h ファイルは整数型の値の範囲を記述し、
float.h ファイルは浮動小数点型の値の範囲を記述します。

整数型のストレージ サイズと値の範囲
ここに画像の説明を挿入します

浮動小数点型のストレージ サイズと値の範囲
ここに画像の説明を挿入します

整数型の値の範囲の制限値の
定数SCHAR_MIN および SCHAR_MAX : signed char の最小値と最大値。
SHRT_MIN、SHRT_MAX: shortの最小値と最大値。
INT_MIN、INT_MAX: int の最小値と最大値。
LONG_MIN、LONG_MAX:longの最小値と最大値。
LLONG_MIN、LLONG_MAX:longlongの最小値と最大値。
UCHAR_MAX: unsigned char の最大値。
USHRT_MAX: unsigned short の最大値。
UINT_MAX: unsigned int の最大値。
ULONG_MAX: unsigned long の最大値。
ULLONG_MAX: unsignedlonglong の最大値。

コードデモ

#include <limits.h>
int main() {
    
    
//存储大小
	printf("char的存储大小:%d\n",sizeof(char));
	printf("short的存储大小:%d\n", sizeof(short));
	printf("int的存储大小:%d\n", sizeof(int));
	printf("long的存储大小:%d\n", sizeof(long));

	//short int和long int 就是 short和long 这定义类型可以省略int 
	printf("short int的存储大小:%d\n", sizeof(short int));
	printf("long int的存储大小:%d\n", sizeof(long int));

	printf("long long的存储大小:%d\n", sizeof(long long));
	printf("unsigned char的存储大小:%d\n",sizeof(unsigned char));
	printf("unsigned short的存储大小:%d\n",sizeof(unsigned short));
	printf("unsigned int的存储大小:%d\n",sizeof(unsigned int));
	printf("unsigned long的存储大小:%d\n",sizeof(unsigned long));
	printf("unsigned long long的存储大小:%d\n",sizeof(unsigned long long));

	printf("float的存储大小:%d\n", sizeof(float));
	printf("double的存储大小:%d\n", sizeof(double));
	printf("long double的存储大小:%d\n", sizeof(long double));//long double字节大小至少8字节,不同编译器得出的结果不同,但肯定大于等于double的8字节

	printf("--------------------------------------------\n");
	
//取值范围
	printf("char的取值范围:%d %d\n", SCHAR_MIN, SCHAR_MAX);
	printf("unsigned char的取值范围:%d\n", UCHAR_MAX);	

	printf("short的取值范围:%d %d\n", SHRT_MIN, SHRT_MAX);
	printf("unsigned short的取值范围:%d\n", USHRT_MAX);

	//%d 十进制有符号整数   
	printf("int的取值范围:%d %d\n", INT_MIN, INT_MAX);
	//%u (16位)十进制无符号整数(unsigned int的最大存储范围已经超出了%d所能表示的范围)
	printf("unsigned int的取值范围:%u\n", UINT_MAX);

	//%d=int  %ld=long  %lld=long long(long和long long的取值范围都已经超出了int的范围 所以对应的格式化占位符也要修改 否则会出错

	//%ld [32位]长整型数据类型
	printf("long的取值范围:%ld %ld\n", LONG_MIN, LONG_MAX);
	//%lu [32位]无符号长整型数据类型
	printf("unsigned long的取值范围:%lu\n", ULONG_MAX);

	//%lld 64位长整型数据类型
	printf("long long的取值范围:%lld %lld\n", LLONG_MIN, LLONG_MAX);
	//%llu 64位无符号长整型数据类型
	printf("unsigned long long的取值范围:%llu\n", ULLONG_MAX);

	return 0;
}

ここに画像の説明を挿入します

4.変数

変数とはC言語で変更できる値のことで、変数を作成する際には変数のデータ型を定義する必要があります。

C言語において定数とは変化しない値のことで、例えば上記の整数型の値の範囲を
INT_MIN、int型の最小値と最大値の範囲を表すINT_MAX、この2つが定数です。

変数
の定義は非常に簡単で、データ型 + 変数名です (変数名はキーワードと競合しないようにしてください)。

char a;//字符变量
int b;//整型变量
float c;//浮点型变量

変数を初期化します。
変数の作成時に初期値を指定します。
初期値はデータ型に対応している必要があります。

int a = 1;
char b = '1'
float c = 1.1;

変数を初期化しないでください。
整数変数 (int、short、long など): デフォルト値は 0 です。
浮動小数点変数 (float、double など): デフォルト値は 0.0 です。
文字変数 (char): デフォルト値は '\0' で、これは NULL 文字です。

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

グローバル変数:中括弧の外側で定義された変数はグローバル変数です。グローバル変数は
広範囲に影響を及ぼし、プロジェクト全体に関与し、どこからでも参照できます。

ローカル変数:中括弧内で定義された変数はローカル変数です。
ローカル変数はローカル スコープにのみ影響し、通常は独自の中括弧内で参照できます。

#include <stdbool.h>
//全局变量和局部变量
int global = 1;//全局变量
int main() {
    
    
	int local = 2;//局部变量
	if (true){
    
    
		int local_in = 3;//局部变量
		printf("局部变量:%d\n", local_in)//这里就可以调用local_in局部变量
	}

	printf("全局变量:%d\n", global);
	printf("局部变量:%d\n", local);
	//printf("局部变量:%d\n", local_in); //无法调用局部变量local_in,报错
}

呼び出されるローカル変数が呼び出し点よりも内部の中括弧内に定義されている場合、そのローカル変数は呼び出すことができません 上記の int
local_in = 3 を例にすると、外部印刷により local_in が呼び出される場合、 local_in の定義はそれ自体よりも内部的なものは見つからないため、呼び出しは失敗し、エラーが報告されます。

ローカル変数とグローバル変数の変数名が同じ場合

#include <stdbool.h>
//全局变量和局部变量
int global = 1;//全局变量
int main() {
    
    
	int global = 2;//局部变量
	printf("全局变量:%d\n", global);
}

デバッグ結果
ここに画像の説明を挿入します
理由: 内部ローカル変数がグローバル変数の値を上書きします。(ここでの上書きとは、グローバル変数の int global = 1 を変更することではなく、印刷ステップでグローバル値を上書きすることであり、元々定義されていた値は変更されません)

ローカル変数とグローバル変数がメモリのどこに格納されるか(わかる)
1. ローカル変数はメモリのスタック領域に格納される
2. グローバル変数はメモリのスタティック領域に格納される

6. 算術演算子 (+、-、​​、/、%)

**+ - * / % **これらの算術演算子はすべて二項演算子です。
注: 二項演算子は、演算子に 2 つのオペランドがある、つまり演算子の両端に数値があることを意味します。

//算数运算符
int main() {
    
    
	//加 减 乘(+ - *)
	int a = 1, b = 2, c = 3;
	int add = a + b + c;
	int sub = c - b - a;
	int mul = a * b * c;
	printf("add=%d  sub=%d  mul=%d\n", add, sub, mul);

	return 0;
}

ここに画像の説明を挿入します



足し算、引き算、掛け算は非常に規則的ですが、割り算については個別に説明しましょう。

int main() {
    
    
	// 除(/)
	int a = 1, b = 2, c = 3;
	float bf = 2, cf = 3;

	int div_i = c / b;
	float div_f1 = c / b;
	float div_f2= cf / bf;

	printf("div_i=%d\n", div_i);//1
	printf("div_f1=%f\n", div_f1);//1.000000
	printf("div_f2=%f\n", div_f2);//1.500000

	return 0;
}

ここに画像の説明を挿入します
3 つの異なる結果が表示され、1 つずつ説明します。
ヒント: C 言語の整数除算は、整数部分のみを返し、小数部分を破棄します。

1. printf(“div_i=%d\n”, div_i);//1
式 int div_i = c / b 結果変数 div_i の型は int で、演算子の両端のオペランド c と b は両方とも int 型
プロセスは次のとおりです:
2 つの int 変数 c と b を除算し、結果は 1 になり、それを変数 div_i に代入し、
div_i は int 型であるため div_i=1 として
、プレースホルダー %d を使用して出力および印刷します。

2. printf(“div_f1=%f\n”, div_f1);//1.000000
式 float div_f1 = c / b 結果変数 div_f1 の型は float、演算子の両端のオペランド c と b はともに int 型
プロセスは次のとおりです:
2 つの int 変数 c と b を除算し、結果は 1 になり、それを変数 div_f1 に代入し、
div_f1 は float 型なので div_f1=1.000000 として
、プレースホルダー %f を使用して出力および印刷します。

3. printf(“div_f2=%f\n”, div_f2);//1.500000
式 float div_f1 = cf / bf 結果変数 div_f2 の型は float で、演算子の両端のオペランド c と b は両方とも float 型
注: ここでの変数は浮動小数点型の除算です (少なくとも 1 つの浮動小数点変数が演算に参加する限り、C 言語は浮動小数点の除算を実行します)。浮動小数点数を除算した場合、その除算は整数の除算にはなりません。
プロセスによると、 2 つの float 変数 c と b を除算すると、結果は 1.500000 になります。div_f2 は float 型なので、
それを変数 div_f2 に代入し、 div_f2=1.500000として、プレースホルダー %f を使用して出力および印刷します。



演算子 % は、2 つの整数を除算した余りを返すモジュロ演算を表します。
(この演算子は整数に対してのみ使用でき、浮動小数点数には使用できません)

//取模%
int main() {
    
    
	int b = 2, c = 3;
	int mod = c % b;
	printf("mod=%d", mod);//1
	return 0;
}

モジュロ負数の規則は、結果の符号が最初のオペランドの符号によって決定されるというものです。

int main() {
    
    
	printf("%d\n", 11 % -5); // 1
	printf("%d\n", -11 % -5); // -1
	printf("%d\n", -11 % 5); // -1
	return 0;
}

7. 代入演算子 (=)

変数を作成すると初期値が初期化されますが、変数作成後に値を代入することを代入といいます。

//赋值运算符
int main() {
    
    
	int a = 100;//初始化
	a = 101;//赋值
	return 0;
}



継続的な割り当て

//连续赋值
int main() {
    
    
	int a = 100;//初始化
	int b = 101;//初始化
	int c = 102;//初始化
	a = b = c + 98;//不推荐变量连接成一块,看着费劲
	
	//建议分开写,方便观察读写
	b = c + 98;
	a = b;
	printf("a=%d b=%d c=%d",a,b,c);//从右向左依次赋值的 200 200 102
	
	return 0;
}

右から左に値を割り当てます

ここに画像の説明を挿入します


複合代入演算子

//复合赋值
int main() {
    
    
	int a = 100;
	int b = 100;
	a += 3;//等同于 a = a + 3
	b -= 3;//等同于 b = b - 3

	printf("a=%d\n", a);//103
	printf("b=%d\n", b);//97

	return 0;
}

一般的に使用される複合代入演算子

*= /= %= /= %=
>>= <<= &= |= ^=

8. 単項演算子 (++、-、+ (正)、- (負))

演算子 ++、- -、+ (正)、および - (負) はすべてオペランドを 1 つだけ持つため、単項演算子です。

+(プラス) -(マイナス)
プラスとマイナスの符号についてはあまり紹介しませんが、数学でいうプラスとマイナスの記号です。プラスの
符号(+)は基本的に省略可能です。書いても書かなくても大丈夫です
。これも非常に単純な事実ですが、あまり詳しくは紹介しません。

++ と - -
++ は自身を増加させ、 - - は自身を減少させます。++ の機能は変数を +1 にすること、- - の機能は変数を -1 にすることです。
++ と - - は配置できますオペランドの前または後、後置と後置では、+1 の順序が異なります。

int main() {
    
    
	int a = 1;
	int b = a++;
	printf("b=%d\n", b);//b=1
	printf("a=%d", a);//a=2
	return 0;
}

上の例は、自動インクリメントの後に
int b = a++ が続きます。最初に a=1 を b に代入するため、b=1
、次に自動インクリメント a++ (a = a+1 と同等)、つまり a=2


int main() {
    
    
	int a = 1;
	int b = ++a;
	printf("b=%d\n", b);//b=2
	printf("a=%d", a);//a=2
	return 0;
}

上の例は自動インクリメント接頭辞
int b = ++a です。最初に a++ (a = a+1 と同等) を自動インクリメントするため、a=2
、次に a=2 を b に割り当てます、つまり b=2

セルフデクリメントの接頭辞と接尾辞も同様に取得できるので例は省略します^_^

9. 強制型変換

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

ここに画像の説明を挿入します
警告がポップアップ表示され、一部のコンパイラはエラーを直接報告します。浮動小数点数を整数に変換すると、精度が犠牲になり、データの小数部分が失われます。


この警告を回避するには、強制型変換を使用し、変換する必要がある値または型の前に (type) を追加する必要があります。

//强制类型转换
int main() {
    
    
	int a = (int)3.14;//浮点数前加上  (强制转换的类型)
	printf("a=%d", a);
	return 0;
}

エラーや警告は発生せずに正常に実行されますが、精度は依然として低下します。

おすすめ

転載: blog.csdn.net/qq_45657848/article/details/131846662
おすすめ