C语言变量的上限,C语言C 同台PK,你这辈子都很难知道的7个语法细节_木叶小队长的博客-程序员秘密

技术标签: C语言变量的上限  

都说C++是C语言的升级版

但C可就不服了

凭啥多了两个+号就比我强?

168395510_1_20190813060838629

C语言/C++

那问题在于C语言和C++技术哪家强?比比就知道啦,今天我们就隆重邀约两位大佬同台PK,为了此次PK,专门设置了7个环节,这7个语法细节,估计这里不说,你可能都很难发现。

1.变量声明

在C语言中,变量的使用需要进行前置声明。

C++ 强调的是实用性,可以在需要使用的时候再定义

例如我们经常用到的for循环的变量定义:

168395510_2_20190813060838754

C语言/C++

2.register关键字

在C语言中,register关键字用于将局部变量存储到寄存器中去。

C++中依然支持register关键字,但是它有自己的优化策略,即使不加register,编译器也会自动判断是否需要将变量放入寄存器中,register关键字只能起到申请的作用,具体能不能到寄存器中,编译器自有判断。

总之,在C++中可以废除register关键字的使用了!

168395510_3_20190813060838863

C语言/C++

3.变量名限制

在C语言中,定义多个同名变量是合法的,这些全局变量最终都被链接到全局存储区的同一地址空间

这点有点不可思议吧,其实这个问题不仅在C语言出现,包括目前前端界的大佬——javascript也有这种现象!

在C++中,不允许定义多个同名变量

168395510_4_20190813060838972

C语言/C++

4.const关键字

C语言对const关键字的理解只能是只读变量

C++对const理解才是真正意义上的常量。

为什么这么说,对const关键字理解,在这里就不得不花点篇幅来探讨一下了,先来看下面的案例,感受一下同样的代码,为啥在不同环境得到的结果会不一样:

168395510_5_2019081306083997

C语言/C++

这段代码的原理和之前讲述封装性一样,我们不能直接修改const变量的值,但是可以试图通过指针这个工具,骗过编译器的语法检查,最终能否修改到const变量的值呢?

C编译器成功被“骗”了,而C++编译器却没有,这说明了什么呢?

这里就要先解释一下,什么才叫真正意义上的常量,在内存空间中,确实是有一块常量存储区专门保存常量值的,操作系统也会对该区域进行管理,不允许程序做任何修改。那怎样的变量会落入这块区域呢?只有代码中的字面量,才会成为常量存入这块区域内,那也就是说,真正意义上的常量,只能是硬编码写死的那些字面量了!

168395510_6_20190813060839207

C语言/C++

(尝试修改常量值,发生栈错误)

如此一来,C++编译器到底是如何将const变量变成真正意义上的常量呢?那么只有一种可能,就是转化为字面量了!到底是不是这样呢?我们再来看一个现象:

168395510_7_20190813060839332

C语言/C++

可以发现C认为const变量仍然是变量,因此不能初始化数组大小,而C++ 则会将其转为字面量,因此可以初始化数组大小了。

C++ 在编译const的时候,会生成一个常量表,专门用于记录常量,在往下编译的过程中,发现使用变量的地方恰好在常量表里面有定义,会将const变量改为字面量,从而成为真正意义上的常量了!

168395510_8_20190813060839457

C语言/C++

168395510_9_20190813060839597

C语言/C++

(1).具有volatile修饰的变量

volatile含义即告知编译器不要对该变量进行优化,这种属于自我放弃,可以理解

168395510_10_20190813060839738

C语言/C++

(2).作为类成员变量或静态变量的情况

类作为抽象意义存在,本身不能给成员变量赋初值,因此这种情况就属于强人所难了。先来看作为成员变量的情况,作为静态变量的情况分析,那就得放另外一篇单独来说

168395510_11_20190813060839847

C语言/C++

对此,也不能为难编译器了,因为编译器在编译const变量时并不知道具体值,常量的具体值要等对象创建出来才知道,因此就无法生成常量表,也就只能当只读变量来看待啦!

168395510_12_20190813060839972

C语言/C++

好了,花了点篇幅,把常量讲了一通,回过头来继续吧:

5.struct类型

在C语言中struct是一个结构体,声明需要带上struct关键字。

在C++中struct就是个类,直接用类名声明即可。

168395510_13_2019081306084097

C语言/C++

6.函数类型

在C语言中,函数参数和返回值什么都不写,默认返回int类型,接受任意参数。

在C++中不允许这样,参数列表不写就是void,返回值类型不允许不写!

168395510_14_20190813060840269

C语言/C++

7.三目运算符

在C语言中,三目运算符是不能作为左值的。

在C++中,三目运算符可以作为左值使用,但是如果可能的返回值有一个是常量,就不能作为左值了。

168395510_15_20190813060840457

C语言/C++

好了,这7个语法细节内容也就到这里了,当然C++在升级的过程中肯定也不止这么7个细节,不过即使不知道,但也足够你用了!

168395510_16_20190813060840597

C语言/C++

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36328790/article/details/117106645

智能推荐

【论文翻译|2020】A Survey on Heterogeneous Graph Embedding: Methods, Techniques, Applications and Sources_hgnn 归纳式学习_林若漫空的博客-程序员秘密

这里写目录标题摘要1 引言2 定义2.12.2 HG嵌入的异构性挑战三级目录摘要异构图(HGs)又称异构信息网络,在现实世界中无处不在;因此,HG嵌入的目的是在低维空间学习表示,同时保留下游任务的异构结构和语义(如节点/图分类、节点聚类、链接预测),近年来受到了相当大的关注。本文就异构图嵌入方法和技巧的研究进展进行综述。我们首先介绍了HG方法进行了详细的介绍,并进一步分析了其优缺点;同时,我们也首次探索了不同类型HG嵌入方法在现实工业环境中的转换性和适用性。此外,我们进一步介绍了几个广泛部署的系统,这些

C++面向对象知识点二:构造函数与析构函数_嘉木空青的博客-程序员秘密

 目录类的构造函数类的析构函数调用构造函数和析构函数的时机(对象的生存周期)缺省构造函数与缺省析构函数类的构造函数功能:在创建类的新对象时,由系统自动调用,用给定的值对数据成员初始化 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回void 构造函数可以重载 一般将构造函数定义为公有成员函数 不可以通过对象名调用构造函数,即的d1.Date...

self._traceback = tf_stack.extract_stack()报错_小粽子~的博客-程序员秘密

self._traceback = tf_stack.extract_stack()报错WARNING:tensorflow:From main.py:62: The name tf.app.run is deprecated. Please use tf.compat.v1.app.run instead.WARNING:tensorflow:From main.py:51: The name tf.Session is deprecated. Please use tf.compat.v1.Ses

spring in action小结3 运行时值注入_diaolong123123的博客-程序员秘密

讨论依赖注入的时候,通常讨论的是一个bean引用注入到另一个bean的属性或者构造器参数中。bean装配的另一个方面是将值注入到bean的属性或者构造器参数中。避免硬编码的方式就是运行时确定值。spring解决办法是1)属性占位符2)spring语言表达式(SpEL)@PropertySource(“”)注解标注属性源装配属性的方法1)使用Environment...

Axure 进阶 | 制作携程网酒店“入住日期”与“退房日期”控件_携程酒店商家怎么修改退房时间_陪学的博客-程序员秘密

​本次教程学习制作时间控件选择,根据选择的日期,在输入框中显示所选择的日期。制作内容包括携程网的酒店“入住日期”时间控件与“退房日期”时间控件。部件使用:动态面板、图片、矩形、文本框(单行)、单行文本、垂直线;交互事件:鼠标点击时、获得焦点时;动作:设置面板状态为指定状态、设置部件显示/隐藏、设置文本;时间控件交互描述:常用于选择日期。如酒店入住与退房日期选择,旅游出发日期,日程安排等场景。步骤1:新建文档新建文档,并点击“文件>保存”,保...

浅谈iOS中音频的开发_fhh_love的博客-程序员秘密

我对音频技术不是很精通,但我对这方面也比较有兴趣,公司以前的项目用到这方面的技术不多。我只是粗略的涉猎没有深入研究。今天就研究一下写一篇博客。同时希望以后能做一个关于音频的项目也期望能接触到关于音频开发技术的大牛。  随着移动互联网的发展,智能手机功能越来越丰富。播放音乐、视频、录音、拍照等都是很常用的功能。在iOS中对于多媒体的支持是非常强大的,今天的文章中将会对音频进行介绍。  在iO

随便推点

(2021总结篇)面向对象软件设计模式(二十)状态模式_软件开发中对象的状态_zhangxiaoxiao9527的博客-程序员秘密

处理对象的多种状态及其互相转换--状态模式状态模式的意图,解决的问题,什么时候使用1.状态模式2.状态模式中的角色3.状态模式优缺点、使用场景优点:缺点:适用场景:状态模式的意图,解决的问题,什么时候使用在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态就会发生改变,从而使其行为也发生改变。如人都有高兴和伤心的时候,不同的情绪有不同的行为,当然外界也会

Android6.0电话流程相关_android imssenderrxr_Flutter萌新学院的博客-程序员秘密

主要内容1. Call涉及的目录结构及框架结构2. InCallUI层的基本架构(所涉及的Presenter、Fragment及Activity)3. Call的几种状态(对应phone状态)及上报流程4. GSM与IMS MO流程的差异5. 分析问题的常用log希望你在看完本篇以后能够:1.快速找到Call界面某个小时内容对应的

前端笔记:vue组件间传值_前端组件传值_HintonZhang的博客-程序员秘密

1. 父子组件间传值(props):1.1 父组件向子组件传值1.1.1 静态定义子组件,在组件中注册props<template> <div> <div>{{message}}(子组件)</div> </div></template> <script>export default { props: { message: String //定义传值的类型<br&gt

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)_TIMOLEI的博客-程序员秘密

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)         使用SSM(Spring、SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方。之前没有记录SSM整合的过程,

python学习笔记7-读取pdf并输出到excel_虚幻时空的博客-程序员秘密

遇到个需求要读取pdf里面的内容,看看能不能整,百度了下可以用pdfminer。参考:https://jingyan.baidu.com/article/ceb9fb10a5da888cad2ba03b.html按照上面的装好,

基于linux下的shell的文本处理_shell 文本文件处理_ε柠栀的博客-程序员秘密

1,grep:全面搜索研究正则表达式并显示出来 • grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模 式”对目标文本进行匹配检查 , 打印匹配到的行,由正则表达式或者字符及基本文本字符所编写的过滤条件grep (过滤)全面搜索研究正则表达式并显示出来 grep root passwd 将所有含有root的行显示出来gerp ^root...