*C语言入门 —— 数据类型与变量(纯干货版)

目录

一、数据类型分类

(一)、数据类型介绍

⚪整型

⚪ 浮点型

⚪ 字符型

⚪布尔类型

(二)、各种数据类型的长度

sizeof 操作符

补充

二、signed和unsigned

⚪整型

⚪字符型

三、数据类型的取值范围

四、变量

(一)、变量的创建

(二)、变量的分类

拓展

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

① +

② -

③ *

③ /

④ %

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

(一)、连续赋值

(二)、复合赋值符

七、单目操作符

① ++和--

1. 前置 ++

2. 后置 ++

3. 前置 --

4. 后置 --

② +和-

八、强制类型转换

九、scanf和printf介绍

(一)、printf

1.基本用法

2.占位符

3.占位符大全

4.输出格式

① 限定宽度(最小总长度)

② 显示正负号

③ 限定小数位数(保留位数)

④ 输出部分字符串

(二)、scanf

1.基本用法

2.scanf的返回值

3.占位符

4.赋值忽略符


一、数据类型分类

整型类型--描述整数,字符类型--描述字符,浮点型类型--描述小数

(一)、数据类型介绍

⚪整型

//短整型
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]

⚪ 浮点型

float //单精度浮点型
double //双精度浮点型
long double

⚪ 字符型

char
[signed] char //有符号的
unsigned char //无符号的

⚪布尔类型

C语言开始并没有为布尔值单独设置一个类型,而是用整数0表示假,非0值表示真。

在C99中也引入了布尔类型,专门表示真假。

_Bool 

布尔类型在使用时得包含头文件:<stdbool.h>。

布尔类型变量仅有两种取值分别为:true或者false。

#define true //1
#define false //0

#define bool //_Bool-新名字

代码演示:

(二)、各种数据类型的长度

每一种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不用,存储的数据范围就有所差异。

注意:C语言标准规定:sizeof(long)  >=  sizeof(int)

sizeof 操作符

sizeof 是一个关键字,也是操作符,专门用于计算 sizeof 的操作符数的类型长度单位是字节

sizeof的操作数可以是数据类型,也可以是变量或者表达式

sizeof(数据类型/变量)
sizeof 变量/表达式
#include <stdio.h>
int main()
{
	int a = 10;
	printf("%zd\n", sizeof(a));//变量
	//a是变量的名字,可以省略掉sizeof后边的()
	printf("%zd\n", sizeof a); 
	printf("%zd\n", sizeof(int)); //数据类型
	printf("%zd\n", sizeof(3 + 3.5)); //表达式
	return 0;
}

注:sizeof 操作数如果是表达式的时候,可以省略后边的括号;且表达式不是真实参与运算的,而是根据表达式结果的类型来得出大小。

代码演示:

sizeof 运算符的返回值是无符号整数,并没有规定具体类型,而是留给系统去决定可能是unsigned int,unsigned long、unsigned long long对应的占位符分别是 %u、%lu、%llu。C语言提供了一个解决方案,创造了一个类型别名 size_t --- 用来统一表示sizeof的返回值类型


补充

1.计算机中的常见单位

bit --> 比特位(计算机中用于存储信息的最小单位,代表二进制位数)

Byte --> 字节   1 Byte = 8 bit 

1 KB = 1024 Byte

1 MB = 1024 KB

1 GB = 1024 MB

1 TB = 1024 GB

1 PB = 1024 TB

2.计算机能够识别的是二进制的数据

二进制:由0/1的数字组成

存储1个二进制位需要的空间就是1个bit位


二、signed和unsigned

(只修饰字符型、整型类型)

signed:关键字,表示一个类型带有正负号,修饰变量的值可正可负。

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

⚪整型

对于int类型,默认是带有正负号,由于默认情况,关键字signed一般都省略不写

signed int a
//等同于int a; 

int类型也可以不带正负号,只表示非负整数,此时必须使用关键字unsigned声明变量。

unsigned int a;
//unsigned int里面的int可以省略
//等同于unsigned a;

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

代码演示:

⚪字符型

对于char类型,默认是否带有正负号,由当前系统所决定

signed char b;//取值范围 -128 ~ 127
unsigned char b; //取值范围 0 ~ 255

三、数据类型的取值范围

limits.h -- 整型类型的范围、 float.t -- 浮点型类型的范围

• 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 的最大值。

代码演示:

四、变量

变量 -- 经常变化的值、常量 -- 不变的值

(一)、变量的创建

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

1.变量名要有意义;

  变量名组成只能是字母、数字、下划线,并且不能是数字开头;

  变量名不能是关键字。

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

(二)、变量的分类

⚪全局变量:大括号外部定义(全局变量都可用)。

⚪局部变量:大括号内部定义(局部变量局部用)。

当全局变量和局部变量同名时,局部变量优先使用

代码如下:


拓展

全局变量和局部变量在内存中存储在哪里呢?

内存中三个区域:栈区、堆区、静态区等等,其他暂不介绍

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

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

3.堆区是用来动态内存管理的

补充:电脑上有内存,内存是用来存放数据的,我们创建变量的本质是在内存中申请了一块空间。


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

C语言中为了方便于运算,提供了一系列操作符(也叫运算符),其中一组操作符叫:算术操作符,分别是+、-、*、/、%,这些操作符都是 双目操作符——有两个操作数(左操作数,右操作数)。

① +

② -

③ *

③ /

④ %

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

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

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

在变量创建的时候给一个初始值叫初始化,在变量创建好后,再给一个值,这叫赋值。

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

int a = 0; //初始化
a = 75; //赋值

(一)、连续赋值

C语言语法虽然支持这种写法,但由于写出的代码不易理解,不推荐,建议拆开来写。

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = 0;
	c = b = a + 2;
	//连续赋值,从右向左依次赋值
	printf("%d\n",b); //5
	printf("%d\n",c); //5
	return 0;
}

(二)、复合赋值符

//数的自增、自减方便写法
int a = 5;
a += 3; //a = a + 3
a -= 4; //a = a - 4

C语言中提供了复合赋值符,方便写代码,如下:

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

七、单目操作符

C语言中还有一些操作符只有一个操作数,被称为单目操作符。++、--、+ (正)、- (负)就是单目操作符

① ++和--

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

1. 前置 ++

口诀:先 +1,后使用

2. 后置 ++

口诀:先使用,后 +1

3. 前置 --

口诀:先 -1,后使用

4. 后置 --

口诀:先使用,后 -1

② +和-

运算符 + 对正负值没有影响,是一个可以完全省略的运算符。

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

八、强制类型转换

语法形式如下:

(  数据类型  )

代码如下:

结果:

九、scanf和printf介绍

(一)、printf

1.基本用法

printf()的作用是将参数文本输出到屏幕。f 代表format(格式化),表示可以定制输出文本格式。

#include <stdio.h>
int main()
{
	printf("Hello World");
	return 0;
}

printf()不会在行尾自动添加字符,运行结束后,光标停留在输出结束的地方,不会自动换行;为了让光标移到下一行的开头。可以在输出文本的结尾,添加一个换行符\n。 

printf()是在标准库的头文件 stdio.h 定义的。使用这个函数之前,必须在源码文件头部引入这个头文件,当我们缺少头文件时会出现以下结果(头文件引入靠后也会报错):

2.占位符

所谓占位符,就是这个位置可以用其它值代入。printf()可以在输出文本中指定占位符。

#include <stdio.h>
int main()
{
	printf("I have 2 apples\n");

	printf("I have %d apples\n", 2);
    //%d就是占位符,表示这个位置要用其他值来替换
    //占位符第一个字符一律为%,第二个字符表示占位符的类型
	return 0;
}
#include <stdio.h>
int main()
{
	printf("coder4_ is so cool\n");

	printf("%s is so cool\n", "coder4_");
	//%s表示代入的是一个字符串
	return 0;
}


输出文本里面可以使用多个占位符。

#include <stdio.h>
int main()
{
	printf("coder4_ says it is 6 o'clock\n");

	printf("%s says it is %d o'clock\n","coder4_",6);
	//输出文本有%s %d两个占位符,参数分别对应printf()里的 coder4_、6
	return 0;
}

printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个。如果参数个数少于对应的占位符,printf()可能会输出内存中的任意值。

代码如下:

3.占位符大全

• %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 类型。
• %% :输出一个百分号

4.输出格式

printf()可以定制占位符的输出格式。

① 限定宽度(最小总长度)

printf()允许限定占位符的最小宽度。

代码如下:

对于小数,这个限定符会限制所有数字的最小显示宽度。

② 显示正负号

默认情况下,printf()不对正数显示+号,只对负数显示-号。如果想把正数想把前面的+号显示出来,可以在占位符的%后加一个+。%+d可以确保输出的数值,总是带有正负号。

③ 限定小数位数(保留位数)

这种写法可以和前面限定宽度结合使用,代码如下:

补充:最小宽度和小数位数这两个限定值,都可用*来代替,通过print()的参数传入。

④ 输出部分字符串

%s 占位符用来输出字符串,默认是全部输出。如果只想输出开头部分,可以用%.ms指定输出的长度,其中m代表一个数字,表示所要输出的长度。

(二)、scanf

当我们创建好了变量,我们需要给变量输入值就可以使用scanf函数,如果需要将变量的值输出在屏幕上的时候可以使用printf函数。

1.基本用法

scanf()函数用于读取用户的键盘输入。它的原型定义在头文件stdio.h

当程序运行到这个语句时会停下来,等待用户从键盘输入。用户输入数据、按下回车键后,scanf()就会处理用户的输入,将其存入变量。

scanf()语法跟printf()类似。

scanf("%d",&i);
//第一个参数%d:表示用户输入的是一个整型
//%d就是一个占位符,%是占位符的标志
//第二个参数&i:将用户从键盘输入的整数存入变量i

它的第一个参数是一个格式字符串,里面会放置占位符(与printf()的占位符基本一致),告诉编译器如何解读用户的输入,需要提取的数据是什么类型。

这是因为C语言的数据都是由类型的,scanf()必须提前知道用户输入的数据类型,才能处理数据。

它的其余参数就存放用户输入的变量,格式字符串里有多少个占位符,就有多少个变量。

注:变量前面必须加上&运算符(指针变量除外),因为scanf()传递的不是值,而是地址,即将变量i的地址指向用户输入的值。

scanf()处理数值占位符时,会自动过滤空白字符(%c除外),包括空格、制表符、换行符等。所以用户输入的数据之间,有一个或者多个空格不影响scanf()解读数据。另外,用户使用回车键,将输入分成几行,也不影响解读。

代码如下:

2.scanf的返回值

scanf()的返回值是一个整数,表示成功读取的变量个数。

如果没有读取任何项,或者匹配失败,则返回0;如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。

EOF:end of file 文件结束标志

3.占位符

• % c :字符。
• % d :整数。
• % f : float 类型浮点数。
• % lf : double 类型浮点数。
• % Lf : long double 类型浮点数。
• % s :字符串。
• % [ ] :在方括号中指定⼀组匹配的字符(⽐如% [0 - 9] ),遇到不在集合之中的字符,匹配将会
停止。

上面所有占位符中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。如果要强制跳过字符前的空白字符,可以写成scanf(" %c",&i),即%c前加上一个空格,表示跳过零个或多个空白字符。(对应的每个占位符前都要加空格)。

代码如下:

 

特别说一下占位符%s,它其实不能简单地等同于字符串。它的规则是:从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。

因为%s不会包含空白字符,所以无法用来读取多个单词,除非多个%s一起连用。这也意味着,scanf()不适合读取可能包含空格的字符串。

另外,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。

scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,存储字符串时,很可能会超过数组的边界,导致意想不到的结果。为了防止这种情况,使用%s占位符时,应该指定读入字符串的最长长度,即写成%ms(m仅表示一个整数非统一写法),表示读取字符串的最大长度,后面的字符将被丢弃。

4.赋值忽略符

有时,用户输入可能不符合预定的格式。

比如:以下示例当输入满足%d-%d-%d的格式(scanf中得打印出-),才会正确输出相对应的格式。问题是用户可能输入其他格式,例:year/month/day等,这种情况下,scanf()就会解析数据失败。

为了避免这种情况,scanf()提供了一个赋值忽略符*。只要把*加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。

实际上,这里的%c后边得需要一个变量来接收这个值,但是不想再创建变量接收,所以加上*忽略。


  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值