什么样的语言适合什么样的工作,这里拿「C」和「python」来做对比。
C语言是强类型语言,他的特点就是「他什么都有,也什么都没有」。这样说是因为C里面都是很底层的语法,他需要你去管理内存,需要你去自定义一些数据结构,更快的处理速度。
Python是弱类型语言,相比C而言,它提供了很多现成的数据结构(比如字典、元组等等),他还有面向对象的写法,与此同时也不需要你去进行内存管理。
二者相比,我认为没有谁更好,只有谁更合适。
拿一个最简单的场景,字符串合并。这个需求在python里面实现非常简单
str1 = "1111111111111" str2 = "22222222222222" concat = str1 + str2
但是在C里面因为需要考虑内存的缘故,这件事情相对而言就没那么简单了,你需要去动态的申请内存,然后还要记得去释放你的这块内存。
#include <stdlib.h> #include <string.h> char* msa_strcat(const char* s1, const char* s2) { size_t s1_len = strlen(s1); size_t s2_len = strlen(s2); char* new_str; if ((new_str = calloc(1, s1_len + s2_len + 1)) == NULL) { return NULL; } strcat(new_str, s1); strcat(new_str, s2); return new_str; } int main() { char* str1 = "1111111111111"; char* str2 = "22222222222222"; char* concat = msa_strcat(str1, str2); free(concat); return 0; }
再拿一个很简单的需求,字符串分割,这个在python里面,实现起来只需要一行
str1 = "1,2,3,4,5,6" ret = str1.split(',')
在C
里面则需要很多行
#include <stdio.h> #include <stdlib.h> #include <string.h> char** splitBySep(char* data, size_t* count, const char* sep) { char** ret; size_t data_len = strlen(data); size_t sep_len = strlen(sep); /* 统计有多少个分割符sep */ if (!(*count)) { char* split_sep; if ((split_sep = calloc(sep_len + 1, sizeof(char))) == NULL) return NULL; for (size_t i = 0; i < data_len - sep_len - 1; i++) { memcpy(split_sep, data + i, sep_len); if (strcmp(split_sep, sep) == 0) (*count)++; } free(split_sep); /* 分割后的结果个数是sep的个数加1 */ (*count)++; } if ((ret = calloc((*count), sizeof(char*))) == NULL) return NULL; size_t count_finish = 0; char* block; char* s; for (block = strtok(data, sep); block != NULL; block = strtok(NULL, sep)) { if ((s = calloc(strlen(block) + 1, sizeof(char))) == NULL) goto clean; memcpy(s, block, strlen(block)); ret[count_finish] = s; count_finish++; } return ret; clean: for (size_t i = 0; i < count_finish; i++) { free(ret[i]); } free(ret); return NULL; } void freeSplitRet(char** ret, size_t count) { for (size_t i = 0; i < count; i++) { if (ret[i] == NULL) continue; free(ret[i]); } free(ret); } int main(){ char* str1 = "1,2,3,4,5,6"; size_t count = 0; char* sep = ","; char** ret = splitBySep(str1, &count, sep); freeSplitRet(ret, count); return 0; }
这样对比的话,可以发现C在处理一些字符串方面是不如python的,但是C的计算速度更快,对内存的管理更加精细,可以通过自定义数据结构(结构体)来实现Python里面任意的一个自带数据结构,或者说,「C」是面粉,「Python」是面条,各有各的伟大。
大部分时候,做一件事情,往往有目的性,有侧重点。如果你要追求速度,那么在处理字符串的时候,虽然C语言写起来有点麻烦,但是“写起来麻烦”已经变成了次要矛盾。如果你对速度的要求不高,python会是你的一个很好的选择。所以,当你还在纠结使用那种语言的时候,不妨先停下来认真看看你的问题是什么。
最后,这几天一直在写C语言,我的感觉是C好厉害,什么都能干,想要什么样的数据结构都能构造出来,在python里面虽然也可以通过类来实现一个自定义的数据结构,但是总感觉python缺点什么,不如C的正宗。