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

智能推荐

关于打包的那些事,你必须记住的三件事,利用Python实现打包exe_49.99%的博客-程序员秘密

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理本文章来自腾讯云 作者:Python进阶者想要学习Python?有问题得不到第一时间解决?来看看这里“1039649593”满足你的需求,资料都已经上传至文件中,可以自行下载!还有海量最新2020python学习资料。点击查看1 前言嘿,各位小伙伴,晚上好呀,我相信各位小伙伴都是python的爱好者。也许我们不一定是专业的程序员,但是我们仍然可以通过代码提高我们的效率,尽量少加

计算机考研面试汇总_普通网友的博客-程序员秘密

队列:只允许在队头删除,在队尾插入的顺序表,队列先进先出eg:排队买饭栈:只允许在栈顶插入和删除的顺序表,栈后进先出。堆:堆分为小根堆和大根堆。(1)每个结点都小于它的左右孩子的值—小根堆;(2)每个结点都大于它的左右孩子的值—大根堆;堆又称为优先队列。循环队列–可以解决假溢出循环队列:牺牲一个存储单元来区分队空和队满,队空:front指针等于rear指针时;队满:(队尾指针+1)余队列长度等于队头指针;...

使用session解决动态刷新的图片验证码_标记图形验证码session_八天一吨水的博客-程序员秘密

我们在爬网站的时候经常会遇到输入图片验证码的情况使用selenium访问网页并截图进行识别找到验证码图片的地址进行访问并保存进行识别第一种方法所见即所得,模仿正常人浏览网页输入验证码的方式,但是有个缺点,使用selenium需要图形化界面,降低了访问效率。第二种方法访问效率高但是也有个致命的缺点,就是验证码是动态刷新的,每次访问验证码的url时验证码都会变化,那么我们该怎么解决呢?这里需要使用session和cookie来处理。

[转载] 程序员喝酒喝出的计算机文化_weixin_30872867的博客-程序员秘密

大家喝的是啤酒。这时你入座了。 你给自己倒了杯可乐,这叫低配置。 你给自已倒了杯啤酒,这叫标准配置。 你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。 你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。 你的同事给你倒了杯白酒,这叫推荐配置。 人到齐了,酒席开始了。 你先一个人喝了一小口,这叫单元测试。 你跟旁边的人说哥们咱们随意,这叫交叉测试。 但是...

找到你的工作意义_banbi5215的博客-程序员秘密

题目: 找到你的工作意义经文: 弗6:5–9节一 目标立足于基督二 心志立足于服侍三 眼光立足于将来讨论:人们为什么要工作? A为了实现自我内心的价值 B为了改变人们的行为和思想 C为了养家糊口 D为了回报这个社会 E 为了让我的人生变得有趣 F ...

随便推点

Python处理txt数据实例_hust_a的博客-程序员秘密

现在有一个具体的案例是这样的:CST电磁仿真软件得到一些txt数据在origin_data文件夹中。需要其中的一些数据来通过origin软件绘制曲线分析一些问题,而且需要里面的所有数据曲线显示在同一个图形中。如果通过手动将txt数据一一复制到origin(或excel)中,txt没有整列复制功能,所有手动复制很麻烦。通过Python脚本提取相关数据就比较容易了。首先分析一下txt数据格式:格式1:格

macro `AM_PROG_LIBTOOL’ not found in library_yanyanyanyan的博客-程序员秘密

apt-get install libtoolmake还是报错../../libtool: line 807: X--tag=CC: command not found../../libtool: line 840: libtool: ignoring unknown tag : command not found../../libtool: line 807: X

undefined macro: AM_CONFIG_HEADER solution_tmjdone的博客-程序员秘密

autoconf error: possibly undefined macro: AM_CONFIG_HEADERrun following command:aclocal ; autoheader; automake ; autoconf

条件编译#ifdef MACRO_A和#if defined(MACRO_A)的区别_macro ifdef_David_xtd的博客-程序员秘密

在查阅linux内核源码的过程中,发现存在两种不同类型的条件编译语句:#ifdef MACRO_A和#if defined(MACRO_A)或#if !defined(MACRO_A)#ifdef和#ifdefined()之间的区别实际上,两者并无本质的差别,但后者的应用范围更广,能支持多个预编译变量的检查。#if defined(MACRO_A) && !defined(

MySQL绘制POI的实体图_poi 画图工具类_夜看满天繁星的博客-程序员秘密

package com.kehua.framework.utils;import java.io.FileOutputStream;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.util.CellRangeAddress;import o...

unity3d远程加载资源模型到本地并加载(一)打包资源_阿帅_的博客-程序员秘密

由于模型放在远程服务器,fbx格式是不能加载的所以可以做成预设或是AssetBundle格式进行远程加载。首先打包AssetBundle资源!在unity资源文件夹下新建一下一个Editor文件夹 下方一个脚本代码如下!(代码可复制!!!) using UnityEngine; using System.Collections; using UnityEditor;public class E

推荐文章

热门文章

相关标签