C和C++的使用不同总结

在MOOC上报了C语言的课结果忘了听。最近在PTA上写题,一直按照C++的模式写,发现了许多错误,在这里总结一下。

这里C,C++的编译环境都是VS2017。(扩展名不同,.c和.cpp)

1.C语言中的结构体定义时写法和C++中有所不同。在C语言中,比如定义一个有理数的结构体。

1
2
3
4
struct Rational {
int Up;
int Down;
};

当再使用Rational定义一个实例的时候,必须按照如下写法

1
struct Rational a;

这样是很不方便的,因此可以使用typedef关键词定义struct类型的一个别名。

1
2
3
4
5
typedef struct {
int Up;
int Down;
} Rational;//定义名为Raional的结构体类型
Rational a;

这样就可以像C++的类一样使用结构体了。

与类不同,结构体的初始化可以采用={}的方式

1
2
3
4
struct Rational {
int Up;
int Down;
} a = { 1,2 };

的语句是不会报错的。

2.C语言没有引用。我第一次发现这个问题是因为习惯性的写法,在写复数结构体的print函数时我是这样写的。

1
2
3
4
5
6
7
8
9
10
typedef struct {
double real;
double imag;
} Complex;
inline void print(const Complex& p) {
if (p.imag == 0 || abs(p.imag) < 0.05) printf("%.01lf", p.real);
else if (p.real == 0 || abs(p.real) < 0.05) printf("%.01lfi", p.imag);
else if (p.imag > 0) printf("%.01lf+%.01lfi", p.real, p.imag);
else printf("%.01lf%.01lfi", p.real, p.imag);
}

然后就出了错

度娘显神功,然后就发现了C语言没有引用。

所以,假如使用C语言写swap函数可能是这样的

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
inline void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int main() {
int a = 1, b = 2;
swap(&a, &b);
printf("a = %d b = %d", a, b);
}

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
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
scanf("%d", &n);
int* arr = malloc(sizeof(int)*n);
//int* arr = new int[n];
free(arr);
//delete[] arr;
}

在C语言中,void* 的值可以赋值到任何类型的指针上面,而在C++中,void* 必须经过强制类型转换才可以赋值到其他类型的指针。

比如,下面的语句在C中正确,但在C++中是错的。

1
2
3
4
5
6
#include <stdlib.h>
int main() {
int *a = malloc(sizeof(int) * 4);
//int *a = (int*)malloc(sizeof(int) * 4);
free(a);
}

在C语言中,指针类型的变量不用看指向的类型,可以相互赋值。

以下语句是没有错的。

1
2
3
4
5
6
7
int main() {
char a = 35;
char* ptrchar = &a;
int* ptrint = ptrchar;
double* ptrdouble = ptrchar;
ptrint = ptrdouble;
}

整数也是可以给指针类型赋值的,比如

1
char *str = 65;

但是在C++中,只有0可以给指针赋值,表示空指针,否则要经过类型转换。

5.在C中,const类型的int不可以作为数组大小,C++中可以。在C中要使用define语句

1
2
3
4
5
6
#include <stdio.h>
#define n 10 //C语言写法
const int n = 10; //C++写法
int main() {
int arr[n];
}

6.在C中,不支持函数默认值,C++中支持。(针对VS说的,GCC其实支持函数默认值,VS不支持。)

7.在VS中如下写法在.c文件中是错误的。

1
2
int arr[100] = { };
//int arr2[100] = {0};

在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++不同。

作者

Uchiha Kakashi

发布于

2019-02-19

更新于

2019-11-26

许可协议