目录
⽬录
1. 数据类型介绍
1.1 字符型
char //character
[signed] char //有符号的
unsigned char //无符号的
[ ]中可以省略不写,下同。
1.2 整型
//短整型
shrot [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 中也引⼊了 布尔类型 ,是专⻔表⽰真假的。
_Bool
#define bool _Bool
#define false 0
#define true 1
代码演示:
_Bool flag = true;
if (flag)
printf("i like C\n");
1.5 各种数据类型的⻓度
1.5.1 sizeof操作符
sizeof( 类型 )
sizeof 表达式
1.5.2 数据类型⻓度
在VS2022 X64配置下的输出:
补充:


1.5.3 sizeof中表达式不计算
- 注意:
- 第一个数是2,是因为虽然 b 与 1 都是 int类型 占4个字节,但是 s 是 short 类型 占 2 个字节,所以输出是2.
- 第二个是 s=2,是因为初始赋值是2.
2. signed 和 unsigned
- C 语⾔使⽤ signed 和 unsigned 关键字修饰字符型和整型类型的。
- signed 关键字,表⽰⼀个类型带有正负号,包含负值;
- unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。
- 对于 int 类型,默认是带有正负号的,也就是说 int 等同于 signed int 。
- 由于这是默认情况,关键字 signed ⼀般都省略不写,但是写了也不算错。
signed int a;
// 等同于int a;
int 类型也可以不带正负号,只表示非负整数。这时就必须使⽤关键字 unsigned 声明变量。
unsigned int a;
- 区别:

- 说明:有符号的最高位留给符号位,放 1 表示是负数,放 0 表示是正数。
- 整数变量声明为 unsigned 的好处是,同样⻓度的内存能够表⽰的最⼤整数值,增⼤了⼀倍。
- 比如,16位的 signed short int 的取值范围是:-32768~32767,最⼤是32767;⽽ unsigned short int 的取值范围是:0~65535,最⼤值增⼤到了65,535。
- 32位的 signed int 的取值范围可以参看 limits.h 中给出的定义。
#define SHRT_MIN (-32768) //有符号16位整型的最⼩值 #define SHRT_MAX 32767 //有符号16位整型的最⼤值 #define USHRT_MAX 0xffff //⽆符号16位整型的最⼤值 #define INT_MIN (-2147483647 - 1) //有符号整型的最⼩值 #define INT_MAX 2147483647 //有符号整型的最⼤值unsigned int ⾥⾯的 int 可以省略,所以上⾯的变量声明也可以写成下⾯这样。unsigned a;字符类型 char 也可以设置 signed 和 unsigned 。signed char c; // 范围为 -128 到 127 unsigned char c; // 范围为 0 到 255- 注意
- C 语⾔规定 char 类型默认是否带有正负号,由当前系统决定。
- 这就是说, char 不等同于 signed char ,它有可能是 signed char ,也有可能是 unsigned char 。
- 这⼀点与 int 不同, int 就是等同于 signed int 。
3. 数据类型的取值范围
- • 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 :long long 的最⼩值和最⼤值。
- • UCHAR_MAX :unsigned char 的最⼤值。
- • USHRT_MAX :unsigned short 的最⼤值。
- • UINT_MAX :unsigned int 的最⼤值。
- • ULONG_MAX :unsigned long 的最⼤值。
- • ULLONG_MAX :unsigned long long 的最⼤值。
4. 变量
4.1 变量的创建
data_type name;
| |
| |
数据类型 变量名
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
int age = 18;
char ch = 'w';
double weight = 48.0;
unsigned int height = 100;
4.2 变量的分类
- • 全局变量:在⼤括号外部定义的变量就是全局变量 ,全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。
- • 局部变量:在⼤括号内部定义的变量就是局部变量 ,局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。
1 #include <stdio.h> 2 3 int global = 2023;//全局变量 4 5 int main() 6 { 7 int local = 2018;//局部变量 8 printf("%d\n", local); 9 printf("%d\n", global); 10 return 0; 11 }如果局部和全局变量,名字相同呢?
- 局部变量是放在内存的栈区
- 全局变量是放在内存的静态区
- 堆区是⽤来动态内存管理的 (后期会介绍)
-
其实内存区域的划分会更加细致,以后在操作系 统的相关知识的时候会介绍。

5. 算术操作符:+、-、*、/、%
5.1 + 和 -
- + 和 - ⽤来完成加法和减法。
- + 和 - 都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双⽬操作符。
#include <stdio.h>
int main()
{
int x = 4 + 22;
int y = 61 - 23;
printf("%d\n", x);
printf("%d\n", y);
return 0;
}
5.2 *
#include <stdio.h>
int main()
{
int num = 5;
printf("%d\n", num * num); // 输出 25
return 0;
}
5.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;
}
#include <stdio.h>
int main()
{
float x = 6.0 / 4; // 或者写成 6 / 4.0
printf("%f\n", x); // 输出 1.500000
return 0;
}
5.4 %
#include <stdio.h>
int main()
{
int x = 6 % 4; // 6除以4等于1余2,输出结果为2
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;
}
6. 赋值操作符:= 和复合赋值
6.1 连续赋值
赋值操作符也可以连续赋值,如:
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的。
int a = 3;
int b = 5;
int c = 0;
b = a+3;
c = b;
6.2 复合赋值符
在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:
int a = 10;
a += 3;//相当于a=a+3
a -= 2;//相当于b=b-2
C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:
+= -=
*= /= %=
//下⾯的操作符后期讲解
>>= <<=
&= |= ^=
7. 单⽬操作符:++、--、+、-
7.1 ++和--
7.1.1 前置++
int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);
int a = 10;
a = a+1;
b = a;
printf("a=%d b=%d\n",a , b);
7.1.2 后置++
int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);
int a = 10;
int b = a;
a = a+1;
printf("a=%d b=%d\n",a , b);
7.1.3 前置--
int a = 10;
int b = --a;//--的操作数是a,是放在a的前⾯的,就是前置--
printf("a=%d b=%d\n",a , b);//输出的结果是:9 9
7.1.4 后置--
同理后置--类似于后置++,只是把加 1 换成了减 1
int a = 10;
int b = a--;//--的操作数是a,是放在a的后⾯的,就是后置--
printf("a=%d b=%d\n",a , b);//输出的结果是:9 10
7.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
8. 强制类型转换
(类型)
int a = 3.14;
//a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分
9. scanf和printf介绍
9.1 printf
9.1.1 基本⽤法
- printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
- printf() 不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换⾏。
- 为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n 。
- printf() 是在标准库的头⽂件 stdio.h 定义的。使⽤这个函数之前,必须在源码⽂件头部引⼊这 个头⽂件。
9.1.2 占位符
#include <stdio.h>
int main()
{
printf("%s says it is %d o'clock\n", "lisi", 21);
return 0;
}
9.1.3 占位符列举
printf() 的占位符有许多种类,与 C 语⾔的数据类型相对应。下⾯按照字⺟顺序,列出常⽤的占位 符,⽅便查找,具体含义在后续介绍。
- • %a :⼗六进制浮点数,字⺟输出为⼩写。
- • %A :⼗六进制浮点数,字⺟输出为⼤写。
- • %c :字符。
- • %d :⼗进制整数。
- • %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
- • %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
- • %i :整数,基本等同于 %d 。
- • %f :⼩数(包含 float 类型和 double 类型)。
- • %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e为⼩写。
- • %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
- • %hd :⼗进制 short int 类型。
- • %ho :⼋进制 short int 类型。
- • %hx :⼗六进制 short int 类型。
- • %hu :unsigned short int 类型。
- • %ld :⼗进制 long int 类型。
- • %lo :⼋进制 long int 类型。
- • %lx :⼗六进制 long int 类型。
- • %lu :unsigned long int 类型。
- • %lld :⼗进制 long long int 类型。
- • %llo :⼋进制 long long int 类型。
- • %llx :⼗六进制 long long int 类型。
- • %llu :unsigned long long int 类型。
- • %Le :科学计数法表⽰的 long double 类型浮点数。
- • %Lf :long double 类型浮点数。
- • %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
- • %o :⼋进制整数。
- • %p :指针。
- • %s :字符串。
- • %u :⽆符号整数(unsigned int)。
- • %x :⼗六进制整数。
- • %zd : size_t 类型。
- • %% :输出⼀个百分号。
9.1.4 输出格式
printf() 可以定制占位符的输出格式。
9.1.4.1 限定宽度
printf() 允许限定占位符的最小宽度。
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
#include <stdio.h>
int main()
{
printf("%-5d\n", 123); // 输出为 "123 "
return 0;
}
// 输出结果为 " 123.450000"
#include <stdio.h>
int main()
{
printf("%12f\n", 123.45);
return 0;
}
9.1.4.2 总是显示正负号
#include <stdio.h>
int main()
{
printf("%+d\n", 12); // 输出 +12
printf("%+d\n", -12); // 输出 -12
return 0;
}
9.1.4.3 限定小数位数
// 输出结果为: Number is 0.50
#include <stdio.h>
int main()
{
printf("Number is %.2f\n", 0.5);
return 0;
}
// 输出为 " 0.50"
#include <stdio.h>
int main()
{
printf("%6.2f\n", 0.5);
return 0;
}
#include <stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}
// 等同于printf("%6.2f\n", 0.5);
9.1.4.4 输出部分字符串
// 输出 hello
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello everyone");
return 0;
}
9.2 scanf
注:标准输⼊⼀般指的就是键盘,标准输出⼀般指的就是屏幕
9.2.1 基本⽤法
scanf("%d", &i);
3
4
3.14
4.15
9.2.2 scanf的返回值
scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或 者遇到读取到⽂件结尾,则返回常量 EOF。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int r = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("r = %d\n", r);
return 0;
}

9.2.3 占位符
- • %c :字符。
- • %d :整数。
- • %f : float 类型浮点数。
- • %lf : double 类型浮点数。
- • %Lf : long double 类型浮点数。
- • %s :字符串。
- • %[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会 停⽌。
- 上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符,总是返 回当前第⼀个字符,⽆论该字符是否为空格。
- 如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表⽰跳过零个或多个空⽩字符。
- 下⾯要特别说⼀下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。
- 因为 %s 不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个 %s ⼀起使⽤。这也意味着, scanf() 不适合读取可能包含空格的字符串,⽐如书名或歌曲名。另外, scanf() 遇到 %s 占位 符,会在字符串变量末尾存储⼀个空字符 \0 。
- scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ %s 占位符时,应该指定 读⼊字符串的最⻓⻓度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后⾯的字符将被丢弃。
#include <stdio.h>
int main()
{
char name[11];
scanf("%10s", name);
return 0;
}
9.2.4 赋值忽略符
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return 0;
}
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
return 0;
}
10.易错题
1. 全局作用域中的num和main中的num可以同时存在,不会冲突,因为不是同一个作用域
2. 在main函数中访问num时,采用就近原则,因此访问的是main中的num,相当于将全局作用域中的num屏蔽了
A:错误:因为两个num不在同一个作用域中,可以通过编译
B:正确,main中访问的是main中的num,而main函数中的num是1,因此打印1
C:错误,应该访问main函数中的num,而不是全局作用域中的num
D:错误,凑选择的
好了,今天的文章就到这了。能看到这说明你与其他人已经不一样了。
感谢您的观看,别忘了三连哦,我们下次再见。
本文围绕C语言展开,介绍了数据类型,包括字符型、整型、浮点型等,以及其长度、取值范围,还讲解了signed和unsigned关键字的使用。同时阐述了变量的创建与分类,介绍了算术、赋值、单目操作符,强制类型转换,以及scanf和printf函数的用法,最后给出了易错题。


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



