【02 数据类型和变量】

大纲

1.数据类型介绍
2.signed和unsigned
3.变量
4.算术操作符: +、-、*、/
5.赋值操作符: =和复合赋值
6.单目操作符: ++、–、+、-
7.强制类型转换
8.scanf和printf

1. 数据类型介绍

类型就是数据拥有的共同特征,只有知道了类型,才知道怎么操作数据
在这里插入图片描述

1.1 字符型

字符型char原单词character,分号有符号和无符号
signed char
unsigned char

1.2 整形

每类整形都分为有符号和无符号,[]中是可省略内容
短整型: short [int]
整形: int
长整型: long int
更长的整形,C99: long long [int]

1.3 浮点型

float

1.4 布尔类型

C99引入,表示真假,0表示真,非0表示假,需要头文件<stdbool.h>,取值是true 1,fasle 0
_Bool

1.5 数据类型的长度

每种数据类型都有自己的长度,存储的数据范围不同
0xff 255
0x80 128
0xffff 65535
0x8000 32768
记住常用数值可以快速加减
如:
0x83的十进制=128+3
0xfffa的十进制=0xffff-5=65535-5=65530

sizeof

是一个关键字,操作符,专门用来计算操作符数类型长度,单位是字节,计算结果size_t类型
sizeof后面是表达式时可以省略括号

sizeof的返回值并没有规定具体类型,所以c语言提供了一种size_t统一反应对应系统的返回值类型

数据类型长度

    printf("%zd\n", sizeof(char));
	printf("%zd\n", sizeof(_Bool));
	printf("%zd\n", sizeof(short));
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof(long));
	printf("%zd\n", sizeof(long long));
	printf("%zd\n", sizeof(float));
	printf("%zd\n", sizeof(double));
	printf("%zd\n", sizeof(long double));

输出结果为:
在这里插入图片描述
c语言指规定了long类型必须大于等于int,具体大小并未规定,由操作系统决定
sizeof对表达式不计算,在编译的时候就已经确定了数据类型,只看变量的类型
浮点数后缀不加f默认为double类型,如3.14

2.signed和unsigned

signed关键字表示类型带有正负号,unsigned表示不带正负号,声明为unsigned可以表示的值扩大了一倍
char类型默认是否带正负号,有系统决定,与int不同,int等同于signed int,char有可能是

数据类型的最大值和最小值

数据类型的最大最小值可以在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         //有符号整型的最⼤值

3.变量

变化的值称为变量,不变的值称为常量
语法:

data_type name
   |        |
数据类型   变量名

变量在创建的时候给一个初始值,叫初始化。如果不初始化马上赋值也可以,但不初始化也不赋值会是一个随机值

int age=10;
char ch='w';

变量的分类

全局变量: 在大括号外面定义的是全局变量,整个工程都可以使用
局部变量: 大括号内部定义的是局部变量,只能在局部使用
当全局变量和局部变量同名的时候,局部变量优先使用

变量的存储位置

内存分为栈区、堆区、静态区
在这里插入图片描述

4.算数操作符

操作符也叫运算符,是双目运算符
如果出现无法解析的外部符号报错,有可能是没包含头文件

除法

除法运算符中,c语言的除法是整数除法,就算是float也会返回整数,丢弃小数部分。只要有一个操作数是小数,就会执行小数除法

    float n = 7 / 2;
	float n1 = 7 / 2.0;
	printf("%f\n%f", n,n1);
    int score = 5;
	score = (score / 20) * 100;
	printf("%d", score);

上面的代码执行结果是0,因为score/20是整数除法,会得到0,想得到小数可以将20改为20.0,此时输出25
在这里插入图片描述

%运算

这个为求模运算,返回两个整数相除的余,这个运算符只能用于整数,不能用于小数
负数求模的规则,结果的正负号由第一个运算符的正负号决定

	printf("%d\r\n", 11 % 5);
	printf("%d\r\n", -11 % 5);
	printf("%d\r\n", 11 % -5);

上述输出结果:
在这里插入图片描述

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

变量创建好后再给一个值叫赋值
赋值可以连续赋值,如:

	int a=3;
	int b=5;
	int c=0;
	c=b=a+3;//连续赋值

支持这种赋值,从右到左依次赋值,这种不容易理解,建议拆开来写

复合赋值符

a=a+3,可以写为a+=3,这些赋值符有:
+= -= *= /= %= >>= <<= &= |= ^=

7.单目操作符:++、–、+、-

前面说了双目操作符,只有一个操作数的,被称为单目操作符

++和–

分为前置和后置,以加法举例
前置++: 先加1,再使用

int a=10;
int b=++a;

a的值刚开始是10,加了一次后为11.赋给了b,b也是11。相当于a=a+1,b=a
后置++: 先使用,再加1

int a=10;
int b=a++;

a的值刚开始是10,先赋给b,b为10,然后自增1,11,代码走完。相当于 b=a,a=a+1

+和-

+号对正负值没有影响,可以省略。-号会改变,负数的前面必须加-号

7.强制类型转换

int a=3.14;
//a是int型,3.14是double类型,两边的类型,编译器会报警告
int a=(int)3.14
//这样强制转为int,就会只取整数部分

8.scnaf和printf

printf是将参数文本输出到屏幕,f的代表format(格式化),表示可以定制输出文本的格式。printf在结尾的时候光标停留在结束的地方,不会自动换行。在输出的文本末尾可以加 \n

占位符

占位符就是这个位置可以用其他值代替
printf("%d",3);
上述%d就是占位符,表示这个位置需要用其他值代替,第一个是占位符的符号,第二个d是类型,表示占一个整数,用后面的3替换了%d
printf参数和占位符一一对应,如果有n个占位符,参数就应该有n+1个,如果参数个数少于占位符,就会输出内存任意值

占位符列举

%f     小数类型
%hd     十进制short int
%ld     十进制long int
%lld     十进制long long int
%lf     double类型
%E     科学计数法的浮点数,指数部分e大写
%o      八进制整数
%p     指针
%s     字符串
%u     无符号整数 unsigned int
%x     十六进制整数,大小写由x的大小写决定
%zd     size_t类型

输出格式

限定占位符的最小宽度
printf("%5d",123);
最小输出宽度5位,不满5位,前面添空格,默认右对齐,在5d前加个负号就是左对齐
对于小数,限制所有数字的宽度,包括小数点在内
总是显示正负号
默认只显示负数的-号,如果想让正数显示+号,可以在%后面加一个+
限定小数位数
希望保留小数点后几位,可以写为%.2f,这样写小数点后显示2位,这种写法可以和限定宽度同时使用,%6.3f,小数点后显示3位,总宽度6位
最小宽度和小数位数的限定可以用*号代替

printf("%*.*f",6,2,0,5);

输出部分字符串
%s用来输出字符串,如果只想输出开头的部分,可以用%.[m]s指定输出长度,m表示输出多少个字符



scanf用来给变量输入值

int a;
scnaf("%d",&a);
printf("%d",a);

scanf从键盘得到输入的a值,然后用printf打印输出到屏幕上
基本用法
用于读取用户的键盘输入,运行到这时会停下来等待用户输入,遇到回车就会处理输入,原型头文件在stdio.h中
它的第一个参数和printf一致,表示输入的数据类型,

变量前必须加上&运算符,指针除外,传的不是值,是地址

scanf处理时,会自动过滤空格字符,制表符和换行符等,用户空格回车分行都不影响解读。但输入必须和占位符之间的格式一致,会自动从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止

	int x;
	float y;
	//输入-13.45e12# 0
	scanf("%d",&x);
	printf("%d",x);
	scanf("%f",&y);
	printf("%f",y);

上述,第一个%d读取整数,遇到小数点不符合格式停止读取,所以x输出-13,然后读到#不符合,停止读取,其中e12为科学计数法,表示*10^12次方,所以y输出为0.45*e12,小数会有误差,结果如下:
在这里插入图片描述
scanf的返回值
返回成功读取的字符个数,如果发生读取错误或遇到文件结尾会返回常量EOF,值-1

int a=0;
int n=scanf("%d",&a);
printf("%d",n);

在这里插入图片描述
输入crtl+z打断输入,返回值-1

占位符
占位符基本和pirntf一致,
%[]:   指定匹配的字符格式,遇到不符合的停止。如[0-9],只接收0-9的数字
除过%c外,都会自动忽略开始输出的空格部分,如果%c想跳过空格,可以写为% c,夹一个空格
%s的不能读取空格,所以不能读取英语句子,会自动在字符串末尾添加\0
%s读取字符串也不会检测长度是否超过,超过数组长度可能会崩溃,为了防止这种情况,可以写为%[m]s,m为整数,读取的最大长度,超过的会扔掉
赋值忽略符
用户的输入可能不符合格式,只要吧*号加在占位符的后面,该占位符就会被丢弃

int year=0;
int month=0;
int day=0;
scanf("%d-%d-%d",&year.&month,&day);

上述需要用户输入的格式为2011-1-1,如果输入为2011/1/1或其他格式,就会解析失败,所以修改为下写法:

int year=0;
int month=0;
int day=0;
scanf("%d%*c%d%*c%d",&year.&month,&day);

用%*c读取一个字符并忽略,无论输入什么格式都不会影响读取

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值