一、数据类型的介绍
使⽤整型类型来描述整数,使⽤字符类型来描述字符,使⽤浮点型类型来描述⼩数。
所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作 数据。
下⾯盘点⼀下C语⾔提供的各种数据类型,本章节主要探讨内置数据类型。

1、字符型
在C语言中使用char表示字符型类型
char //character
[signed] char //有符号的
unsigned char //⽆符号的2、整型
在C语⾔中使⽤ int 表⽰整型类型
//整数 - integer
//短整型
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]3、浮点型
在C语言中,常用float表示浮点型,这也是位数最少的浮点型表示方式
float
double
long double4、布尔类型
C语⾔原来并没有为布尔值单独设置⼀个类型,⽽是使⽤整数 在 C99 中也引⼊了 布尔类型,是专⻔表⽰真假的。 0 表⽰假,⾮零值表⽰真。(一般我们常用1来表示真)
布尔类型的使⽤得包含头⽂件#include<stdio.h>
布尔类型变量的取值是: true(真) 或者 false(假)
#define bool _Bool
#define false 0
#define true 15、各种数据类型的长度
每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不 同,存储的数据范围就有所差异。
5.1sizeof操作符
sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算 sizeof 的操作符数的类型⻓度的,单位是 字节。
sizeof 操作符的操作数可以是类型,也可是变量或者表达式。
sizeof( 类型)
sizeof 表达式sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。
sizeof 的计算结果是 size_t 类型的。
#注:sizeof 运算符的返回值,C语⾔只规定是⽆符号整数,并没有规定具体的类型,⽽是留给系统⾃⼰去决定, sizeof 到底返回什么类型。不同的系统中,返回值的类型有可能是 unsigned int ,也有可能是unsigned long ,甚⾄是unsigned long long ,对应的 printf() 占位符分别是%u 、 %lu 和%llu 。这样不利于程序的可移植性。 C语⾔提供了⼀个解决⽅法,创造了⼀个类型别名size_t ⽤来统⼀表⽰ 的返 sizeof 的返回值类型。对应当前系统的 sizeof 的返回值类型,可能是 unsigned int ,也可能是 unsigned long long 。
例如:
#include <stdio.h>
int main()
{
int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(3 + 3.5));
return 0;
}5.2字符类型的长度
#include <stdio.h>
int main()
{
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));//在vs上是8个字节,在gcc上测试是16
return 0;
}在VS2022X64配置下的输出如下:
1
1
2
4
4
8
4
8
8
参考资料:数据类型⻓度和取值范围-官⽅介绍
5.3sizeof 中表达式不计算
//测试:sizeof中表达式不计算
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b+1));
printf("s = %d\n", s);
return 0;
}sizeof 在代码进⾏编译的时候,就根据表达式的结果的类型,推到并确定了类型的⻓度,⽽表达式 真要被执⾏,却要在程序运⾏期间才会发⽣,如果在编译期间已经将 sizeof 处理掉了,所以在运⾏ 期间就不会执⾏表达式了。
二、signed 和unsigned
C语⾔使⽤ signed 和 unsigned 关键字修饰字符型和整型类型的。
signed 关键字,表⽰⼀个类型带有正负号,包含负值; unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。
对于 int 类型,默认是带有正负号的,也就是说 ,关键字 int 等同于 signed int 。
由于这是默认情况 signed ⼀般都省略不写,但是写了也不算错。
signed int a;
// 等同于int a; int 类型也可以不带正负号,只表⽰⾮负整数。这时就必须使⽤关键字 unsigned 声明变量。
unsigned int a;整数变量声明为 unsigned 的好处是,同样⻓度的内存能够表⽰的最⼤整数值,增⼤了⼀倍。
三、变量
1、变量的创建
C语⾔中把经常变化的值称为变量,不变的值称为常量。
变量创建的语法形式是这样的:
data_type name;
| |
| |
数据类型 变量名变量命名的⼀般规则:
(1)只能由字⺟(包括⼤写和⼩写)、数字和下划线(`_`)组成。
(2)不能以数字开头。
(3)⻓度不能超过63个字符。
(4)变量名中区分⼤⼩写的。
(5)变量名不能使⽤关键字。
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量变量在创建的时候就给⼀个初始值,就叫初始化。
int age = 18;
char ch = 'w';
double weight = 48.0;
unsigned int height = 100;2.变量的分类
(1)全局变量:在⼤括号外部定义的变量就是全局变量
全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。
(2)局部变量:在⼤括号内部定义的变量就是局部变量
局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。
#include <stdio.h>
int global = 2023;//全局变量
int main()
{
int local = 2018;//局部变量
printf("%d\n", local);
printf("%d\n", global);
return 0;
}#注:其实当局部变量和全局变量同名的时候,局部变量优先使⽤。
四、算术操作符:+、-、*、/、%
在写代码时候,⼀定会涉及到计算。
C语⾔中为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。分别是:+ - * / % ,这些操作符都是双⽬操作符。
1.+和-
#include <stdio.h>
int main()
{
int x = 4 + 22;
int y = 61 - 23;
printf("%d\n", x);
printf("%d\n", y);
return 0;
}2.*
#include <stdio.h>
int main()
{
int num = 5;
printf("%d\n", num * num); // 输出25
return 0;
}3./
除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。
#include <stdio.h>
int main()
{
float x = 6 / 4;
int y = 6 / 4;
printf("%f\n", x); // 输出 1.000000
printf("%d\n", y); // 输出 1
return 0;
}上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是 1.5 。原因就在于C语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。
如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时C语⾔就会进⾏浮点数除法。
#include <stdio.h>
int main()
{
float x = 6.0 / 4; // 或者写成6 / 4.0
printf("%f\n", x); // 输出 1.500000
return 0;
}#注:
#include <stdio.h>
int main()
{
int score = 5;
score = (score / 20) * 100;//结果是0
score = (score / 20.0) * 100;//结果是浮点数的计算结果,25.0
return 0;
}5.%
运算符 % 表⽰求模(余)运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点 数。
#include <stdio.h>
int main()
{
printf("%d\n", 11 % -5); // 1
printf("%d\n",-11 % -5); // -1
printf("%d\n",-11 % 5); // -1
return 0;
}%运算结果的正负与第一个运算数的正负相同。
五、赋值操作符:=和复合赋值
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。
int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符这里是将右边的值赋值给左边
1.连续赋值
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的。虽然可以进行连续赋值,但是代码不容易理解,建议分开来写,方便观察!
2.复合赋值符
在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作(其他* / %同理),如下代码:
int a = 10;
//加
a = a+3;
a+=3;
//减
a = a-2;
a-=2;C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:
+= *= -=
/= %=
//下⾯的操作符后期讲解
>>= &=
<<= |= ^=六、单目操作符::++、--、+、-
1.++和--
++是⼀种⾃增的操作符,⼜分为前置++和后置++
--是⼀种⾃减的操作符,也分为前置--和后置--
无论前置还是后置,都会改变操作数,将操作数和1进行运算
以下是++的使用说明(--同理 )
int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
//前置++先+再使用
printf("a=%d b=%d\n",a , b); int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
//后置++是先使用,再+
printf("a=%d b=%d\n",a , b);2.+和-
这⾥的+是正号,-是负号,都是单⽬操作符。
运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。
运算符 - 则是改变操作数原本的正负关系。
七、强制类型转换
在操作符中还有⼀种特殊的操作符是强制类型转换,在我们将一个不合适的数强制赋值时,系统可能会报错,这里就需要我们进行强制类型转换:
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分我们使⽤强制类型转换都是万不得已的时候使⽤,如果不需要强制类型转化 就能实现代码,这样⾃然更好的。