«

为什么说 C++ 和 C 压根儿没多大关联?

时间:2025-12-19 00:17     作者:独元殇     分类: C/C++


在很早以前,C++ 是基于 C 创建的。但是很多年过去了。这两种语言早就没有多少共同点了,他们越来越是两种语言了。

大多数人都不会很接触这两种语言,浮躁的时代,框架满天飞的互联网时代,AI 时代,只有少数人玩他们了。但你还是要知道,这两种语言,今天,截然不同!这是一个基本的常识。不认清楚,对社会 会有一定的负面影响。

为什么?因为现在学习市场,都在混淆 C 和 C++ ,让学编程语言的大学生、爱好者,都误以为这俩是一种思想,一种东西。甚至导致很多初学者,误以为先学明白 C++ ,才能再学 C..... 这是误人子弟,在今天,C++ 和 C 的关系,和 Go、Rust 和 C 的关系一样,甚至和 javascript 和 Java 的关系一样,都属于是两者独立的语言。

其实没必要学 C++ 再学 C 。

其实 C 的内容很少,很精简,很 OK。直接学 C 就够了。

后者则是一门巨大无比的工业语言。。。其实就不该起这个误导人的名字。


书上都是这样写的:“C 是 C++ 的子集,所有 C 都是合法的 C++ 代码” ,还有的教科书说:“C++ 是带类的 C”。其实并不能这样说,因为 Go 这个后端语言,你也可以在它里面写 C 呀?哈哈。

很多语言都可以写 C 的,为什么,因为大部分的编译语言,都有 C 的外部函数接口。所以,我们要认清这个客观知识。C 生万物嘛。

上面的什么带类的 C ,这个说法在 C++ 早期也不错,毕竟 C++ 是这样被设计的,但是如今 C++ 里面有太多的独立于 C 的特性了。

而且!!! 所有 C 都是合法的 C++ 代码 是错的,很多 C 都没法通过 C++ 的编译器:

比如说 空指针!C 里面的空指针,无法被 C++ 编译通过。

#include <stdlib.h>

int main() {
    int *foo = malloc(5); // 为 foo 分配7字节内存空间
    return 0;
}

你会得到一个报错:

img

很显然,如果你不明确强制转换,那么 C++ 无法将 void* 这个空指针转化为整数指针。

还有 C++ 无法识别许多的 K&R 语法。

K&R 语法(K&R C)是早期 C 语言的非正式标准,由 Brian Kernighan (K) 和 Dennis Ritchie (R) 在 1978 年的经典书籍《C 程序设计语言》中定义。引入了许多 C 语言的重要特性,如结构体、长整型、无符号类型等。将=+改为+=,=-改为-=,增强了代码可读性。没有功能原型、没有void关键字、无const关键字、没有内联函数.....

比如 这段匪夷所思的东西

int gcd(a, b)
    int a;
    int b;
{.....}

这竟然也是一个函数!!!而且在 C 里面是允许的。实际上,C++ 根本读不懂!

C++ 得这样写:

int gcd(int a, int b) 
{...}

另外呢,C++ 里面,有很多的人为设计的牛逼的类。使得 C++ 的语言,代码量很少,很精妙。

而 C 则太简单原始了,如果要用 C 来写同样的东西,需要大量的代码。

但是,C 的好处是,可读性超级的高!而 C++ 虽然代码量小了,可读起来估计得业内人士了~

比如:

需求:给你一个整数数组,请你过滤出其中的所有偶数,计算它们的平方,最后求和。

long long sumOfEvenSquares(int *nums, int numsSize) {
    long long sum = 0;
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] % 2 == 0) {  // 显式逻辑判断
            sum += (long long)nums[i] * nums[i];
        }
    }
    return sum;
}

是不是很干净?一个初中都没读完,就照猫画虎写了五六天 PHP 的 wordpress 模板程序员,都大体上看的懂。

甚至能拿给对代码一窍不通的高中生,不到半小时就能解释通。

额,现在看看 C++ 选手。这种算法,通常会这样写:

#include <vector>
#include <numeric>
#include <ranges>

long long sumOfEvenSquares(const std::vector<int>& nums) {
    auto evens_squared = nums 
        | std::views::filter([](int n) { return n % 2 == 0; })      //过滤偶数
        | std::views::transform([](int n) { return 1LL * n * n; }); //映射为平方
    return std::accumulate(evens_squared.begin(), evens_squared.end(), 0LL);//求和
}

大概就这么个意思。C++ 里面工具太多了。外行根本无法一眼看明白。

简单确实也简单,熟悉 STL 的朋友,读起来舒服的感觉像读诗.... 就是很容易吓跑小朋友。


当然当初 C++ 发布时,说 C++ 是带类的 C,其实只是蹭个热点而已。大家别当真了 ~

C 程序员就是 C 程序员,C++ 程序员就是 C++ 程序员。两者很多时候,工作没什么交集。