C++兼容C,在C的基础上学习C++是一个不错的选择,也能够更好的了解C与C++的区别与联系。

变量定义

C语言中的变量都必须在作用域开始的位置定义

C++中更强调语言的实用性,所有的变量都可以在需要使用时再定义

int main()
{
int i = 0;
printf("test");
int j;
system("pause");
return 0;
}

register

请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率

register说明

是尽可能,不是绝对,怎么处理取决于CPU

register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。

e.g.(内存拷贝代码)

#ifdef NOSTRUCTASSIGN
memcpy (d, s, l)
{
register char *d;
register char *s;
register int i;
while (i--)
*d++ = *s++;
}
#endif

register注意事项

  1. register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数
  2. 因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址
  3. 在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销

C++对register的增强

  1. C语言中无法取得register变量地址,在C++中依然支持register关键字,C++编译器有自己的优化方式,不使用register也可能做优化,C++中可以取得register变量的地址
  2. C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效
  3. 早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充
int main22()
{
register int a = 0;
printf("&a = %x\n", &a);
system("pause");
return 0;
}

函数检测

在C语言中,重复定义多个同名的全局变量是合法的

C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上

int g_var;
int g_var = 1;

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

C++直接拒绝这种二义性的做法

struct类型

C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型

C++中的struct是一个新类型的定义声明,并且在C++中,允许在struct中定义函数。

struct Student
{
char name[100];
int age;
}; int main(int argc, char *argv[])
{
Student s1 = {"wang", 1};
Student s2 = {"wang2", 2};
return 0;
}

C++中所有的变量和函数都必须有类型

C++中所有的变量和函数都必须有类型

C语言中的默认类型在C++中是不合法的

以下源代码在C语言中是合法的,而在C++中则是非法的

f(i)
{
printf("i = %d\n", i);
} g()
{
return 5;
} int main(int argc, char *argv[])
{ f(10);
printf("g() = %d\n", g(1, 2, 3, 4, 5));
getchar();
return 0;
}

在C语言中:

  1. int f();表示返回值为int,接受任意参数的函数
  2. int f(void);表示返回值为int的无参函数

在C++中

int f()和int f(void)具有相同的意义,都表示返回值为int的无参函数

C++更加强调类型,任意的程序元素都必须显示指明类型

三目运算符

C语言返回变量的值 C++语言是返回变量本身

C语言中的三目运算符返回的是变量值,不能作为左值使用

C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方

三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用

int main()
{
int a = 10;
int b = 20; //返回一个最小数 并且给最小数赋值成30
//三目运算符是一个表达式 ,表达式不可能做左值
(a < b ? a : b )= 30;
printf("a = %d, b = %d\n", a, b); system("pause");
return 0;
}

其本质可以理解为

*(a < b ? &a : &b ) = 30;

增加了bool类型

C++在C语言的基本类型系统之上增加了bool

C++中的bool可取的值只有true和false

理论上bool只占用一个字节

如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现

true代表真值,编译器内部用1来表示

false代表非真值,编译器内部用0来表示

bool类型只有true(非0)和false(0)两个值

C++编译器会在赋值时将非0值转换为true,0值转换为false

int main(int argc, char *argv[])
{
int a;
bool b = true; printf("b = %d, sizeof(b) = %d\n", b, sizeof(b)); b = 4;
a = b;
printf("a = %d, b = %d\n", a, b); b = -4;
a = b;
printf("a = %d, b = %d\n", a, b); a = 10;
b = a;
printf("a = %d, b = %d\n", a, b); b = 0;
printf("b = %d\n", b); system("pause");
return 0;
}

C++学习笔记-C++对C语言的扩充和增强的更多相关文章

  1. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  2. cips2016+学习笔记︱简述常见的语言表示模型(词嵌入、句表示、篇章表示)

    在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的"词向量"(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一 ...

  3. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  4. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  5. sqlite学习笔记7:C语言中使用sqlite之打开数据库

    数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...

  6. 【学习笔记】【C语言】关系运算符

    1. 条件判断 默认情况下,我们在程序中写的每一句正确代码都会被执行.但很多时候,我们想在某个条件成立的情况下才执行某一段代码 这种情况的话可以使用条件语句来完成,但是我们暂时不学习条件语句,先来看一 ...

  7. go 学习笔记之初识 go 语言

    Go 是一种开源编程语言,可以轻松构建简单,可靠,高效的软件. 摘录自 github: https://github.com/golang/go,其中官网(国外): https://golang.or ...

  8. 【C语言学习笔记系列】C语言编程狼追兔子问题代码解析!

    问题描述 一只兔子躲进了10个环形分布的洞中的一个.狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找:也没有找到,就隔2个洞,到第6个洞去找:以后每次多一个洞去找兔子--这样下去,如果一直找不到 ...

  9. 【学习笔记】【C语言】位运算

    1. & 按位与 1> 功能 只有对应的两个二进位均为1时,结果位才为1,否则为0. 2> 举例: 比如9&5,其实就是1001&101=1,因此9&5=1 ...

随机推荐

  1. XMl特殊字符转换参考

    参考链接:https://blog.csdn.net/goon_star/article/details/49636505 处理SVG Text元素不能正确显示特殊字符 特殊符号 命名实体 十进制编码 ...

  2. 【bug解决】ios微信浏览器中背景音乐无法播放

    我记得之前在一次项目中,出现过浏览报错: 当时的文档链接如右:[解决]HTML5新标签audio的autoplay自动播放属性失效的解决方案 所以在这次H5的制作中,我使用了iframe来加载音频文件 ...

  3. Codevs 4373 窗口(线段树 单调队列 st表)

    4373 窗口 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只 ...

  4. 圆桌游戏(区间DP)

    2.圆桌游戏 (game.cpp/c/pas) [问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<=i<=n的i来说,i号的左边是i ...

  5. 2019牛客暑期多校训练营(第一场)H 线性基+计算贡献

    题意 给n个整数,求满足子集异或和为0的子集大小之和. 分析 将问题转化为求每个元素的贡献次数之和. 先对n个数求线性基,设线性基大小为r,即插入线性基的数字个数为r,可以分别计算线性基内数的贡献和线 ...

  6. Apache 服务器 首次访问特别慢的解决过程,php环境

    一台服务器之前装的是java的tomcat apache 项目, 后面装了个phpstudy 在上面,访问php项目发现 浏览器首次打开网页需要7-8秒,打开成功后连续访问都很快,过一段时间访问又是7 ...

  7. 「CSA Round #41」BFS-DFS

    题目链接 戳我 \(Description\) 给出一个图的\(bfs\)序和\(dfs\)序,构造出一个满足条件的图,边的扫描顺序为读入顺序 \(Solution\) 这个题还是很简单的. 先来看看 ...

  8. VirtualBox更改虚拟硬盘 VDI文件空间大小的方法

    cmd执行 C:\Oracle\VirtualBox\VBoxManage.exe modifyhd

  9. 实验四《Android程序设计》实验报告封面

    实验四<Android程序设计>实验报告封面 课程:Java程序设计 班级:1753班 姓名:许钰玮 学号:20175329 指导教师:娄嘉鹏 实验日期:2019年5月13日 实验时间:1 ...

  10. nodejs本版问题

    接到一个新项目,前端用的是VUE,这就需要安装nodejs.记得之前安装的是V6.X,在npm install加载依赖库node_modules的时候ant-design-vue总是报错.看到同事用n ...