繁体   English   中英

如果我对 c++ 的理解有误,请纠正我

[英]correct me if my understanding of c++ is wrong

如果我目前对 c++ 的以下任何理解有误,请纠正我:

  1. C++ 是 C 的扩展版本。 因此,C++ 与 C 一样高效。
  2. 此外,任何用 C 编写的应用程序都可以使用 C++ 编译器进行编译
  3. C 语法也是有效的 C++ 语法
  4. C++ 与 C 处于完全相同的语言层次结构。

语言层次结构

例如。 最低层:汇编语言,高层:Java、PHP等

所以我的解释是

C++/C is at a lower level than Java,PHP etc since it's closer to hardware level (and therefore because of this,it's more efficient than Java, PHP, etc), yet it is not as extreme as assembly language....但是 C++/C 彼此处于同一级别,并且没有一个更接近硬件级别

  1. 如果您从 C 和 C++ 合法的代码开始,它通常会编译成相同的结果,或者足够接近,效率只会受到最小的影响。

  2. 可以将不允许的 C 写成 C++(例如,使用名称与 ZF6F87C9FDCF8B3C3F07F93F1EE8712 中添加的关键字之一相同的变量,例如new 9712C)。 然而,大多数这样的情况是微不足道的,因此它们在 C++ 中是允许的。 可能最难转换的情况是使用 function 声明而不是原型的代码(或使用完全没有声明的函数,这在旧版本的 C 中是允许的)。

  3. 见 2 --一些语法 C 不能作为 C++ 工作。 如前所述,转换通常很简单。

  4. 不,不是。 尽管 C++确实提供了与 C 相同的低级操作,但它也具有 C 所缺乏的高级操作。

1/4 和 2/3 似乎在说非常相似的事情,但是:

  1. 是(取决于您所说的“扩展”是什么意思,但在广义上,是的)
  2. 不总是
  3. 不总是
  4. 是的

此外,任何用 C 编写的应用程序都可以使用 C++ 编译器进行编译

并非每个 C 程序都可以使用 C++ 编译器进行编译。 There are some differences between C and C++ (keywords, for example), that prevent mixing C and C++ in some ways. Stroustrup 在C 和 C++: Siblings中提到了一些重要的点。

C++ 是 C 的扩展版本。 因此,C++ 与 C 一样高效。

这取决于您使用的语言功能。 我听说使用 OOP 可能会比使用更像 C 的方法带来更多的缓存未命中。 我无法判断这是否属实,因为我没有阅读更多关于该主题的内容。 但这可能是应该考虑的事情。 这只是一个例子,性能不容易比较。

C++ 与 C 处于完全相同的语言层次结构。 语言层次结构,例如。 最低层:汇编语言,高层:Java、PHP等

编程语言通常分为第 1 代(机器代码)、第 2 代(汇编语言)、第 3 代(命令式语言)、第 4 代(定义有点模糊 - 旨在提高生产力的特定领域语言,例如 SQL)、第 5 代(问题表达的典型语言,例如数学符号、逻辑或人类语言;Miranda、Prolog)。 参见例如http://en.wikipedia.org/wiki/Fifth-generation_programming_language及其链接。

从这个意义上说,C 和 C++都是第三代语言。 (As Jerry points out, so are PHP, Java, PERL, Ruby, C#...). 使用该标准,这些语言属于同一个通用组......它们都是您必须告诉计算机如何解决问题的语言,但不是在特定于 CPU 的级别上。

不过,在另一种意义上,C++ 比 C 具有更高级别的编程概念,例如 Object 不需要告诉更高级别的语言(即 5GL) - 相反,他们只需要对问题的描述并知道如何解决整个问题域,他们会为您的特定情况找到可行的方法。

C++/C is at a lower level than Java,PHP etc since it's closer to hardware level (and therefore because of this,it's more efficient than Java, PHP, etc), yet it is not as extreme as assembly language....但是 C++/C 彼此处于同一级别,并且没有一个更接近硬件级别

这有点令人困惑。 总结:

  • C++ 和 C 的跨度确实低于 Java/PHP,是的。
  • C++ 和 C 确实往往更有效,是的。 You can get a general impression of this at http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html - don't take it too literally, it depends a lot on your problem space.
  • C++ and C both go as low as each other, but C++ has some higher level programming support too (though it's still a 3GL like C).

让我们看几个例子:

  • 位移:Java 被设计为比 C 或 C++ 更便于移植(有时会以牺牲性能为代价),因此即使使用 JIT,在某些平台上运行某些操作可能也会很方便。 如果您正在做相同的工作,并且关心 CPU 行为不同的边缘情况,您会发现 C 和 C++ 将操作符行为留给实现指定。 可能需要为不同的部署平台编写多个版本的代码,最终获得与 Java 几乎相同的性能(但程序通常知道它们不会执行极端情况,或者不关心行为差异)。 在这方面,Java 已经抽象出一个低层次的关注点,可以合理地认为是更高层次的但悲观的。

  • C++ 提供了一些更高级别的工具,例如模板(以及模板元编程)和多个 inheritance。 只要 function 签名在编译时已知(一些库绕过此限制),编译器通常提供低级工具,例如内联汇编和从其他对象/库调用任意函数的能力。 解释型(例如 PHP)和基于虚拟机(例如 Java)的语言在这方面往往更差。

  • Java 还提供了一些 C++ 缺乏的更高级别的设施 - 例如内省,序列化。

一般来说,我倾向于设想 C++ 的范围既低于又高于 Java。 换句话说,Java 与 C++ 跨度中间的一个部分重叠。 但是,Java 也有一些突出的高级特性。

PHP 是一种解释性语言,它再次抽象出一些低级关注点,但通常也无法为更抽象或更健壮的编程技术提供良好的设施。 像大多数解释器一样,它确实允许对任意源代码进行运行时评估,以及对 class 元数据等进行运行时修改,从而实现高级、强大但危险的非结构化编程方法。 这种事情在编译语言中是不可能的,除非编译器是在部署环境中发布的(即使这样也有更多的限制)。

C++ 是 C 的扩展版本。 因此,C++ 与 C 一样高效。

一般是真的。

此外,任何用 C 编写的应用程序都可以使用 C++ 编译器 C 语法也是有效的 ZF6F877C9FDCF8EEB3C2F 语法

有一些细微的区别,例如:

  • 在 C++ 中, main()必须具有返回类型int ,如果没有遇到 return 语句,则在退出时隐式返回 0,但 C 允许voidint并且后者必须显式返回一个int
  • C++ has additional keywords (eg mutable , virtual , class , explicit ...) that are therefore not legal C++ identifiers, but are legal in C

不过,您的概念基本上是正确的。

  1. 这并不完全正确,除了速度较慢的额外 C++ 语言功能之外,可以进行不同的优化来改变这一点。 由于更好的 C++ 类型系统,这些实际上通常对 C++ 有利。

  2. 不,一个大案例是 C++ 不支持从 void* 自动转换,例如

    字符* c = malloc(10); // 是有效的 C,但不是 C++

    char* c = (char*)malloc(10) //在C++中需要

  3. 除了 C99 和更新的 C 功能外,我认为几乎总是如此。 请记住,这仅考虑语法,这并不意味着可以在 C 中编译的所有内容也可以在 C++ 中编译。

  4. 您能否详细说明您的意思,“语言级别层次结构”是什么意思?

概括:

  1. 真的。
  2. 危险的虚假。
  3. 错误的。
  4. 主观

2/3的一些例子:

  • sizeof 'a'在 C++ 中为 1,在 C 中为sizeof(int)
  • char *s = malloc(len+1); 是正确的 C 但无效的 C++。
  • char s[2*strlen(name)+1]; 有效(尽管危险)C,但无效 C++。
  • sizeof (1?"hello":"goodbye") is sizeof(char *)` 但在 C++ 中是 6。

尝试将现有的 C 代码编译为 C++ 是完全无效的,并且即使您查找并“修复”所有编译时错误也可能产生危险的错误。 编写在两种语言中都有效的代码可能是多语种比赛的合理入口,但不适合任何严肃的用途。 C 和 C++ 的交集实际上是一种非常丑陋的语言,是两全其美的语言。

这是一个很大的问题要回答。

  1. 并非在所有情况下!
  2. 不正确,因为 3
  3. 不对
  4. 它们并不完全相同

我不认为语言级别的层次结构对一件事来说太重要了。 例如,C 与汇编语言相比是高级语言,而与 Java/C# 相比是低级语言。

您的某些观点的理解是错误的:

1)你的第一点是对的。C++是c的扩展。

2)第二点是对的。 C 可以使用 c++ 编译器进行编译。

3) 一些 C 语法与 c++ 不同。 In c++, using structure, c should specify structure name but c++ it is not mandatory to specify structure name.Also C++ have the concept of class that is not available in c. C++也有更高的安全机制。

4)C 是过程语言,但 c++ 是面向 object 的方法。 所以 c++ 与 c 的语言层次结构不同。

  1. C 语言不是 C++ 语言的子集。 例如,检查 C99 规范 - 它不会在 C++ 编译器中轻松编译。 但是大部分 C89 源代码可以复制并粘贴到 C++ 源代码中。 与裸机相比,C 和 C++ 是可以以“零开销”实现的语言。

  2. 不,但大多数 C++ 编译器也是 C 编译器。 这意味着您可以使用相同的工具链编译.C 和.C++ 文件。

  3. 不,这些语言的演变是不同的。 见问题 1 的答案。

  4. C++ 是多范式语言。 是的,可以和 C 一样使用。 但它也可以用作 DSL——它提供了更高的抽象级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM