1. 数据类型介绍
C语⾔提供了丰富的数据类型来描述⽣活中的各种数据。
使⽤整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。
![](https://img-blog.csdnimg.cn/direct/e60c885229de4bd5b465f29b14cea4c6.png)
1.1 字符型
char //character
1.2 整型
//短整型
short [int]
//整型
int
//⻓整型
long
//更⻓的整型
long long
1.3 浮点型
float//单精度浮点型
double//双精度浮点型
long double
1.4 布尔类型
C 语⾔原来并没有为布尔值单独设置⼀个类型,而是使用整数
0 表示
假,⾮零值表示真。
在
C99
中也引⼊了 布尔类型 ,是专门表⽰真假的。
_Bool
c语言中:0表示假,非0表示真
布尔类型的使用得包含头⽂件
<stdbool.h>
布尔类型变量的取值是:
true
或者
false
1.5 各种数据类型的长度
每⼀种数据类型都有自己的长度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量长度的不同,存储的数据范围就有所差异。
1.5.1 sizeof 操作符
sizeof
是⼀个关键字,也是操作符,专门是用来计算sizeof的操作符数的类型长度的,单位是字
节。
sizeof
操作符的操作数可以是类型,也可是变量或者表达式。
sizeof( 类型 )
sizeof 表达式
eg:
![](https://img-blog.csdnimg.cn/direct/24b0847857ad4d5b84cf5a4fa4a75959.png)
2. signed 和 unsigned
C 语⾔使⽤
signed
和
unsigned
关键字修饰 字符型和整型类型的。
signed
关键字,表示⼀个类型带有正负号,包含负值;
unsigned 关键字,表示该类型不带有正负号,只能表示零和正整数。
对于
int
类型,默认是带有正负号的,也就是说
int
等同于
signed int
。
由于这是默认情况,关键字
signed
⼀般都省略不写,但是写了也不算错
注意,C 语⾔规定 char 类型默认是否带有正负号,由当前系统决定。
这就是说, char 不等同于 signed char ,它有可能是 signed char ,也有可能是
unsigned char 。
这⼀点与 int 不同, int 就是等同于 signed int 。
3. 变量
3.1 变量的创建
C语⾔中把经常变化的值称为变量,不变的值称为常量。 变量创建的语法形式是这样的:
data_type name;
| |
| |
数据类型 变量名
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
变量在创建的时候就给⼀个初始值,就叫初始化。
int age = 18;
char ch = 'w';
double weight = 48.0;
unsigned int height =100;
3.2 变量的分类
1.全局变量:在⼤括号外部定义的变量就是全局变量
全局变量的使用范围更⼴,整个⼯程中想使用,都是有办法使用的。
2.
局部变量:在⼤括号内部定义的变量就是局部变量
局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。
当局部变量和全局变量同名的时候,局部变量优先使⽤。
4. 算术操作符:+、-、*、/、%
C语⾔中为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。分别是:
+ - *
/ %
,这些操作符都是双⽬操作符。
注:
操作符也被叫做:运算符,是不同的翻译,意思是⼀样的。
4.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;
}
4.2 * 运算符用来完成乘法。
#include <stdio.h>
int main()
{
int num = 5;
printf("%d\n", num * num); // 输出 25
return 0;
}
4.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;
}
4.4 % 运算符表示求模(余)运算
即返回两个整数相除的余值。这个运算符只能⽤于整数,不能用于浮点数。
#include <stdio.h>
int main()
{
int x = 6 % 4; // 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;
}
5. 赋值操作符:= 和复合赋值
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。
int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符
5.1 连续赋值
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的。
5.2 复合赋值符
在写代码时,我们经常可能对⼀个数进行自增、自减的操作,如下代码:
int a = 10;
a = a+3;
a = a-2;
C语⾔给提供了更加⽅便的写法:
int a = 10;
a += 3;
a -= 2;
C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:
+= -=
*= /= %=
6. 单目操作符:++、--、+、-
6.1 ++和--
++是⼀种⾃增的操作符,⼜分为前置++和后置++,--是⼀种⾃减的操作符,也分为前置--和后置--.
6.1.1前置++
int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);
计算口诀:先+1,后使用;
6.1.2 后置++
int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);
计算口诀:先使用,后+1;
6.1.3 前置--
同++ 计算口诀:先-1,后使用
6.1.4 后置--
同++ 计算口诀:先使用,后-1
7. scanf 和 printf 介绍
7.1 printf
7.1.1 基本⽤法
printf()
的作⽤是将参数⽂本输出到屏幕。它名字里面的
f
代表
format
(格式化),表示可以
定制输出文本的格式。
#include <stdio.h>
int main(void)
{
printf("Hello World");
return 0;
}
上面命令会在屏幕上输出一行文字“Hello World”。
printf() 不会在行尾自动添加换行符,运⾏结束后,光标就停留在输出结束的地⽅,不会自动换 行。为了让光标移到下⼀行的开头,可以在输出⽂本的结尾,添加⼀个换行符 \n 。
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
return 0;
}
7.1.2 占位符
• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。
• %d :⼗进制整数。// int
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。//float %f double - %lf
• %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 类型。
• %% :输出⼀个百分号。
7.1.4 输出格式
7.1.4.1 限定宽度
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
%5d 表示
这个占位符的宽度至少为5位。如果不满5位,对应的值的前⾯会添加空格。
输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对齐,在输出内容后⾯添加空
格,可以在占位符的
%
的后⾯插⼊⼀个
-
号。
#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;
}
上面示例中,
%12f 表示
输出的浮点数最少要占据12位。由于小数的默认显示精度是小点后6位,
所以
123.45
输出结果的头部会添加2个空格。
7.1.4.2 总是显示正负号
默认情况下,
printf()
不对正数显示
+ 号,只对负数显示- 号。如果想让正数也输出
+
号,可
以在占位符的
%
后⾯加⼀个
+
。
#include <stdio.h>
int main()
{
printf("%+d\n", 12); // 输出 +12
printf("%+d\n", -12); // 输出 -12
return 0;
}
7.1.4.3 限定小数位数
输出⼩数时,有时希望限定小数的位数。举例来说,希望小数点后⾯只保留两位,占位符可以写
成
%.2f
。
// 输出 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;
}
上⾯示例中, %6.2f 表示
输出字符串最小宽度为6,小数位数为2。所以,输出字符串的头部有两个空格。
最小宽度和小数位数这两个限定值,都可以⽤ * 代替,通过
printf()
的参数传⼊。
#include <stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}
// 等同于printf("%6.2f\n", 0.5);
7.1.4.4 输出部分字符串
%s
占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤
%.[m]s
指定输出的长度,其中 [m] 代表⼀个数字,表示所要输出的长度。
// 输出 hello
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
上面示例中,占位符
%.5s 表示只输出字符串“hello world”的前5个字符,即“hello”。
7.2 scanf
当我们有了变量,我们需要给变量输⼊值就可以使⽤
scanf
函数,如果需要将变量的值输出在屏幕上的时候可以使⽤ prinf
函数,下面看⼀个例⼦:
#include <stdio.h>
int main()
{
int score = 0;
printf("请输⼊成绩:");
scanf("%d", &score);
printf("成绩是:%d\n", score);
return 0;
}
结果
7.2.1 基本用法
scanf()
函数用于读取用户的键盘输⼊。
程序运行到这个语句时,会停下来,等待用户从键盘输⼊。
用户输⼊数据、按下回⻋键后, scanf() 就会处理用户的输⼊,将其存⼊变量。
它的原型定义在头⽂件
stdio.h
。
scanf()
的语法跟
printf()
类似。
scanf("%d", &i);
它的第⼀个参数是⼀个格式字符串,里面会放置占位符(与
printf()
的占位符基本⼀致),告诉编
译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。
注意:变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址,
即将变量 i 的地址指向用户输⼊的值。
如果这里的变量是指针变量(比如字符串变量),那就不用加 & 运算符。
7.2.2 scanf的返回值
scanf()
的返回值是⼀个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回
0
。
如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF (-1)。
EOF - end of file ⽂件结束标志
7.2.3 占位符
scanf() 常⽤的占位符如下,与 printf() 的占位符基本⼀致。
• %c :字符。
• %d :整数。
• %f : float 类型浮点数。
• %lf : double 类型浮点数。
• %Lf : long double 类型浮点数。
• %s :字符串。
• %[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停⽌。
上⾯所有占位符之中,除了
%c
以外,都会自动忽略起首的空白字符。 %c
不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。
7.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;
}
上面示例中,如果用户输⼊ 2020-01-01
,就会正确解读出年、月、日。问题是用户可能输⼊其他
格式,比如
2020/01/01
,这种情况下,
scanf()
解析数据就会失败。
为了避免这种情况,
scanf()
提供了⼀个赋值忽略符(assignment suppression character)
*
。
只要把
*
加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
#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;
}
上面示例中,
%*c
就是在占位符的百分号后面,加⼊了赋值忽略符
*
,表示这个占位符没有对应的 变量,解读后不必返回。