说到C++和C语言的区别,大部分人都会想到面向对象和面向过程。然而这种说法并不准确。面向对象和面向过程指的是两种不同的程序设计思想,而C++与C是两种编程语言,难道C++就不能用于面向过程去解决问题吗,当然可以。而面向对象的设计思想也可以用到C语言中去,我之前的文章就涉及过这方面的知识。

我们这个系列就是要抛开编程思想,单纯地从语法的角度介绍一下C++中究竟加入了哪些C语言中没有的功能。希望大家在掌握了C语言之后再来学习这部分内容。

首先,让我们看一段标准的C++代码:

    // main.cpp
#include <iostream> using namespace std; int main()
{
cout << "Hello World!" << endl; return 0;
}

这个是一个最基本的程序,用来在屏幕上打印出“Hello World”这句话。是不是和C语言程序差距较大呢?今天,我们先介绍C++和C语言的几个最基本的不同。

1. 头文件

C语言中,标准输入输出的头文件引用方式如下:

#include <stdio.h>

而C++中使用的是:

#include <iostream>

C++规定,由系统提供的头文件在引用时不带“.h”。如果是自己定义的头文件,需要这样引用:

#include "myfile.h"

注意,这里不仅使用了“.h”而且还用了双引号。原因和C语言相同,从当前路径开始寻找。另外,由于C++是完全支持C语言的全部功能的,所以当我们要使用C语言提供的头文件时,依然要使用:

#include <stdio.h>

这样定义的好处是,我们只看头文件的包含形式就知道引用的是C++的系统库还是C语言的系统库,亦或是自定义函数库。

2. 命名空间

大家肯定注意到这句话了:

using namespace std;

这句话的意思是引入命名空间std,我们输出字符串使用的cout关键字就在std中。C++库中的函数被划分到不同的命名空间中,如果需要访问,就要先使用这句话引入命名空间。

假如我们没有写这句话,就要在每次使用到这些函数时手动指定命名空间,之前的代码就要变成这样:

// main.cpp
#include <iostream> int main()
{
std::cout << "Hello World!" << std::endl; return 0;
}

这样写是合法的,只不过有些麻烦。

3. C++的输入输出

C++的输入输出做了较大的修改,我们先看下面这个例子:

#include <iostream>

using namespace std;

int main()
{
int a, b; cout << "Please input two numbers : " << endl; cin >> a >> b; cout << "a = " << a << ", " << "b = " << b << endl; return 0;
}

这个程序实现了输入两个数字,之后把它们打印在屏幕上。程序的执行结果如下:

  • cin

相当于scanf,用于把输入的字符保存在后面的变量中。cin必须和>>一起使用,需要输入几个变量就写几个变量,之间用>>分隔开。

  • cout

相当于printf,用于把字符串或变量打印在屏幕上。需要打印的元素要用<<分隔开,endl表示换行。

这两个关键字最大的优势是不需要关注变量的数据类型,C++会根据变量的定义自动匹配合适的数据类型。

使用这两个关键字时必须包含<iostream>这个库。

4. 变量的定义

C语言中有个被很多人诟病的规定是变量的定义必须放在代码块的首部。这样就会经常出现变量的定义和第一次使用之间距离很远,比如下面这段代码。

int main()
{
int i, j; // Do something for (i = 0; i < 100; i++)
{
printf("%d\n", i);
} return 0;
}

这段代码中,变量i的声明和第一次使用之间可能隔了几十行的代码。这样严重影响了代码的可读性,也提高了调试的成本。

在C++中,这种情况本根本地解决了。C++允许在任何地方定义变量,只要在使用它之前就行。于是就有了这样的写法:

for (int i = 0; i < 100; i++)
{
// Do something
}

这样写是不是变得非常清楚了。在C++中,我们习惯在使用变量时定义,很多只会用C语言的程序员也在使用.cpp文件写代码就是为了有这么一个便利条件。

5. 一定要先学C再学C++吗

虽然我是带大家先学C语言再学C++的,很多程序员也都是走的这个学习路线。但并不是一定要先学C再学C++。

我总是用这么个例子来解释这个问题。C和C++就仿佛是手动挡和自动挡的区别,虽然我们大部分人都是先学手动挡再学自动挡,但并不能说不会开手动挡的人就学不会自动挡。自动挡其实还更好学一些。对于驾驶这两种车而言,它们有很多相同的部分,比如打方向的方法、踩油门和刹车的方法、打转向灯的方法、转弯并线等等这些要点都是相同的,只不过你先学哪个就在那里学习这些公共部分而已。

C和C++也是一样,80%以上的语法点都是相同的,而这些语法点你是通过哪种语言学会的没有任何区别。

大部分学校安排课程的时候都是先学C再学C++,因为C更关注细节,能够帮助学生更清晰地了解程序和硬件的一些关系,人们认为只要这么学才能打下好的基础。但随着计算机编程技术的不断发展,如今更流行的观点是编程就是为了帮助我们更好地使用计算机解决问题,以这个目的为导向,那些没必要知道的东西可以不去在意。于是越来越多的人用C++、Java、甚至Python这样远离硬件的语言进行编程入门。这些人依然可以设计出自己想要的程序

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
639368839,我们一起学C/C++!

C语言到C++(1) - 基本变化的更多相关文章

  1. 转一篇分析C语言调用时栈的变化的好文

    http://blog.csdn.net/zsy2020314/article/details/9429707

  2. 《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍

    这算是本系列文章的一个序吧,主要是为以后的学习做铺垫,文本分为三个部分,第一部分是对于网上一些比较旧的资料的问题的一些更正,当然我也不可能看过所有的资料,难免会有遗漏.第二部分是D语言最基本的规定,第 ...

  3. 多语言架构下如何正确的使用SQL视图

    产品的定位 做产品的都知道,是否支持多语言直接影响到产品的定位问题. 如果一个产品周期是一年的话,要完美支持多语言最少也得在加3个月!所需时间和页面数量.数据库表的数量和表的数据量成正比. 可以看出代 ...

  4. [改善Java代码]易变业务使用脚本语言编写

    建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...

  5. Java的语言特点详解

    1)简单性:java从C++简化而来,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的.java还剔除了C++操作符过载和指针操作. 2)面向对象:java是一个面向对象的语 ...

  6. ElasticSearch 2 (23) - 语言处理系列之词根提取

    ElasticSearch 2 (23) - 语言处理系列之词根提取 摘要 世界上大多数语言都是屈折变化的,意思是词语可以通过变形来表达不同的含义: 数(Number): fox, foxes 时态( ...

  7. C语言程序员必读的5本书

    本文由 伯乐在线 - programmer_lin 翻译自 fromdev.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 你正计划着通过看书来学习C语言吗?“书籍是人类最忠诚的朋友“.海明威一定 ...

  8. Go语言设计模式实践:迭代器(Iterator)

    关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...

  9. Go语言设计模式实践:组合(Composite)

    关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...

随机推荐

  1. 自定义input默认placeholder样式

    input::input-placeholder { color: #fb4747; } input::-webkit-input-placeholder { color: #fb4747; } in ...

  2. 简单的后台数据和前台数据交互.net

    最近忙着做POS项目,心血来来潮写了点小项目. 更具要求是随机显示数据并且产生的数据是可以控制的.前台交互显示能够倒叙,切每次只显示一条,页面不能超过20条超过的部分做删除. 我先展示一下前台的代码, ...

  3. 进程间通信系列 之 命名管道FIFO及其应用实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  4. 页面性能优化的利器 — Timeline

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 陈泽钦,腾讯移动客户端工程师,目前就职于腾讯MIG移动互联网事业群,负责腾讯浏览服务TBS的X5内核业务. 1 ...

  5. codeforces 803B Distances to Zero

    Distances to Zero 题目链接:http://codeforces.com/problemset/problem/803/B 题目大意: 给一串数字,求每个数字到离他最近数字0的距离.. ...

  6. OC的内存管理(一)

    在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...

  7. js闭包绑定元素

    闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状 ...

  8. Thinkphp与CI的区别

    深入学习一门新技术的最好方法就是看官方文档. ThinkPHP5.0文档: http://www.kancloud.cn/manual/thinkphp5/118003 官方的说辞是: 主要特性 : ...

  9. iOS 伐码猿真爱—「偷懒 || 效率 工具类」

    自检 代码不会可以多敲几次,学习的重点是思想:-- 认同. BUT 如果你把自己会的.熟知的.可以说写的似流水的代码,不管是在工作 或是 自学习中你还是一点一点的敲出来,是不是有点...,copy & ...

  10. POJ1012-Joseph数学

    题目链接:http://poj.org/problem?id=1012 题目大意: 约瑟夫环的一个扩展,2*k个人围一圈,前k个是好人,后k个是坏人.报到m的人就要死掉,然后重新开始报数.要求的是最小 ...