为什么说 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;
}
你会得到一个报错:
很显然,如果你不明确强制转换,那么 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++ 程序员。两者很多时候,工作没什么交集。