什么样的语言干什么样的事

简介: 什么样的语言干什么样的事

什么样的语言适合什么样的工作,这里拿「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的正宗。

相关文章
|
算法 程序员 API
C 语言和 C++ 有什么区别?老程序员居然这样理解,不怕你不懂
C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)
154 0
|
5月前
|
人工智能 数据挖掘 大数据
成为程序员后你都明白了什么?
成为程序员后你都明白了什么?
73 1
|
6月前
|
算法 程序员
编程遗产:祖传代码
编程遗产:祖传代码
编程要搞明白的东西(一)
编程要搞明白的东西(一)
85 0
|
SQL 人工智能 Java
程序员:你见过哪些要命的奇葩代码?
程序员:你见过哪些要命的奇葩代码?
114 0
|
Java
编程要搞明白的东西(二)
编程要搞明白的东西(二)
88 0
|
消息中间件 Oracle Dubbo
Java 之父偏爱函数式编程,反而被队友讨厌:编码风格简直像疯子!
Java 之父偏爱函数式编程,反而被队友讨厌:编码风格简直像疯子!
|
存储 运维 小程序
都无代码编程了,编程还香吗
11月29日(2020年),腾讯举行了一场主题为 “重新定义开发” 的小程序开发技术峰会,发布的了新一代的云开发平台,用少量代码,甚至不用代码,就可以快速创建一个云应用,大幅降低应用开发门槛,让人人都能做开发,那么对于程序员以及打算学习编程的人来说,何去何从呢?
196 0
都无代码编程了,编程还香吗
|
机器学习/深度学习 移动开发 Rust
你还在纠结到底哪门语言作为主语言的话不妨来看看(入门时刻)
你还在纠结到底哪门语言作为主语言的话不妨来看看(入门时刻)
148 0
|
JavaScript 程序员 C语言
能一眼看懂这些C语言函数,你就是天生的程序员!
喜欢这篇文章的朋友可以多多收藏、点赞、关注 一条龙~
1656 0
下一篇
无影云桌面