在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++不同。
暂时发现的就这么多了…