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

在MOOC上报了C语言的课结果忘了听。最近在PTA上写题,一直按照C++的模式写,发现了许多错误,在这里总结一下。
这里C,C++的编译环境都是VS2017。(扩展名不同,.c和.cpp)
1.C语言中的结构体定义时写法和C++中有所不同。在C语言中,比如定义一个有理数的结构体。

struct Rational {
	int Up;
	int Down;
};

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

struct Rational a;

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

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

这样就可以像C++的类一样使用结构体了。
与类不同,结构体的初始化可以采用={}的方式

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

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

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函数可能是这样的

#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,还是要搞事情的…

typedef enum {false, true} bool;

这句话是不能少的…
4.C语言动态分配内存用的是malloc和free函数,C++用的是new和delete运算符,并且两者返回值的类型不同。如果都能成功分配的话,malloc返回值类型是void*,而new运算符返回值类型根据分配内存的类型确定。使用malloc函数要include<stdlib.h>。
开辟数组时,malloc和new的写法不同,free和delete的写法也不同。

#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++中是错的。

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

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

int main() {
	char a = 35;
	char* ptrchar = &a;
	int* ptrint = ptrchar;
	double* ptrdouble = ptrchar;
	ptrint = ptrdouble;
}

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

	char *str = 65;

但是在C++中,只有0可以给指针赋值,表示空指针,否则要经过类型转换。
5.在C中,const类型的int不可以作为数组大小,C++中可以。在C中要使用define语句

#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文件中是错误的。

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

暂时发现的就这么多了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值