C和C++的使用不同总结
在MOOC上报了C语言的课结果忘了听。最近在PTA上写题,一直按照C++的模式写,发现了许多错误,在这里总结一下。
这里C,C++的编译环境都是VS2017。(扩展名不同,.c和.cpp)
1.C语言中的结构体定义时写法和C++中有所不同。在C语言中,比如定义一个有理数的结构体。
1 | struct Rational { |
当再使用Rational定义一个实例的时候,必须按照如下写法
1 | struct Rational a; |
这样是很不方便的,因此可以使用typedef关键词定义struct类型的一个别名。
1 | typedef struct { |
这样就可以像C++的类一样使用结构体了。
与类不同,结构体的初始化可以采用={}的方式
1 | struct Rational { |
的语句是不会报错的。
2.C语言没有引用。我第一次发现这个问题是因为习惯性的写法,在写复数结构体的print函数时我是这样写的。
1 | typedef struct { |
然后就出了错
度娘显神功,然后就发现了C语言没有引用。
所以,假如使用C语言写swap函数可能是这样的
1 |
|
3.C语言没有bool类型,所以要是想使用bool,还是要搞事情的…
1 | typedef enum {false, true} bool; |
这句话是不能少的…
或者你可以选择stdbool.h
4.C语言动态分配内存用的是malloc和free函数,C++用的是new和delete运算符,并且两者返回值的类型不同。如果都能成功分配的话,malloc返回值类型是void*,而new运算符返回值类型根据分配内存的类型确定。使用malloc函数要include<stdlib.h>。
开辟数组时,malloc和new的写法不同,free和delete的写法也不同。
1 |
|
在C语言中,void* 的值可以赋值到任何类型的指针上面,而在C++中,void* 必须经过强制类型转换才可以赋值到其他类型的指针。
比如,下面的语句在C中正确,但在C++中是错的。
1 |
|
在C语言中,指针类型的变量不用看指向的类型,可以相互赋值。
以下语句是没有错的。
1 | int main() { |
整数也是可以给指针类型赋值的,比如
1 | char *str = 65; |
但是在C++中,只有0可以给指针赋值,表示空指针,否则要经过类型转换。
5.在C中,const类型的int不可以作为数组大小,C++中可以。在C中要使用define语句
1 |
|
6.在C中,不支持函数默认值,C++中支持。(针对VS说的,GCC其实支持函数默认值,VS不支持。)
7.在VS中如下写法在.c文件中是错误的。
1 | int arr[100] = { }; |
在GCC中正确,不多说了…
8.VS没有gets,只有gets_s,GCC没gets也没gets_s(PTA上的有gets但是声明在stdio2.h中),所以直接用scanf就好了。
9.C不支持函数重载,C++支持,这个就不多说了…
10.在C语言中,int fun(void)表示函数没有参数,而int fun()表示函数有没有参数都可以,这个与C++不同。