【C++入门】C语言的不足之处

这篇具有很好参考价值的文章主要介绍了【C++入门】C语言的不足之处。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

C++入门主要讲的是C语言的一些不足,C++作为补充,来补充C的不足之处

C++的关键字有63个,C语言有32个(作为了解,不需要专门记)

【C++入门】C语言的不足之处,c++,开发语言

变量的命名规则:

  1. 变量名必须以字母或下划线开头。
  2. 变量名只能包含字母、数字和下划线。不允许使用其他特殊字符。
  3. 不能与关键字重名

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】全缺省:会用缺省值来初始化

【C++入门】C语言的不足之处,c++,开发语言

如果给了参数则用参数值来初始化 

【C++入门】C语言的不足之处,c++,开发语言

2】半缺省:从右向左缺省

【C++入门】C语言的不足之处,c++,开发语言

函数重载

同一作用域 形参(参数个数 类型 类型的顺序)不同 只有返回值不同是不行的

无参调用存在歧义 调用0个的时候存在歧义

【C++入门】C语言的不足之处,c++,开发语言

为什么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(不指定) 此过程中 才会去看会不会重命名(找到定义 兑现承诺) 头文件中声明代表承诺 链接的过程就是一个兑现承诺的过程

【C++入门】C语言的不足之处,c++,开发语言

error:无法解析外部符号 链接错误

一般都是缺少定义(有声明无定义) ,声明和定义不能同时赋值(缺省值),只能在声明中给缺省值,相当于将缺省参数补全了

因此C++支持函数重载而C语言不支持的原因在于:

1、C语言同名编译阶段就会报错 因为同名函数编译器不知道找哪一个

2、C++ 编译链接 g++将函数名和参数的数据类型缩写写入

windows下名称修饰规则:

【C++入门】C语言的不足之处,c++,开发语言

所有函数都要链接吗?

如果在当前文件就有定义的话 编译阶段直接(兑现承诺),不需要进行链接操作,

因为编译的时候给了定义,相当于直接兑现承诺,就不需要进行链接了。

引用

给已存变量取别名,与被引用的变量公用一块命名空间

给引用变量赋值相当于给被引用变量赋值

【C++入门】C语言的不足之处,c++,开发语言

引用的价值?

一个变量可以有多个引用,但是引用一旦有一个实体就不能引用其他实体了

引用在定义的时候必须初始化

就是取别名,认为没有开辟新的空间

注意:

1.定义时就必须初始化

2.一个变量可以有多个引用

3.但是引用一旦对应一个实体,就不能改变指向了

用引用的好处在于:

1、做参数

a、做输出型参数

输出型参数是指 形参改变会影响实参 就像swap函数用引用类型做形参,会改变实参

b、减少拷贝,提高效率

2、做返回值

a、减少拷贝,提高效率

做返回值的时候,因为出作用域变量会销毁,所以会建立一个临时变量;但是当变量不销毁(在静态区)的时候,也会建立临时变量(会不会生成临时变量,看的并不是变量出了函数会不会销毁,而是返回值类型;如果是传值返回,都会进行拷贝生成临时变量,如何不生成临时变量?)可以用引用类型作为返回值不生成临时变量,可以减少拷贝,提高运行效率

如果引用作为返回值,不需要拷贝,但是如果变量销毁了,返回的结果就不能确定了

可能情况:a、函数调用结束,函数栈帧销毁,未清理函数栈帧,结果是对的

                  b、函数调用结束,函数栈帧销毁,清理了函数栈帧,结果是错的

所以说一定要保证出了函数,变量不会销毁(仍然存在),才可以返回引用

b、获取返回值 修改返回值

【C++入门】C语言的不足之处,c++,开发语言

可以用引用实现SLAt()函数,同时实现SLGet()和SLModify()的功能,简化代码

引用权限

引用权限不可以放大,但是可以缩小/平移

const int a;
int& b=a;
//权限放大了,改变b a也会改变 但是a本身是不能被改变的
int a=10;
int& b=a;
//权限平移了,可以这么写
int m=10;
int& n=m;
const int& p=m;
//权限缩小了。可以这么写
//不能通过p来改变m,但是m本身是可以修改的
m++;//可以这么写
n++;
//m和n变了之后p也变了 

临时变量创建场景

1】带返回值的普通函数,调用结束的时候会建立栈帧,建立临时变量

2】在发生类型转换的时候会创建临时变量相同类型不会产生临时变量)

double a=1.0;
int b=a;//a发生类型转换,(截断或提升的时候)先创建临时变量

if(a>b)//比较的类型不同,会发生类型提升(一般是小的向大的提升)
{      //先生成临时变量
    swap(&a,&b);
}

引用与指针区别?

【1】从语法层面上看:

引用:不开空间,只是对变量取别名

【C++入门】C语言的不足之处,c++,开发语言

指针:开空间,开辟空间存储变量地址

【C++入门】C语言的不足之处,c++,开发语言

【2】从底层汇编指令角度来看,引用是类似于指针方式实现的

【C++入门】C语言的不足之处,c++,开发语言

auto用法

可以自动推导变量的类型

int a=1;
auto b=1+1.11;//可以根据右边表达式,自动推导出b是double类型的

cout<<typeid(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)
{
    cout<<e<<" ";
}

【C++入门】C语言的不足之处,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-703138.html

到了这里,关于【C++入门】C语言的不足之处的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】二进制文件 数据持久化(修改版)【个人复习笔记/有不足之处欢迎斧正/侵删】

             变量的本质都是二进制 ,在内存中都以字节的形式存储着,通过sizeof方法可以看到常用变量类型占用的字节空间长度( 1byte = 8bit,1bit(位)不是0就是1 )         二进制文件读写的本质: 将各类型变量转换为字节数组,将字节数组直接存储到文件中 ,不仅可以节

    2024年04月17日
    浏览(49)
  • C语言书籍——A/陷阱之处

    文章参考于文献:《C陷阱与缺陷》[美]Andrew Koening   🌈个人主页:慢了半拍 🔥 创作专栏:《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 🏆我的格言:一切只是时间问题。  ​ 目录 词法陷阱  一、= 不同于 == 二、 和 | 不同于

    2024年03月12日
    浏览(78)
  • ChatGPT和其他自然语言处理模型有什么不同之处?

    ChatGPT是一种基于变压器神经网络的自然语言生成模型,与传统的语言模型和其他自然语言处理模型相比,具有以下几个显著的不同之处: 1.能够生成连贯、长文本 传统的语言模型(如N-gram模型)通常只能生成短文本,而生成长文本时容易出现重复或不连贯的情况。而ChatGPT使

    2024年02月11日
    浏览(46)
  • 【JAVA】数据类型与变量(主要学习与c语言不同之处)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目标: 1. 字面常量 2. 数据类型 3. 变量 在上节课 HelloWorld 程序中, System.Out.println(\\\"Hello World\\\") ; 语句,不论程序何时运行,输出的都是 Hello World,其实 \\\"Hello Wo

    2024年03月28日
    浏览(48)
  • ARM-Linux开发与MCU开发的不同之处分析

    目录 一、ARM-Linux应用开发和单片机开发的不同 二、Arm-Linux基本开发环境 针对ARM-Linux程序的开发,主要分为三类:应用程序开发、驱动程序开发、系统内核开发。针对不同种类的软件开发,有其不同的特点。 今天,我们来看看ARM-Linux开发和MCU开发的不同点,以及ARM-Linux的基本

    2024年02月10日
    浏览(49)
  • Web2与Web3开发的不同之处

    Web2是引入交互功能的第二代互联网,也是我们今天所熟悉的。随着Web的不断发展,第三代互联网,也被称为Web3,正处于积极开发中。Web3引入了在区块链上运行的去中心化和无需许可的系统。但是Web2和Web3开发之间有什么区别呢?这对于从Web2转变到Web3的开发者是个契机,不仅

    2024年02月05日
    浏览(44)
  • 球从楼梯弹起的数学原理 用数学建模运动的美妙之处(教程含R语言源码)

    我最近解决了这个应用数学问题,并对答案的美妙感到非常高兴,所以我想我会分享我的解决方法。 该问题涉及一个粒子从楼梯顶部发射并逐渐向下弹跳,撞击每个台阶一次。这是我们在日常生活中见过的经典动作,因此用数学对其进行建模是一项有趣的挑战。当然,我们将

    2024年02月02日
    浏览(37)
  • 【postgresql 基础入门】多表联合查询 join与union 并,交,差等集合操作,两者的区别之处

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 ​ 开源贡献 : toadb开源库 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 入门准备 postgrersql基础架构 快速使用 初始化集群 数据库服务管理 psql客户

    2024年02月08日
    浏览(40)
  • 三分钟创建一个新应用,ivx的神奇之处【PPT式程序开发】

    像做PPT一样的可视化编程语言你想拥有吗,可以自己尝试一下。 像PPT一样的编程语言 🥭🥭点击链接,跳转到官网 IVX是一门人人都能快速掌握的可视化编程语言 🥭🥭点击立即体验进入应用创建页面 绝大部分程序员做的都是中低端代码,本身为公司提供的价值与公司不符,

    2023年04月09日
    浏览(50)
  • 从C语言到C++:C++入门知识(2)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关C++的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 目录 前言: 1. 函数重载

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包