目录
一. 开头
如果你是刚踏入编程世界的小白,对 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 的成就感。未来还有更多精彩的语法和技巧等待你去解锁,只要保持好奇心和钻研精神,你一定能在编程的道路上越走越远,创造出属于自己的精彩!继续加油,勇敢地往前冲吧!
9820

被折叠的 条评论
为什么被折叠?



