Asp做网站前期准备,最好看的网站模板,棋牌游戏开发出售,公司网站需要备案概要
C入门主要讲的是C语言的一些不足#xff0c;C作为补充#xff0c;来补充C的不足之处
C的关键字有63个#xff0c;C语言有32个#xff08;作为了解#xff0c;不需要专门记#xff09; 变量的命名规则#xff1a;
变量名必须以字母或下划线开头。变量名只能包含字…概要
C入门主要讲的是C语言的一些不足C作为补充来补充C的不足之处
C的关键字有63个C语言有32个作为了解不需要专门记 变量的命名规则
变量名必须以字母或下划线开头。变量名只能包含字母、数字和下划线。不允许使用其他特殊字符。不能与关键字重名
C语言中有命名冲突的问题(与库函数或者工程里的其他变量/函数名发生冲突)因此就引出了命名空间的概念。
ps:前面的文章有专门讲过命名空间这里就不再重复介绍辣可以去翻翻之前的文章
输入输出
istream 输入流
ostream 输出流
而C中常用到的cin和cout就分别是istream和ostream的对象
cin 流提取运算符 输入
cout 流插入运算符 输出
cout 可以自动识别类型但是是基于函数重载基础上的后面会说到函数重载
类库提供的头文件中已经对“”和“”进行了重载使之作为流插入运算符和流提取运算符能用来输出和输入C标准类型的数据。
本质是在补充C语言的不足 对全局的变量函数类型进行封装防止引发冲突
也可以去库函数中查询相关资料
C官网en.cppreference.com/w/
C的输入输出比scanf/ printf要慢一点点 why?
因为C会同步C语言会检查C语言的错误如果希望快一点可以选择关闭同步C语言或者使用scanf / printf
缺省参数(默认参数)
注意
1传参是从左往右传参 缺省是从右向左缺省
2缺省参数应该在声明的时候给缺省值定义给缺省值没有实际意义这样在传参的时候会转化到对应参数个数
3必须是常量或者全局变量
1】全缺省会用缺省值来初始化 如果给了参数则用参数值来初始化 2】半缺省从右向左缺省 函数重载
同一作用域 形参(参数个数 类型 类型的顺序)不同 只有返回值不同是不行的
无参调用存在歧义 调用0个的时候存在歧义 为什么C支持函数重载 答与函数名修饰规则有关 以及 编译链接过程有关
三个文件Stack.h Stack.c test.c
预处理 头文件展开 宏替换 去除注释 条件编译 .i 最后生成Stack.i test.i
编译 语法检查 生成对应汇编代码 .s 最后生成 Stack.s test.s
汇编 xor逻辑异或 cpu是不认识汇编代码的只识别二进制。需要把汇编代码转换成二进制机器码 .o目标文件 最后生成 Stack.o test.o
链接 可执行程序 .exe /a.out(不指定) 此过程中 才会去看会不会重命名(找到定义 兑现承诺) 头文件中声明代表承诺 链接的过程就是一个兑现承诺的过程 error:无法解析外部符号 链接错误
一般都是缺少定义(有声明无定义) 声明和定义不能同时赋值(缺省值)只能在声明中给缺省值相当于将缺省参数补全了
因此C支持函数重载而C语言不支持的原因在于
1、C语言同名编译阶段就会报错 因为同名函数编译器不知道找哪一个
2、C 编译链接 g将函数名和参数的数据类型缩写写入
windows下名称修饰规则 所有函数都要链接吗
如果在当前文件就有定义的话 编译阶段直接(兑现承诺)不需要进行链接操作
因为编译的时候给了定义相当于直接兑现承诺就不需要进行链接了。
引用
给已存变量取别名与被引用的变量公用一块命名空间
给引用变量赋值相当于给被引用变量赋值 引用的价值
一个变量可以有多个引用但是引用一旦有一个实体就不能引用其他实体了
引用在定义的时候必须初始化
就是取别名认为没有开辟新的空间
注意
1.定义时就必须初始化
2.一个变量可以有多个引用
3.但是引用一旦对应一个实体就不能改变指向了
用引用的好处在于
1、做参数
a、做输出型参数
输出型参数是指 形参改变会影响实参 就像swap函数用引用类型做形参会改变实参
b、减少拷贝提高效率
2、做返回值
a、减少拷贝提高效率
做返回值的时候因为出作用域变量会销毁所以会建立一个临时变量但是当变量不销毁在静态区的时候也会建立临时变量会不会生成临时变量看的并不是变量出了函数会不会销毁而是返回值类型如果是传值返回都会进行拷贝生成临时变量如何不生成临时变量可以用引用类型作为返回值不生成临时变量可以减少拷贝提高运行效率
如果引用作为返回值不需要拷贝但是如果变量销毁了返回的结果就不能确定了
可能情况a、函数调用结束函数栈帧销毁未清理函数栈帧结果是对的 b、函数调用结束函数栈帧销毁清理了函数栈帧结果是错的
所以说一定要保证出了函数变量不会销毁仍然存在才可以返回引用
b、获取返回值 修改返回值 可以用引用实现SLAt()函数同时实现SLGet()和SLModify()的功能简化代码
引用权限
引用权限不可以放大但是可以缩小/平移
const int a;
int ba;
//权限放大了改变b a也会改变 但是a本身是不能被改变的
int a10;
int ba;
//权限平移了可以这么写
int m10;
int nm;
const int pm;
//权限缩小了。可以这么写
//不能通过p来改变m但是m本身是可以修改的
m;//可以这么写
n;
//m和n变了之后p也变了 临时变量创建场景
1】带返回值的普通函数调用结束的时候会建立栈帧建立临时变量
2】在发生类型转换的时候会创建临时变量相同类型不会产生临时变量)
double a1.0;
int ba;//a发生类型转换截断或提升的时候先创建临时变量if(ab)//比较的类型不同会发生类型提升一般是小的向大的提升
{ //先生成临时变量swap(a,b);
}
引用与指针区别
【1】从语法层面上看
引用不开空间只是对变量取别名 指针开空间开辟空间存储变量地址 【2】从底层汇编指令角度来看引用是类似于指针方式实现的 auto用法
可以自动推导变量的类型
int a1;
auto b11.11;//可以根据右边表达式自动推导出b是double类型的couttypeid(b).name()endl;//输出变量的数据类型
以后学到迭代器之后代码会很长写起来比较麻烦所以用aoto较为简便
注意
1、auto不能做函数参数
void Test(auto a)//这种写法是错误的
{,,,
}
2、不能直接声明数组
void test()
{auto b[]{1,2,3,4};//这也是错误的
}
范围for语法糖
//自动推导类型依次取出数组中元素赋值给e自动迭代和判断结束
int arr[10]{1,2,3,4,5,6,7,8,9,0};for(auto e:arr)
{coute ;
}