目录
一 数据类型
为什么要有类型:编译器只有知道数据类型才能知道怎么操作
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
此时输入字符-或/都不会对其之后读取数据有影响
5664

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



