第二章C语言数据类型和变量

目录

一  数据类型

二  sizeof

三  signed和unsigned

四  数据类型的取值范围

五  变量

六  算术操作符

七  赋值和赋值符

八  单目操作符

九  强制类型转换

十  printf的介绍

十一  占位符

十二  scanf的介绍


一  数据类型

为什么要有类型:编译器只有知道数据类型才能知道怎么操作

1.内置类型

()表示其在内存中存储所占的字节数

(1)字符型:字符也能算作整形的一种,其底层是ASCII码

(2)整形:分为常量和变量,有符号整形都是以二进制补码的形式存储在内存中

短整型short int(2),整形int(4),长整型long int(4),更长整形long long int(8)

(3)浮点型(实型):以小数形式或指数形式呈现,指数形式:ne/Em,表示nx10的m次方

单精度浮点型float(4),双精度浮点型double(8),更长精度浮点型long double(8/16)

(4)布尔类型(1):专门用于表示真假的类型

(i)其值只有true和false

(ii)格式:bool 或_Bool

(iii)使用该类型定义变量时要引用头文件<stdbool.h>

2.自定义类型

(1)数组

(2)union联合体

(3)enum枚举

(4)struct结构体

3.指针类型

4.空类型

二  sizeof

1.其属于关键字和操作符

2.用途:可求变量,类型和表达式在内存中所占的字节大小

3.使用:若为类型则为sizeof(类型),若为变量或表达式,则这个括号可省略

4.原则上:short <=int<=long int<=long long int  float<=double<=long double

5.sizeof返回值的类型:是无符号整形,原则上所有的无符号整形都有可能,具体什么类型根据系统会有所区别,所以额外为他的返回值定义了一个类型为sizeof_t,使用printf函数打印时使用占位符%zd和%ud

6.注意点:若用sizeof求表达式所占字节大小,只识别它的类型,表达式不会被执行

例如:sizeof(a=5+4)并不会被执行,a还是原来那个值

7.单位:计算机能识别的是二进制的信息,能存储一个二进制位的空间就是一个bit位

1bit=1个字节

三  signed和unsigned

1.限定修饰范围:整形和字符型

2.signed:有符号的,包含负值

3.unsigned:无符号数,只包含0和正整数

4.int=signed int,在整形中unsigned/signed (int)可省略

5.但char并不一定等同于signed char,取决于编译器的类型,C语言没有固定的规定,所以字符是否要有符号要明确声明(这点要与int区分开)

6.unsigned的好处:在内存中存储上的数值大了一倍

7.打印无符号数整形使用%u,%lu,%llu,打印有符号整形使用%d

注意:若此时一个值为负数,但是却用%u打印,会出现乱码情况,但是用%d还是可以得到对应的值,要注意类型和占位符要相对应。

四  数据类型的取值范围

1.查看整形的取值范围:limits.h

   查看浮点数的取值范围:float.h(都是在Everything中搜索对应的头文件)

注意:为了代码的可移植性,之后在使用到其最大最小值的时候尽量使用其已经给定的常量名称

2.在使用四则运算的使用要注意溢出的问题,乘法比加法更容易溢出出错

概念:上溢:超过最大取值范围

           下溢:精度被截断

五  变量

1.初始化:创建变量的同时给它一个值,叫做初始化,在vs2022中如果不初始化直接赋值会报错,但是在dev c++中会自动赋值一个0,但是要养成良好的习惯,创建变量的同时对他进行初始化,如果不知道初始化什么就先赋值为0

2.分类:

(1)全局变量:定义在{}之前的变量,几乎可适用于整个工程,存放于静态区中

(2)局部变量:定义在{}之内的变量,出了{}之后就被销毁,其在内存中存储于栈区

3.注意:若一个变量名同时为局部变量和全局变量,以局部变量的为准,若想要强制其为全局变量的值,则需要在.cpp文件中在输出传参变量时在变量面前加上::

4.变量不初始化的问题:

全局变量不初始化:默认为0

局部变量不初始化:系统会报错不让运行或者给它一个随机值

5.额外补充:内存的存储区域(创建变量的本质是在内存中申请空间

栈区:局部变量和函数参数

堆区:动态内存管理(malloc,calloc,realloc,free)

静态区:全局变量和静态变量

六  算术操作符

1.类型:+,-,*,/,%

2./要注意的问题:

(1)/当两边都为整形时进行的时整型的除法,会直接舍弃小数部分,要进行浮点数除法至少要有一个数是浮点数

(2)当其运算出浮点数但是赋给了一个整形可能会丢失精度和数值

(3)在编写代码时写出的3.14,2.15等小数编译器会识别成为double类型的数,其在进行运算时会先统一转到高类型的,再统一进行运算,运算后赋给那变量,会对应转换为那变量的类型

3.%要注意的问题:

(1)%仅适用于整形运算,不可用于浮点数

(2)%算出结果的符号取决于第一个运算数的符号

例如:-10%3==-1

七  赋值和赋值符

1.赋值:变量已经初始化再给变量一个值

2.连续赋值:前提保证等号左边是个变量名即可

例:a=b-4=3(X),此时b-3并不为变量名不可进行赋值操作

3.复合操作符:+=,-=,*=,/=,%=,>>=,<<=,&=,^=,l=

例如:a%=5->a=a%5

八  单目操作符

1.类型:++,--,+,-,

2.+:不会影响正负号,无任何效果

九  强制类型转换

1.前提:当定义了一个整形变量却给他赋了浮点数,此时系统会报警告,需要进行强制类型转换

2.格式:(类型) 变量名=(类型)数值

例如:int a = (int)3.14

此时打印a时他会会舍弃小数部分,打印出整形3

3,尽量不要使用,最好数值和类型的对应

十  printf的介绍

1.作用:将参数文本输出到屏幕,

2.参数:参数与占位符是对应关系,有n个占位符,就有n=1个参数,参数之间用逗号隔开

十一  占位符

1.作用:占位符上可以替代任意变量,有利于文本的灵活性,可以在文本上替换对应的量

例如:%s will come tonikght 和ZhangSan will come tonight比更具有灵活可变性

2.类型:

%d:有符号的十进制整数

%e/%E:打印科学计数法的浮点数,使用%E对应打出来为大写的E,%e同理

%zd/%ud:用于打印sizeof_t类型的

%a/%A:十六进制的浮点数

%f:打印float或double型

%hd:打印short int短整型变量

%hu:打印无符号的短整型变量

%ld:打印long int长整型的变量

%lu:打印无符号的long int长整型变量

%c:用于char类型打印字符

注意:由于字符底层是ASCII码值,所以其也是整形的一种,所以char类型的变量可赋字符或数字,当字符型变量用%d打印时,会打印出字符对应的ASCII码值,若用%c打印则会打印出ASCII码表上对应的字符

对应char的有无符号打印问题:只要是打印字符用%c即可,要打印有符号的字符的ASCII码值用%d,要打印无符号字符的ASCII码值用%u

%lld:打印long long int更长整形所用的值

%llu:打印无符号数的long long int

%o:打印八进制的整数

%x:打印十六进制的整数

%Lf:打印long double的整数

%s:字符串

%u:打印无符号整数(unsigned int)

%%:打印一个%

3.限定宽度:

(1)整型:

(i)%nd:最少打印出多少位(注意最少,如果限定小于实际长度,那么仍按实际长度输出),不满足长度的用空格补齐,默认是右对齐

(ii)%-nd:使用-号,变为左对齐

(iii)%0nd:用0替代空格将空位补齐

(iv)%+d:可以保证输出时显示正负号,对正数会在前加一个正号,对于负数无影响

(2)浮点数:

(i)%m.nf:限定输出的小数位,会对其进行四舍五入,整数部分若大于其要求的位,则仍会按实际长度打印,小数位数比实际多会在后面补0(注意打印小数的位数,若太长的话会导致精度缺失,即精度不准确,打印越多,位数越不准确)

(ii)替换形式:printf(“%6.2f",i);==printf("%*.*",i);

(3)字符串:

(i)%.ns:可用于控制字符串打印n个字符(要与scanf函数区分开他是%ns,没有那个.)

十二  scanf的介绍

1.作用:用于读取用户的键盘输入的数据,程序运行到这个语句时会停下,等待用户输入数据按下回车,将值放于变量中

2.在vs2022报错的原因:scanf的运行有风险,因为数组的存储的个数是有限的,但是scanf在读取字符串的时候不论长度直接存放于数组当中,而数组无法存储,会导致数组越界非法访问,会破坏数组的栈容量

解决方式:由于每次vs2022创建新的源文件都是从newc++file.cpp中拷贝而来的,所以只要在newc++.file.cpp中添加上#define+空格+其标语即可。

具体操作:先在Everything中找到对应的文件对应的路径拷贝在桌面上用vs2022打开,然后将对应的放进去保存后重新放于对应路径下即可

3.要使用%的原因:必须告诉编译器其是什么类型的数据,编译器才能知道要如何存储和处理

4.运行原理:用户输入的数据先保存在缓冲区,等到按下回车键后,根据占位符对缓存进行解读,从用户输入的数据一个一个读取,直到读到不符合这个类型的数据,读取才终止,将读取到的数据存储于变量中,继续从上次遗留的位置接着读取下一个占位符的数据

5.scanf的返回值:

(1)scanf的返回值等于成功读取数据的变量个数

(2)若没有读取到数据其返回值即为0

(3)若读取失败,则会返回EOF(值为-1)(在vs2022上需要按三次ctrl+z+回车,先按ctrl+z再按回车

6.占位符的问题:

(1)大体上与printf相一致,但是scanf的%f仅适用于float,double必须要用%lf,long double必须使用%Lf

(2)除了%c和%s之外,scanf在读取数据的时候会忽略空格符,制表符,换行符,并且各个数据之间要用空格隔开

(3)要牢牢记住scanf读取%c也会读取空格字符,不管后面是什么,其只看第一个字符

若想要其忽略前面的空格则可以在%c前面加一个空格(在scanf函数中加)

(4)%s在读取到空格的时候会停下,无法读取多个单词,除非利用多个%s

并且读取完后会在末尾放一个\0

(5)%[]:可限定输入的内容,若输入的内容不在这之内,则不会进行读取

(6)%ns:用于防止数组溢出,限定数组的输入最长字符比实际容纳量要少,则不会导致数组的越界访问

7.数值忽略符:用于scanf的形式与用户实际输入形式不相符的情况

例:%d-%d-%d 用户:2024/10/13 

此时会导致后面两个数据读取不到,此时只需要加个数值忽略符*,就可以让数据解析完就丢掉,不会进行存储

例:%d%*c%d%*c%d 

此时输入字符-或/都不会对其之后读取数据有影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值