保姆级教程:C 语言数据类型与变量零基础解析

目录

一. 开头

二. 数据类型

1.1 基本分类

1.1.1 字符型

1.1.2 整型

1.1.3 浮点数

1.1.4 布尔类型

1.2 数据类型的长度

1.2.1 sizeof操作符

1.2.2 计算数据类型长度

1.2.3 sizeof中表达式不计算

1.3 数据类型的取值范围

三. signed和unsigned

四. 变量

3.1 变量的创建

3.2 变量的分类

3.3 变量的储存

 五. 算数操作符:+、-、*、/、%

4.1 +和-

4.2 *

4.3 /

4.4 %

六. 赋值操作符:=和复合赋值

5.1 连续赋值

5.2 复合赋值符

​七. 单目操作符:++、--、+、-

6.1 ++和--

6.1.1 前置++

6.1.2 后置++

6.2 +(正号)和-(负号)

八. 强制类型转换

九. 结语


一. 开头

如果你是刚踏入编程世界的小白,对 C 语言充满好奇却又不知从何下手;如果你看着 “数据类型”“变量” 这些术语一头雾水,总觉得它们像隔着一层迷雾的 “专业黑话”—— 那么这篇文章就是为你量身打造的。

C 语言作为编程领域的 “常青树”,是很多人入门编程的第一站。但它那些看似抽象的基础概念,往往会成为新手进阶路上的第一道坎。而 “数据类型” 和 “变量”,正是这门语言的基石 —— 就像盖房子前要先搞懂砖、瓦、钢筋的区别,学 C 语言也得先弄明白不同数据如何被存储、被操作。

今天这篇文章,咱们就抛开复杂的理论堆砌,用最直白的语言、最细致的解析,带零基础的你一步步吃透数据类型的分类、变量的创建与使用,还有那些绕不开的操作符。不管你之前有没有接触过编程,跟着节奏走,保证让你看得懂、学得会,轻松迈出 C 语言入门的关键一步。

二. 数据类型

1.1 基本分类

1.1.1 字符型

char //character,默认符号由系统决定
signed char //有符号的,范围-128~127
unsigned char //无符号的,范围0~255

1.1.2 整型

//短整型
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.1.3 浮点数

float
double
long double

1.1.4 布尔类型

bool

从C99中引入,布尔类型的使用得包含头文件<stdbool.h>,布尔类型变量的取值是:true 或者false

代码演示:

bool flag = true;
if (flag)
    printf("I like C\n")

1.2 数据类型的长度

1.2.1 sizeof操作符

sizeof是一个关键字,也是操作符,专门是用来计算sizeof的操作符数的类型长度的,单位是字节。sizeof操作符的操作数可以是类型,也可以是变量或者表达式。

sizeof(类型)
sizeof 表达式

sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。sizeof后面的表达式是不真实参加运算的,根据表达式的类型来得出大小。sizeof的计算结果是size_t类型的,占位符为%zd。

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

1.2.2 计算数据类型长度

#include<stdio.h>

int main()
{
    printf("%zd\n", sizeof(char)); //1
    printf("%zd\n", sizeof(short)); //2
    printf("%zd\n", sizeof(int)); //4
    printf("%zd\n", sizeof(long)); //4
    printf("%zd\n", sizeof(long long)); //8
    printf("%zd\n", sizeof(float)); //4
    printf("%zd\n", sizeof(double)); //8
    printf("%zd\n", sizeof(long double)); //8
    printf("%zd\n", sizeof(bool)); //1
    
    return 0;
}

在VS2022 X64配置下的输出依次为:​1 2 4 4 8 4 8 8 1

1.2.3 sizeof中表达式不计算

//测试sizeof中的表达式不计算

#include<stdio.h>

int main()
{
    short a = 2;
    int b = 10;
    printf("%d\n", sizeof(a = b + 1));
    printf("a = %d\n", a);

    return 0;
}

sizeof 在代码进行编译的时候,就根据表达式的类型确定了,而表达式的执行却要在程序运行期间才能执行,在编译期间已经将sizeof处理掉了,所以在运行期间就不会执行表达式了。

1.3 数据类型的取值范围

每一种数据类型有自己的取值范围,也就是存储的数值的最大值的最小值的区间。

limits.h 文件中说明了整型类型的取值范围。

float.h 文件中说明了浮点数类型的取值范围。

为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使用这些常量。

• SCHAR_MIN , SCHAR_MAX : signed char 的最小值和最大值。

• SCRT_MIN , SHRT_MAX : short 的最大值和最小值。

• INT_MIN , INT_MAX : int 的最大值和最小值。

• LONG_MIN , LONG_MAX : long 的最小值和最大值。​

• LLONG_MIN , LLONG_MAX : long long 的最小值和最大值。​

• UCHAR_MAX : unsigned char 的最大值。​

• UINT_MAX : unsigned int 的最大值。​

• ULONG_MAX : unsigned long 的最大值。​

• ULLONG_MAX : unsigned long long 的最大值。​

三. signed和unsigned

C 语言使用signed和unsigned关键字修饰字符型和整型类型的。​

signed关键字,表示一个类型带有正负号,包含负值;

unsigned关键字,表示该类型不带有正负号,只能表示零和正整数。

对于int类型,默认是带有正负号的,也就是说int等同于signed int 。

整数变量声明为 unsigned的好处是,同样从长度的内存能够表示的最大整数值,增大了一倍。

注意,C 语言规定char 类型默认是否带有正负号,由当前系统决定。这就是说,char 不等同于signed char ,它有可能是signed char ,也有可能是 unsigned char 。

四. 变量

3.1 变量的创建

了解清楚了类型,我们使用类型做什么呢?类型是用来创建变量的。什么是变量呢?C语言中把经常变化的值称为变量,不变的值称为常量。​

变量创建的语法形式是这样的:

data_type name;
    |       |
    |       |
数据类型   变量名

int age; //整型变量
char ch;l //字符变量
double weight; //浮点数变量

变量在创建的时候就给一个初始值,就叫初始化

int age = 18;
char name = 'L';
double height = 175.0;
unsigned int weight = 125;

3.2 变量的分类

全局变量:在大括号外部定义的变量就是全局变量。全局变量的使用范围更广,整个工程中想使用,都是有办法使用的。

局部变量:在大括号内部定义的变量就是局部变量。局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。

#include <stdio.h>

int global = 2025; //全局变量​

int main()
{
    int local = 8; //局部变量
    printf("%d\n", local);
    printf("%d\n", global);

    return 0;
}

其实当局部变量和全局变量同名的时候,局部变量优先使用。

#include<stdio.h>

int n = 100;
int main()
{
    int n = 10;
    printf("%d\n", n); //优先使用局部变量
    
    return 0;
}

3.3 变量的储存

内存中的三个区域栈区、堆区、静态区

1.局部变量是放在内存的栈区;

2.全局变量是放在内存的静态区;

3.堆区是用来动态内存管理的(本文章不介绍)

 五. 算数操作符:+、-、*、/、%

C语言中为了方便运算,提供了一系列操作符,其中有一组操作符叫:算术操作符。分别是:+  -  *  /  % ,这些操作符都是双目操作符

注:操作符也叫做运算符,是不同的翻译,意思是一样的。

4.1 +和-

+ 和- 都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双目操作符

#include<stdio.h>

int main()
{
    int x = 2 + 3;
    int y = 5 + 6;
    printf("%d\n", x);
    printf("%d\n", y);

    return 0;
}


4.2 *

#include<stdio.h>

int main()
{
     int a = 5;
    printf("%d\n", a * a);

    return 0;
}

4.3 /

除号的两端如果是整数,执行的是整数除法,得到的结果也是整数。

#include<stdio.h>

int main()
{
    int x = 6 / 4;
    float y = 6 / 4;
    printf("%d\n", x); //输出 1
    printf("%f\n", y); //输出 1.000000

    return 0;
}

上面示例中,尽管变量x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0,而不是 1.5 。原因就在于C语言里面的整数除法是整除,只会返回整数部分,丢弃小数部分。

要得到浮点数的结果,两个操作数必须至少有一个浮点数,这是C语言就会进行浮点数除法

#include<stdio.h>

int main()
{
    float x = 6.0 / 4;
    float y = 6 / 4.0;
    printf("%f %f\n", x, y);

    return 0;
}

上面示例中,表示进行浮点数除法,得到的结果就是1.5 。

#include<stdio.h>

int main()
{
    int a = 5;
    int b = 0;
    b = (a / 20) * 100;
    printf("%d\n", b); //输出 0

    return 0;
}

上面的代码,你可能觉得经过运算,b 会等于 25,但是实际上 b 等于 0,这是因为 a / 20 是整除,会得到一个整数值 0 ,所以乘以 100 后得到的也是 0 。

将除数 20 改为 20.0,让整数除法变成浮点数除法

#include<stdio.h>

int main()
{
    int a = 5;
    int b = 0;
    b = (a / 20.0) * 100;
    printf("%d\n", b);

    return 0;
}

4.4 %

运算符 % 表示求模(余)运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。

#include<stdio.h>

int main()
{
    int a = 6 % 4; //输出 2
    printf("%d", a);

    return 0;
}

负数求模的规则是,结果的正负号由第一个运算数的正负号决定。

#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 = 10; //初始化
a = 20; //赋值,这里是赋值操作符

赋值操作符 = 是一个随时可以给变量赋值的操作符。

5.1 连续赋值

赋值操作符也可以连续赋值

int a = 1;
int b = 2;
int c = 3;
c = b = a + 1; //连续赋值,从右向左依次赋值

C语言虽然支持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样方便观察代码的执行细节。

int a = 1;
int b = 2;
int c = 3;
b = a + 1;
c = b;

5.2 复合赋值符

在写代码时,我们经常可能对一个数进行自增、自减的操作,如下代码:

int a = 10;
a = a + 3;
a = a -2 ;

这样代码C语言给提供了更加方便的写法:

int a = 10;
a += 3;
a -= 2;

C语言中提供了复合赋值符,方便我们编写代码,这些赋值符有:

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

​七. 单目操作符:++、--、+、-

前面介绍的操作符都是双目操作符,有2个操作数的。C语言中还有一些操作符只有一个操作数,被称为单目操作符。++,--,+(正),-(负) 就是单目操作符的。

6.1 ++和--

++ 是一种自增的操作符,又分为前置 ++ 和后置 ++,-- 是一种自减的操作符,也分为前置 -- 和后置 -- 。

6.1.1 前置++

int a = 10;
int b = ++a; //++的操作数是a,是放在a前面的,就是前置++
printf("a=%d b=%d\n", a, b);

计算口诀:先+1,后使用;

a原来是10,先+1,后a变成了11,再使用就是赋值给b,b得到的也是11,所以计算技术后,a和b都是11,相当于这样的代码:

int a = 10;
int b = 0;
a = a + 1;
b = a;
printf("a=%d b=%d\n", a, b);

6.1.2 后置++

int a = 10;
int b = a++; //++的操作数是a,是放在a的后面的,就是后置++​
printf("a=%d b=%d\n",a , b);

计算口诀:先使用,后+1​

a原来是10,先使用,就是先赋值给b,b得到了10,然后再+1,然后a变成了11,所以直接结束后a是11,b是10,相当于这样的代码:

int a = 10;
int b = a;
a = a + 1;
printf("a=%d b=%d\n",a , b);

前置 -- 和后置 -- 同理。

6.2 +(正号)和-(负号)

这里的 + 是正号,- 是负号,都是单目操作符

运算符 + 对正负值没有影响,是一个完全可以省略的运算符,但是写了也不会报错。

int a = +10; /*等价于*/ int a = 10; 

运算符 - 用来改变一个值的正负号,负数的前面加上 - 就会得到正数,正数的前面加上 - 会得到负 数。

int a = 10;
int b = -a;
int c = -10;
printf("b=%d c=%d\n", b, c);//这里的b和c都是-10​
int a = -10;
int b = -a;
printf("b=%d\n", b); //这里的b是10​

八. 强制类型转换

在操作符中还有一种特殊的操作符是强制类型转换,语法形式很简单,形式如下:

int a = 3.14;
//a的是int类型,3.14是double类型,两边的类型不一致,编译器会报警告​

为了消除这个警告,我们可以使用强制类型转换:

int a = (int)3.14;
//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分

俗话说,强扭的瓜不甜,我们使用强制类型转换都是万不得已的时候使用,如果不需要强制类型转化就能实现代码,这样自然更好的。

九. 结语

通过这一篇的内容,我们系统梳理了 C 语言中数据类型、变量以及各类操作符的核心知识。数据类型是 C 语言处理数据的基础,不同的类型对应着不同的存储范围和用途,像字符型、整型、浮点型等,都在各自的场景中发挥着重要作用;signed 和 unsigned 的区分则让我们能更灵活地处理正负值问题。变量作为数据的载体,其创建、初始化以及全局变量与局部变量的特性,帮助我们更好地管理程序中的数据。而算术操作符、赋值操作符、单目操作符等,为数据的运算和处理提供了丰富的手段,强制类型转换则在特殊情况下让数据类型的转换有据可依。

这些基础知识就像建造大厦的一块块砖瓦,看似简单,却承载着构建复杂程序的重任。或许刚开始接触时,你会对各种类型的取值范围、操作符的优先级感到些许困惑,但请相信,每一次练习都是一次进步,每一次调试都是一次成长。

编程的路上没有捷径,但每一步都算数。不要怕犯错,因为错误恰恰是发现问题、理解本质的好机会;也不要急于求成,静下心来逐个攻克知识点,你会发现自己正在不知不觉中变得强大。

C 语言的世界广阔而深邃,这只是你探索旅程的一小步。带着今天学到的知识去实践吧,用代码写出第一个小程序,感受从 0 到 1 的成就感。未来还有更多精彩的语法和技巧等待你去解锁,只要保持好奇心和钻研精神,你一定能在编程的道路上越走越远,创造出属于自己的精彩!继续加油,勇敢地往前冲吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值