C语言和C++的区别整理详解!

c和c++主要区别

根据书中的描述,进行了整理

推荐一个我自己的C/C++交流裙815393895

1、 源代码文件的扩展名

摘自1.4.1

C++实现源代码文件的扩展名UNIXC、cc、cxx、cGNU C++C、cc、cxx、cpp、c++Digital Marscpp、cxxBorland C++cppWatcomcppMicrosoft Visual C++cpp、cxx、ccFreestyle Code Warriorcp、cpp、cc、cxx、c++

另外UNIX系统上的C程序的扩展名为.c

2、变量定义

摘自2.2.1

c语言中,所有的局部变量必须在函数或复合语句开始位置,c++没有这个限制。

void main()

{

int a; //define variable a

int b; //define variable b

a = 10;

printf("a=%d \n", a);

b = 11;

printf("b=%d \n", b);

{

int temp = 0;

printf("test variable in processing\n");

}

}

注释:

a、局部变量a和b位于函数开始位置,变量temp位于复合语句的开始位置。

b、复合语句(摘自5.1.10):使用两个花括号来构造一条复合语句(代码块)。代码块由一对花括号和它们包含的语句组成。

3、 auto

摘自3.4.5

c语言中, auto用于声明变量为自动变量,auto修饰符的定义里有这么一句“进入包含变量声明的代码时,变量开始存在。当程序离开这个代码块时,自动变量消失了。它所占用的内存可用来做别的事情。”,从“当程序离开代码块时变量消失”、“内存可用来做别的事情”可以推出auto修饰的变量是存储在堆栈中的。而全局变量存储在静态存储区中,所以用auto决不能修饰全局变量。

C++11标准引入auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型

与原来那些只对应一种特定类型的说明符不同,auto让编译器通过初值来推算变量类型。显然,auto定义的变量必须要有初始值。

auto i=0,*p=&i; //正确,i是整数,p是整形指针

4、stuct

摘自4.4

在C语言中, struct类型的定义必须加上struct的前缀

struct opt {

int len;

int value;

};

void main()

{

struct opt tmp;

tmp.len = 1;

tmp.value = 2;

}

而在C++中,struct可以直接使用其类型名来定义

#include <iostream>

struct opt {

int len;

int value;

};

int main()

{

opt tmp;

tmp.len = 1;

tmp.value = 2;

std::cout<<tmp.len<<std::endl;

std::cout<<tmp.value<<std::endl;

return 0;

}

相比之下,C++的语法更简洁一些。所以在用C语言编写代码的时候,C程序员通常是这么来定义的struct的。在下面的代码中,使用typedef来定义一个opt的类型

typedef struct _opt {

int len;

int value;

}opt;

void main()

{

opt tmp;

tmp.len = 1;

tmp.value = 2;

}

5、stuct初始化

推荐一个我自己的C/C++交流群 815393859

摘自4.4.2

与数组一样,c++11也支持将列表初始化用于结构,且等号(=)是可选的:

opt tmp {1, 2};

其中不允许缩窄转换,例如:

opt tmp {1.0, 2};

编译报错:

error: narrowing conversion of ‘1.0e+0’ from ‘double’ to ‘int’ inside { }

c语言可以使用列表初始化,但是等号(=)是必须的。

opt tmp = {1,2};

6、枚举的取值范围

摘自4.6.2

c++现在通过强制类型转换,增加了可以赋值给枚举变量的合法值。

每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数赋值给枚举变量,即使这个值不是枚举值例如,假设bits 和myflag 的定义如下:

enum bits{ one=1,two=2,four=4,eight=8};

bits myflag;

则下面的代码是合法的:

myflag=bits(6);//正确,因为 6在bits的范围

取值范围的定义:首先,要找出上限,需要知道枚举量的最大值。找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。

 

例如对于:

enum bigstep{first,second = 100,third};

最大枚举值是101,在2的幂中,比这个值大的最小的值为128,因此取值范围上限为127.

要知道下限,需要知道枚举量的最小值.如果它不小于0,则取值范围的下限为0.否则,采取与寻找上限方式同样的方式,但加上负号,

例如,如果最小的枚举量为-6,则比它小的,2的幂最大的值为-8,加1之后为-7.于是,上限与下限便能算出来.

c语言中不能定义这样的变量:bits myflag;

7、for循环

摘自5.1

C++11新增一种循环:基于范围(range-based)的for循环:简化一种常见的循环任务:对数组(或容器类,如vector和array)的每个元素执行相同的操作.

格式如下:

for(Type VarName : Array){

  //每个元素的值会依次赋给 VarName

}

示例:

double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51};

for (double x : prices)

std::cout<<x<<std::endl;

 

8、逻辑运算符的另一种表示

摘自6.2.6

并不是所有的键盘都提供了用作逻辑运算符的符号,标识符and、or和not都是c++保留字,这意味着不能将它们用作变量名等。它们不是关键字,因为它们都是已有语言特性的另一种表示方式。另外,它们并不是c语言中的保留字,但c语言程序可以将它们用作运算符,只要在程序中包含了头文件iso646.h.

逻辑运算符:另一种表示方式

运算符另一种表示方式&&and||or!not

9、c++字符库函数cctype

摘自6.3

cctype中通常包括一些常用函数的判断,如某个字符是否为大写,用isupper()如果参数是大写字母,函数返回true, 还有像isalnum(),如果参数是字母数字,即字母或者数字,函数返回true.

函数名称 返回值

isalnum() 如果参数是字母数字,即字母或者数字,函数返回true

isalpha() 如果参数是字母,函数返回true

isblank() 如果参数是水平制表符或空格,函数返回true

iscntrl() 如果参数是控制字符,函数返回true

isdigit() 如果参数是数字(0-9),函数返回true

isgraph() 如果参数是除空格之外的打印字符,函数返回true

islower() 如果参数是小写字母,函数返回true

isprint() 如果参数是打印字符(包括空格),函数返回true

ispunct() 如果参数是标点符号,函数返回true

isspace() 如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true

isupper() 如果参数是大写字母,函数返回true

isxdigit() 如果参数是十六进制数字,即0-9、a-f、A-F,函数返回true

tolower() 如果参数是大写字符,返回其小写,否则返回该参数

toupper() 如果参数是小写字符,返回其大写,否则返回该参数

10 、wchar_t 和C++11新增类型:char16_t char32_t

摘自3.1.8

wcha_t:

wchar_t是C/C++的字符类型,是一种扩展的存储方式,主要用在国际化程序的实现中。

wchar_t 存在的原因:

char是八位字符类型,最多能包含256中字符,许多的外文字符集所包含的字符数目超过256个,char型不能表示。

wchar_t数据大小:

数据类型一般为16或者32位,不同的C/C++库有不同的规定。总之:wchar_t所能表示的字符远远多于char类型。

wchar_t的输入输出处理:

cin和cout将输入和输出看作是char流,因此不适合用于处理wchat类型,iostream头文件提供了wcin 和wcout用于处理输入输出流另外可以通过加上前缀L来只是宽字符常量和宽字符串。

char16_t和char32_t:

产生原因:

随着编程人员日益的熟悉Unicode,类型wchar_t显然已经满足不了需求,在计算机系统上进行的编码字符和字符串编码时,仅仅使用Unicode码点显然是不够的,

比如:如果在进行字符串编码时,如果有特定长度和符号特征的类型将很有帮助,而类型wchar_t的长度和符号特征随实现而已,因此C++11新增了类型char16_t,char32_t。

char16_t:无符号类型,长16位,

char32_t无符号类型,长32位

C++11使用前缀u表示char16_t字符常量和字符串常量如:u‘L’;u“lilili”;

C++11使用前缀U表示char32_t字符常量和字符串常量如:U'L';U"lilili";

类型char16_t与/u00F6形式的通用字符名匹配,

类型char32_t与/U0000222B形式的通用字符名匹配。

前缀u和U分别指出字符字面值的类型为char16_t和char32_t。

11、函数重载

摘自8.4

C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading)。借助重载,一个函数名可以有多种用途。

void test(int tmp1, int tmp2)

{

std::cout << tmp1 <<std::endl;

std::cout << tmp2 <<std::endl;

}

void test(double tmp1, double tmp2)

{

std::cout << tmp1 <<std::endl;

std::cout << tmp2 <<std::endl;

}

函数的重载的规则:

函数名称必须相同。

参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。

函数的返回类型可以相同也可以不相同。

仅仅返回类型不同不足以成为函数的重载。

C++ 是如何做到函数重载的

C++代码在编译时会根据参数列表对函数进行重命名。当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。

在C语言中,不存在函数重载,原因为以函数名来唯一区分一个全局函数。 而在c++中 以函数名+参数列表来唯一区分函数。

12、引用

摘自8.2

引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。其格式为:类型 &引用变量名 = 已定义过的变量名。

引用的特点:

1. 一个变量可取多个别名。

2. 引用必须初始化。

3. 引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。

总结:

1. 不要返回一个临时变量的引用。

2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。

* 引用和指针的区别和联系

1. 指针是一个实体,而引用仅是个别名;

2. 引用使用时无需解引用(*),指针需要解引用;

3. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。

4. 引用必须指向有效的变量,指针可以为空。

5. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。

6. 指针和引用自增(++)自减(--)意义不一样。

 

7. 相对而言,引用比指针更安全。

8. 从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

* 相同点:两者都是地址的概念,指针指向一块儿内存,其内容为所指内存的地址;引用是某块儿内存的别名。

指针比引用更为灵活,但是其风险也很大。使用指针时一定要检查指针是否为空(NULL),且空间回收后指针最好置零,以免野指针的发生造成内存泄漏等问题。

#include <iostream>

int main()

{

struct student{

std::string name;

int num;

};

student lily = {"andrew", 168};

const student &ref = lily;

student *p = &lily;

std::cout << sizeof ref<< "= sizeof ref\n";

std::cout << sizeof p<< "= sizeof pointer\n";

}

执行结果:

16= sizeof ref

8= sizeof pointer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭示C语言函数调用的本质解析

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得到…

C语言/C++编程学习:不找C/C++的工作也要学C/C++的原因

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的 C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得…

【网络攻防】精通C语言的黑客才是真正的黑客!

精通C语言的黑客才是真正的黑客 黑客界&#xff0c;有两样重要的课程&#xff0c;一是计算机的本质&#xff0c;二是编译原理。相对于汇编等底层语言&#xff0c;它简单&#xff1b;相对于其它高级语言&#xff0c;它更为接近计算机&#xff1b;同样它对黑客的两大课程很有帮助…

我两小时学完指针,你学会数组/指针与函数需要多久?

数组与函数&#xff1a; 这段函数中 函数的参数是数组&#xff0c;注意数组作为函数参数时&#xff0c;数组名和数组元素个数时分别传递的。 指针与函数&#xff1a; 这段函数中的参数是指针变量&#xff0c;传入的是数组的数组名或者首元素的地址&#xff0c;然后用引领操作…

C语言发展历史,C语言特点,C语言利于弊,入门须知三招

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的 这些是C/C能做的 服务器开发工程师、人工智能、云计算工程师、信息安全&#xff08;黑客反黑客&#xff09;、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程…

程序员怎么看待C语言?最伟大?最落后?

一&#xff0c;前言 对我来说&#xff0c;C语言应该可以算得上是世界上最伟大的编程语言。全中国口气最大的程序员&#xff0c;业界称之为“垠神”&#xff0c;曾经发过文章吐槽过业界各种主流的编程语言&#xff08;对Java&#xff0c;的Python稍微宽容一些&#xff09;&…

如何学习C语言?就是这么简单粗暴!

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的。 C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理…

C/C++对编程的重要性!其他编程语言都是弟弟!

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的 C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得…

C语言其实不难,只是你没有找对方法!

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的 C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得…

想学好C语言?先把基础打好再说吧!

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的 C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得…

C语言新手最常见的问题!你在这里跌倒过吗?

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的 C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得…

用C语言做出你自己的七夕表白程序!

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的 C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得…

C语言/C++编程的起源与能力学习

C语言是面向过程的&#xff0c;而C&#xff0b;&#xff0b;是面向对象的 C和C的区别&#xff1a; C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得…

Windows下设置自动关机的命令指示符

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 Windows定时操作命令&#xff1a;superR&#xff0c;输入&#xff1a;&#xff1f;&#xff1f;&#xff1a;&#xff1f;&#xff1f;shutdown -s ”??“代表时间…

Ubuntu16.04amp;amp;Windows 10双系统安装教程(UEFI模式)

相信来这里的各位&#xff0c;都是想在Windows 10的PC上安装Linux Ubuntu16.04&#xff0c;来达到双系统并用的目的。 那么接下来&#xff0c;我就在默认已安装Windows 10的基础上介绍如何以UEFI的方式安装Ubuntu16.04&#xff01;我的PC是联想小新潮7000—13。在装双系统之前…

Linux Ubuntu16.04界面美化

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 很多人在安装系统之后可能对其外观、主题或是桌面壁纸不满意&#xff0c;本文给大家介绍几种美化方法和插件&#xff01; 1.可以将左侧的“热区”…

Linux16.04和Windows 10双系统下,解决时间不一致问题

装完双系统&#xff0c;你可能会发现某一个系统的时间与现在时间不一致&#xff08;中国相差八个小 时&#xff09;&#xff0c;那么如何解决这个问题呢&#xff1f; 1.将某一个系统的设置时间更新方式设置为“手动”&#xff0c;而不是“从互联网自动获取”。 2.进入PC的BIO…

基于Vitual Box建立虚拟机,虚拟机系统为Linux Ubuntu16.04

相比于为PC机安装双系统&#xff0c;安装虚拟机在达到相同目的的时候显得更为方便。 那本文就详细的为大家介绍如何在Windows 10的系统下&#xff0c;安装Vitual Box&#xff0c;进而安装虚拟机。 一、下载Vitual Box虚拟机制作软件及镜像文件 Vitual Box网址为&#xff1a;…

ROS安装过程和配置过程(可能出现的问题及解决方法)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 准备学习ROS&#xff0c;所以在Linux Ubuntu16.04 的系统下安装ROS &#xff08;建议初学者&#xff0c;先在虚拟机里进行学习和实践&#xff0c…

C语言(CED)排序算法总结。比较完整和详细

排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存 内部排序算法有&#xff1a;直接插入排序&#xff0c;折半插入排…