绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
C语言C++同台PK,你这辈子都很难知道的7个语法细节
2019-12-04 15:08:34

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

但C可就不服了

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

C语言/C++

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

1.变量声明

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

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

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

C语言/C++

2.register关键字

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

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

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

C语言/C++

3.变量名限制

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

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

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

C语言/C++

4.const关键字

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

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

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

C语言/C++

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

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

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

C语言/C++

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

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

C语言/C++

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

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

C语言/C++

C语言/C++

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

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

C语言/C++

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

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

C语言/C++

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

C语言/C++

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

5.struct类型

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

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

C语言/C++

6.函数类型

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

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

C语言/C++

7.三目运算符

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

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

C语言/C++

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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

IT知识联盟
创建时间:2019-07-05 15:30:45
分享收集到的大小知识点
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 王超
    栈主

小栈成员

查看更多
  • ?
  • youou
  • gamebus
  • chinacc
戳我,来吐槽~