C语言-整体内容简单的认识

一、数据类型的介绍

  sizeof是一个操作符,是计算机类型/变量所占内存空间的大小
  scanf函数返回的是读取到数据的个数,如果scanf函数读取失败会返回EOF(EOF end of file 文件结束标志,#define EOF -1)
  多组输入:while(scanf(“%d”,&q)==1) 如果读取到一个数就持续输入,否则返回EOF
  scanf函数每次读取一个字符,跳过所有的空白字符,直到遇到第一个非空白字符的时候才开始读取。并且在读取到第一个空白字符后结束读取,将空白字符之后的所有字符都暂存在缓冲区中。除非缓冲区被刷新( fflush(stdout) )或者字符被读取走,否则将一直停留在缓冲区中。
  多组输入读一个字符通常用getchar()。如果读取到一个字符就返回该字符的ASCII码值,否则返回EOF。(while(ch=getchar())!=EOF)
  处理缓冲区的\n的问题也通常使用getchar()函数来处理。 (getchar(); 处理\n)

  %d—是以十进制的形式打印一个整数
  %c—以字符的形式进行打印
  %s—以字符串的形式进行打印
  %f—以float的形式进行打印,默认保留6位小数。%.nf指定保留n位小数。%mf指定输出宽度为m个字符,如果少于m个字符,则右对齐并用空格填充左侧。%e以科学计数法输出浮点数。
  %lf—以double的形式进行打印
  %ld—以long的形式进行打印
  %lld—以long long的形式进行打印
  %p—以地址的形式进行打印,是以16进制的形式表示地址的
  %zd—以size_t的形式进行打印
  %u—以无符号整型的形式进行打印
  %x—以十六进制无符号整型的形式进行打印
  %.0f 用来输出一个浮点数的整数部分,自动进行四舍五入,并且不显示小数点

内置的数据类型,C语言本身就具有的类型。(char,short,int,long,long long,float,double等)
自定义类型,允许你创建出来的类型。(结构体类型等)

整型(int)表示的最大最小整数值是(2147483647)和(-212147483647-1)

1字节(byte)等于8个bit位(bite)
一个汉字占两个字节
1KB等于1024个字节

在这里插入图片描述

55.5小数直接写出来,编译器默认是double类型的
55.5f 这个时候是float类型

二、数据的变量和常量

在这里插入图片描述

首先原则上我们的变量名尽量不要冲突
但是当全局变量和局部变量的名字冲突的情况下, 局部优先的

三、变量的作用域和生命周期

作用域:
1.局部变量的作用域是变量所在的局部范围
2.全局变量的作用域是整个工程
生命周期:
1.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
2.全局变量的生命周期是:整个程序的生命周期

全局变量未初始化的话默认为0,局部变量未初始化的话默认为随机值(可能会出现编译错误)

extern 用于声明外部符号

在这里插入图片描述

四、字符串

在这里插入图片描述
  \0是字符串的结束标志
  printf 以%s打印字符串的时候,就要从你给的地址开始打印,一直打印遇到\0,停止。
  printf的返回值是屏幕上打印字符的个数,包括\0的个数
  printf(“%02d”) 表示以十进制整型方式打印,宽度为2个字符,不够用0补齐
  printf(“%.2d”) 保留两位数

在这里插入图片描述
在这里插入图片描述

strlen是库函数,用来求字符串长度的,就是从给定的地址,向后数字符,直到遇到\0,结束,\0不统计在内。
统计ch1的字符长度是随机值,因为不知道字符串后面的\0的位置。ch2则是以\0为结尾的字符串。

sizeof和strlen的对比
1.sizeof是操作符,strlen是库函数
2.sizeof计算的占有内存的大小,单位是字节,不关注内存中存放的具体数据
strlen是求字符串长度的,只能针对字符串,统计的是字符串中\0之前出现的字符的个数

五、转义字符

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\’用于表示字符常量’
\‘’用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字。如:\130 表示字符X
\xdddd表示2个十六进制数字。如:\x30 表示字符0

想要定义整数,8进制使用0开头表示 int x=0130
16进制使用0x开头表示 int x=0x130

ASCII表
在这里插入图片描述
8进制的130,转换成10进制后得到88,把88作为ACSII值代码的字符就是X
16进制的30,转换成10进制后得到48,把48作为ASCII值代码的字符就是0

int main() {
    int hex1 = 0x1A; // 十六进制数字,等价于十进制的 26
    int hex2 = 0xabc; // 十六进制数字,等价于十进制的 2748
    int octal = 0123; // 八进制数字,等价于十进制的 83
}

六、操作符

算数操作符
+   -   *   /(1.计算的结果是整除之后得到的商。2.除法有整数除法和浮点数除法(保证除数和被除数中至少有一个数是浮点数))   %(取模操作符(取余)得到的是余数,只适用于整数)

移位操作符
>>   <<

位操作符
&   ^   |

赋值操作符
=   +=   -=   *=   /=   &=   |=   >>=   <<=

单目操作符
!    逻辑反操作
-    负值
+    正值
&    取地址
sizeof   操作数的类型长度(以字节为单位)
~    对一个数的二进制按位取反
- -     前置、后置- -
+ +    前置、后置+ +
*      间接访问操作符(解引用操作符)
(类型)   强制类型转换

关系操作符
>     用于测试“大于”
>=    用于测试“大于等于”
<    用于测试“小于”
<=    用于测试“小于等于”
!=    用于测试“不相等”
==    用于测试“相等”

逻辑操作符
&&      逻辑与
||      逻辑或

条件操作符
exp1 ? exp2 : exp3      epx1的结果为真则输出exp2的结果,否则输出exp3的结果

逗号操作符
exp1, exp2, exp3, …expN      结果为逗号的最后一个表达式的结果(但是需要计算前面逗号的表达式,可能会影响最后表达式的值)

下标引用、函数调用和结构成员
[]      下标引用
()      函数调用
.      结构成员访问
->      结构成员访问

trunc取整,是左右都向0进行取整
在这里插入图片描述

floor取整,是左右向负无穷方向取整
在这里插入图片描述
ceil取整,是左右向正无穷大进行取整
在这里插入图片描述
round取整,是正常的四舍五入的进行取整

取模的定义

C:-10=(-3)*3+(-1)
python:-10=(-4)*3+2
所以,在不同语言,同一个计算表达式,负数“取模”结果是不同的,我们可以称之为分别叫做正余数和负余数
本质1:取余:尽可能让商,进行向0取整。 取模:尽可能让商,向负无穷方向取整
故:C中的%,本质其实就是取余。python中的%,本质就是取模

理解链:对任何一个大于0的数,对其进行0向取整和-∞取整,取整方向是一致的。故取模等价于取余。对任何一个小于0的数,对其进行0向取整和-∞取整,取整方向是相反的。故取模不等价于取余

同符号数据相除,得到的商,一定是正数(正数vs正整数),即大于0!故,在对其商进行取整的时候,取模等价于取余。

本质2:参与取余的两个数据,如果同符号,取模等价于取余

六、常见的关键字

关键字名称作用
asm表示与大括号一起使用时,大括号之间的每一行都是一条汇编语句。不与大括号一起使用,放在代码行首部,则表示其余部分是一条汇编语句
auto表示根据初始值自动推断变量的数据类型,不是每个编译器都支持auto
break表示跳出循环,当程序执行到break语句时,会立即退出当前的循环,并继续执行循环后面的代码
case表示case关键字用于在switch语句中标识不同的情况。每个case标签后面跟着一个常量表达式,用于与switch语句中的表达式值进行比较
catch表示用于异常处理,try执行try块的起始,try块后的catch可以捕获异常,异常由throw抛出。throw在函数中还表示动态异常规范
class表示一般的类声明
const表示类型修饰符,用于变量或函数参数声明,表示只读类型(指定类型安全性,保护对象不被意外修改)
const_cast表示取消常量属性,可以用来将一个常量指针或引用转换成一个非常量的指针或引用,同时保持它们指向原来的对象
decltype表示与auto关键字类似,用于编译时类型推导,但是并不像auto从变量声明的初始化表达式获得变量的类型,而总是以一个普通表达式作为参数,返回该表达式的类型
default1.表示在switch语句中用于指定当表达式的值与所有case标签都不匹配时应该执行的代码块。2.在C++11标准中通过参数列表后面写上=default来要求编译器生成默认构造函数
delete表示属于操作符,可以被重载。new表示向内存申请一段新的空间,申请失败会抛出异常。new会调用operator new函数,再在operator new函数里调用malloc函数分配空间,然后再调用构造函数。delete不仅会清理资源,还会释放空间。delete会调用析构函数,其次调用operator delete函数,最后在operator delete函数里面调用free函数。malloc申请内存失败后会返回空。free只是清理了资源,没有释放空间
do表示与while配合使用,先执行do后面的代码,然后再判断while后面括号里的值,如果为真,循环开始,否则,循环不开始
dynamic_cast表示父类的指针或引用转换为子类的指针或引用
explicit表示避免自定义类型的强制类型转换
export表示使用该关键字可实现模板函数的外部调用。对模板类型,可以在头文件中声明模板类和模板函数。在代码文件中,使用关键字export来定义具体的模板类对象和模板函数,然后在其他用户代码文件中,包含声明头文件后,就可以使用这些对象和函数了
extrern表示当修饰变量或函数时,表示其具有外部链接属性,即其既可以在本模板中使用也可以在其他模板中使用 (所有的变量声明的时候,不能设置初始值!)
final表示final修饰虚函数,表明子类不能重写虚函数
friend表示友元,使其不受访问权限控制的限制。例如在一个类中,私有变量外部是不能直接访问的,假如另外一个类或函数要访问本类的一个私有变量时,可以把这个函数或类声明为本类的友元函数或友元类,这样他们就可以直接访问本类的私有变量
inline表示内联函数,在编译时将所调用的函数代码直接嵌入到主调用函数中。各个编译器的实现方式可能不同
mutable表示突破const的限制,mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中
namespace表示C++标准程序库中的所有标识符都被定义于一个名为std的namespace中,命名空间除了系统定义的名字空间之外,还可以自己定义,定义命名空间关键字“namespace”,使用命名空间时用符号“::”指定
new表示属于操作符,可以被重载。new表示向内存申请一段新的空间,申请失败会抛出异常。new会调用operator new函数,再在operator new函数里调用malloc函数分配空间,然后再调用构造函数。delete不仅会清理资源,还会释放空间。delete会调用析构函数,其次调用operator delete函数,最后在operator delete函数里面调用free函数。malloc申请内存失败后会返回空。free只是清理了资源,没有释放空间
noexcept表示告诉编译器该函数不会抛出异常,或者该函数可能会抛出异常
operator表示和操作符连用,指定一个重载了的操作符函数。比如:operator+
override表示检查基类虚函数的重写,没有重写会编译错误
protected表示保护的,只能在本类和友元中访问
private表示私有的,只能在本类,派生类和友元中访问
public表示公有的,访问不受限制
reinterpret_cast表示允许任意指针类型之间的转换,任意整型类型和任意指针类型的转换
register表示提示编译器尽可能的把变量存入到CPU内部寄存器中(寄存器变量不能进行取地址&)
static表示可修饰变量(静态全局变量,静态局部变量),也可以修饰函数和类中的成员函数。static修饰的变量的周期为整个函数的生命周期。具有静态生存期的变量,只有在函数第一次调用时,进行初始化,在没有显示初始化的情况下,系统把他们初始化为0
static_cast表示用于相近类型的转换,如:int换double
switch表示switch语句包含了一个表达式和多个case标签。首先计算expression的值,然后将其与每个case标签的常量进行比较,如果找到匹配的case标签,将执行相应的代码块,直到遇到break语句或者switch语句结束
template表示声明一个模板,模板函数,模板类,模板的特化
this表示this是个特殊的指针,存放的是当前对象的首地址,在调用成员的时候,编译器会用this来调用成员。哪个对象调用成员函数,this指针就指向哪个对象
throw表示用于异常处理,try执行try块的起始,try块后的catch可以捕获异常,异常由throw抛出。throw在函数中还表示动态异常规范
try表示用于异常处理,try执行try块的起始,try块后的catch可以捕获异常,异常由throw抛出。throw在函数中还表示动态异常规范
typedef表示为现有数据类型创建一个新的名字,便于程序的阅读和编写。比如:typedef int bar :bar 也是类型名,是类型int的别名
typeid表示运行时获取变量类型名称,可以使用typeid(变量).name()
typename表示告诉编译器把一个特殊的名字解释为一个类型。
unsigned表示无符号数
using表示1.在当前文件引入命名空间using namespace std;2.在子类中使用,using声明引入基类成员名称
virtual表示声明虚基类,虚函数。虚函数=0时,则为纯虚函数,纯虚函数所在的类称为抽象类
volatile表示指定被修饰的对象类型的读操作是副作用(读取不能随便优化合并,适合映射I/O寄存器。1.当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中,以后再取变量值时,就直接从寄存器中取值。2.优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存到寄存器的备份。3.volatile适用于多线程应用中被几个任务共享的变量)
wchar_t表示宽字符型,表示多字节字符

6.1 关键字static

  1.修饰局部变量——称为静态局部变量
  static修饰局部变量的时候,本来一个局部变量是存放在栈区的,如果被static修饰就存储到静态区了。static修饰局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束才结束,但是作用域不变(不能在其他文件使用)。(改变的是生命周期!!,作用域不变)
  2.修饰全局变量——称为静态全局变量
  static修饰全局变量,改变了这个全局变量的链接属性,由外部链接属性变成了内部链接属性,这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了。感觉像是作用域变小了。(修饰函数,该函数只能在本文件内被访问,不能在外部其他文件直接访问)改变的是作用域!
  3.修饰函数——称为静态函数
  static修饰函数和static修饰全局变量是一样的。函数是具有外部链接属性的,但是被static修饰,就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用。
  外部进行声明函数是只需要加函数参数的类型就行了,参数加不加都行。如:extern int Add(int x, int y) 其中:x,y可写可不写
  宏和函数比较类似,定义宏则为#define Add(x,y) ((x)+(y))

const要求你不要进行写入就可以,volatile意思是你读取的时候,每次都要从内存读,两者并不冲突

七、内存分配

C/C++代码学习的时候,我们把内存大概分为3个区域:
栈区:局部变量,形式参数,临时作用的变量都在栈区。栈区上变量的特点:进入作用域创建,出了作用域销毁(还给操作系统)
静态区:动态内存分配,malloc,calloc,realloc,free
堆区:全局变量,静态变量。静态区的变量特点:创建好后,直到程序结束才销毁(还给操作系统)

八、结构体

  定义以下结构体:

struct Stu
{
	char name[20];//名字
	int age; //年龄
	char sex[5]; //性别
	char id[15]//学号
};

结构体的初始化:

//打印结构体信息
	struct Stu s = {"张三"20"男""20180101"};
//.为结构成员访问操作符 (结构体变量.成员)
	printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符 (结构体指针变量->成员)
	struct Stu *ps = &s;
	printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
>id);

结构体变量.成员
结构体指针->成员

九、指针

指针变量是用来存放地址的
32位机器上:地址是32个二进制位,这个地址要存储的话要4个字节,所以在32位机器上,指针变量的大小是4个字节。
64位机器上:地址是64个二进制位,这个地址要存储的话要8个字节,所以在64位机器上,指针变量的大小是8个字节。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值