周建儒(四川信息职业技术学院,四川广元628040)
C语言与C++语言几点差异的应用实例分析
周建儒
(四川信息职业技术学院,四川广元628040)
摘要:C语言是面向过程的编程语言,C++语言是面向对象的编程语言,虽然它们是两种不同的程序设计语言,但是在基础语法的实际应用中既有相似之处,又有细微差别,尤其是在字符串与字符数组的混合使用及互相转换过程中体现得更为明显,这些差异是其底层实现过程不同所致。结合程序实例的分析可以看出,两种语言在布尔数据类型、字符串处理、指针与引用的参数传递等相关应用中的差异。
关键词:C语言;C++语言;实例分析
C语言是面向过程的编程语言,C++语言是面向对象的编程语言,两者之间有一些共同的特点——多种数据类型,丰富的运算符,运算灵活等。两种语言在基础语法上有相似之处,而在应用上却有细微的差别。本文就C语言和C++语言在逻辑值的计算、字符串处理、指针与引用方面的差异结合程序实例详细剖析。
C语言没有布尔类型(bool),C++语言有布尔类型。虽然C语言中没有布尔类型,但是却有逻辑运算和关系运算,也有逻辑真和逻辑假的概念[1],用1表示逻辑真,用0表示逻辑假。虽然C++语言有布尔类型,但是布尔值却不是真正的逻辑值true和false,而是与C语言极为相似的表示方式——数值1和0分别表示逻辑真和假。因为逻辑值可以用数值1和0表示,所以C和C++的逻辑、关系运算并无本质区别,应用灵活。下面结合程序进行详细分析。
示例程序1:
由于C++语言布尔类型变量的值是1(真)或0(假),所以布尔变量不仅可以进行逻辑、关系运算,还可以进行算术运算。例如程序1中的语句(1),就是逻辑值参与算术运算,关系运算8>=3的结果是逻辑值1,逻辑运算2&&-1的计算结果也是1,整个表达式1+2-1结果为整数2。此外,可以给布尔变量赋一个非零的整数(非0表示逻辑真),但是该布尔变量在参与运算时,其值不是所赋的整数,而是1。因为它表示逻辑“真”,故当作1进行运算。例如程序1的语句(2)和(3),尽管变量x赋值为-2,但是2×x在计算时是2×1等于2,并非2×-2等于-4。关系表达式x>y等价于1>0,故关系成立,结果为“真”,值为1而并非0。
C语言与C++语言的关系、逻辑运算与Java语言有本质的不同。例如语句(4)和(5),表达式a2 C字符串与C++字符串的区别
C++语言集成了C语言中字符串(简称C字符串)函数,同时还扩展了字符串类string,所以,用C++语言编程时既可以使用C字符串的库函数,又可以使用string类的成员函数。当自定义函数的形式参数是string类的对象,而实际参数是C字符数组时,两者类型不同,此时需要将C字符数组转化为C++字符串string类的对象。具体的处理方式,我们通过以下示例程序来分析。
示例程序2:
标准C++中string类的构造函数是string(const char *s);可以用C语言的字符串(或字符数组)构造C++的string类对象(即C++字符串类string),例如程序2中的语句(1)正是此用。C++语言中的string类对象,可以使用重载运算符“+”进行字符串的连接,例如程序2中的语句(2),将字符串s2连接在字符串s1的末尾,并且不需考虑字符串s1是否能够容纳所有字符,因为string类的对象相当于动态数组,其内存字节数会随着字符串长度自动增加。然而,C语言的字符串连接却不能使用“+”运算符连接,只能使用strcat()函数,例如语句(4),前提条件是数组ps有足够的长度可以容纳字符串ps1的所有字符。此外,string类对象之间可以用比较运算符“==”“!=”直接进行大小关系的比较运算,如程序2中语句(5),也可以使用赋值运算符“=”将一个sring类对象直接赋值给另一个string对象,而C语言的字符数组是无法这般使用的。
c_str()函数原型是const char *c_str();它是string类的成员函数,返回一个以空字符结尾的字符串,即返回当前字符串的首地址,但是不能直接将该地址赋值给字符类型的指针,可以将当前字符串拷贝给一个长度合适的字符数组,例如语句(3)。s2是string类的对象,s2.c_str()是将C++字符串对象s2转化为C字符串常量,并将该字符串常量通过C语言的字符串拷贝函数拷贝到长度合适的字符数组ps中。
在用C++语言编程时,C字符串及库函数和string类及成员函数可以混合使用,但是两者有本质的区别,C字符串是普通数据类型,要么是字符数组(char str[10]),要么是指向字符串的指针(char *str),内存一旦分配,其长度是不能自动改变的,在进行字符串的连接、拷贝操作时一定要注意字符串的长度。C++字符串string是类,有丰富的成员函数,使用格式是对象名.函数名();当C字符串和string的对象进行混合操作时,最好是将类型转换为一致,尽可能避免C字符串与string类的对象直接计算。
C++字符串并不以‘ ’结尾[2],由C++字符串得到对应的C语言字符串的方法是使用data()、c_str()和copy()三个函数,其中,data()函数以字符数组的形式返回字符串内容,字符串末尾没有‘ ’。c_str()函数返回一个以‘ ’结尾的字符数组。copy()函数把字符串的内容复制或写入已有的字符数组中。
函数通过return语句只能返回一个值,在实际应用中需要返回两个或者更多的值时,虽然可以通过函数参数来实现,但是当发生函数调用时,形参与实参之间是值传递,这种情况是无法实现多返回值的,因为形参与实参属于不同函数的局部变量,系统为它们分配了不同的内存空间,它们之间没有关联,互不影响,所以,函数调用结束后形参无法将结果返回给实参。C++语言中引用类型的变量就可以实现函数多返回值,引用类型的变量主要用作函数参数或者函数返回值[3]。
指针作函数参数,传递的是指针所指变量的地址,是将实参指针的值(变量地址)拷贝给形参指针,此时,实参和形参都指向同一个地址单元,但是,它们却是不同的两个指针变量,如果改变形参指针的指向,不会影响实参指针的指向。
当引用类型变量作为函数参数进行传递时,是将实参自身传递给形参,而不是将实参的拷贝传递给形参,即实参和形参是同一个地址单元,因此,修改了形参也必然改变了实参,所以这种参数传递方式,既节约空间,又节约时间。指针变量与引用变量做函数参数进行参数传递的过程如下列程序所示。
C++语言在一定程度上可以和C语言很好地结合,甚至大多数C语言程序是在C++的集成开发环境中完成的,因此,在基础语法中两者有很多相似之处,在实际应用中又有一些细微的差异,例如,在布尔类型、字符串类与字符数组、指针与引用等方面。笔者结合程序实例,分析了这些差异的具体应用,以期为初学者提供借鉴和帮助。
参考文献:
[1]周建儒.C语言中逻辑关系与逻辑运算的分析[J].电子测试,2012(22):38-39.
[2]周志德,候正昌.C++程序设计[M].北京:电子工业出版社,2005.
[3]埃克尔,刘宗田.C++编程思想[M].北京:机械工业出版社,2012.
Analysis of Examples of C and C ++ language
ZHOU Jian-ru
(Sichuan Information Technology College,Sichuan Guangyuan 628040,China)
Abstract:C language is a process-oriented language,C ++ is an object-oriented language.They are two different programming languages,but they shows both the similarities and subtle differences in practical application of basic grammar,especially in the string reflects the mixed use and mutual conversion process,these differences are due to different underlying implementation process.Combined with analysis of application instances,the paper elaborated differences of two languages in Boolean data type,string handling,pointer parameters passed by reference.
Key words:C language;C++ language;analysis of examples
作者简介:周建儒(1980-),男,陕西城固人,讲师,工程硕士,研究方向为软件工程。
收稿日期:2015-11-22
文章编号:1673-2022(2016)01-0052-03
中图分类号:TP312
文献标志码:A