老师说什么是C,D语言

Python022

老师说什么是C,D语言,第1张

D语言是由Digital Mars公司开发的编程语言,起因是为了改进C++。它与C二进制兼容(不完全),可编译为本地码,有GC也可手动管理内存,语法上借鉴多种语言,模板则在C++的基础上做了相当大的扩充。D 语言既有 C 语言的强大威力,又有 Python 和 Ruby 的开发效率。它是一种集垃圾回收、手工内存操作、契约式设计、高级模板技术、内嵌汇编、内置单元测试、Mixin 风格多继承、类 Java 包管理机制、内置同步机制、内建基本运行时信息的系统级编程语言。

D语言是由Digital Mars公司开发的编程语言,起因是为了改进C++。它与C二进制兼容(不完全),可编译为本地码,有GC也可手动管理内存,语法上借鉴多种语言,模板则在C++的基础上做了相当大的扩充。D 语言既有 C 语言的强大威力,又有 Python 和 Ruby 的开发效率。它是一种集垃圾回收、手工内存操作、契约式设计、高级模板技术、内嵌汇编、内置单元测试、Mixin 风格多继承、类 Java 包管理机制、内置同步机制、内建基本运行时信息的系统级编程语言。D语言简介D 语言是一种通用的系统和应用编程语言。它是比 C++ 更高级的语言,同时还保持了生成高效代码以及直接访问操作系统API和硬件的能力。D 很适合于编写从中等规模到那些由团队合作完成、数百万行代码规模的各种程序。D 易于学习,为编程者提供了很多便利,并且适用各种野心勃勃的编译器优化技术。 D 不是脚本语言,也不是一种解释型语言。它不需要虚拟机、宗教、或者高于一切的哲学。它是给实际的编程者使用的实际的语言,它帮助编程者快速、可靠的完成易于维护、易于理解的代码。 D 是数十年来实现多种语言编译器的经验的积累,是用那些语言构造大型工程的尝试的积累。D 从那些语言(主要是 C++ )那里获得了灵感,并使用经验和现实世界中的实用性来驯服它。为什么需要D语言自从 C 语言被发明以来,软件工业走过了一段很长的路。许多新的概念被加入了 C++ 中,但同时维护了同 C 的向后兼容性,包括兼容了原始设计中的所有的弱点。有很多修正这些弱点的尝试,但是兼容性是最大的困扰。同时,C 和 C++ 都在不断引入新的特性。这些新特性必须被小心的加入到现有的结构中,以免重写旧的代码。最终的结果十分复杂—— C 标准将近 500 页,C++ 标准大概有 750 页!C++ 实现起来既困难又代价高昂,造成的结果就是各种实现之间都有差别,因此很难写出完全可以移植的 C++ 代码。 C++ 程序员倾向于使用语言中的孤岛来编程,也就是说,他们倾向于十分精通语言中的某个特性而避免使用其他特性。尽管代码通常在编译器之间是可移植的,但在程序员之间移植就不那么容易了。C++ 的一个长处是它支持很多根本上不同的编程风格——但从长远来看,互相重复和互相冲突的风格会给开发带来妨碍。 C++ 在标准库而不是语言核心中实现了可改变大小的数组和字符串拼接等。不在语言核心中实现这些功能造成了几种不太理想的结果。 是否能把 C++ 的能力释放、重新设计并重铸到一门简单、正交并实用的语言中呢? 这种语言是否能做到易于正确实现,并使编译器有能力有效地生成高度优化的代码呢? 现代编译器技术已经取得了很大的进步,有些原来用作原始编译技术的补充的语言特性已经可以被忽略了(一个这样的例子是 C 语言中的‘register’关键字,一个更为微妙的例子是 C 中的宏预处理程序)。我们可以依赖现代编译器的优化技术而不是使用语言特性(如同原始的编译器所做的那样)来获得可以接受的代码质量。从C/C++保留而来的特征粗看上去 D 就像 C 和 C++ 。这样一来学习以及将代码移植到 D 就很容易。从 C/C++ 转向 D 应该很自然。程序员不必从头学起。 使用 D 并不意味着程序员会如 Java 或者 Smalltalk 那样被严格的限制在某一个运行时 vm (虚拟机)上。D 没有虚拟机,编译器直接生成可连接的目标文件。D 如同 C 那样被直接连接到操作系统。通常那些你熟悉的工具如 make 同样适用于 D 的开发。 D 将很大程度上保留 C/C++ 的 观感 。它将使用相同的代数语法,绝大多数的相同表达式和语句形式,以及总体的结构。 D 程序既可以采用 C 风格的 函数和数据 范式,也可以采用 C++ 风格的 面向对象 范式,或者它们两者的混合。 编译/链接/调试 的开发模型将会被继承下来,但是把 D 编译成为字节码然后解释执行也不会有任何问题。 异常处理 越来越多的使用经验显示,异常处理是比 C 传统的“出错代码/全局errno变量”模型更为高级的错误处理模型。 运行时类型识别 C++ 部分地实现了这个功能,而 D 更进一步。对运行时类型识别的完全支持将使垃圾收集运行的更好,会使调试器的功能更强,会使对自动持久化的支持更好等等。 D 维持了同 C 调用惯例 的兼容。这样就能够使 D 程序直接访问操作系统的 API 。程序员有关现有 API 和编程范例的知识和经验可以继续在使用 D 时使用而只需付出很少的努力。 运算符重载 D 支持对运算符的重载,这样就可以用用户定义的类型扩展由基本类型构成的类型系统。 模板 模板是实现范型编程的一种手段。其他的手段包括使用宏或者采用协变数据类型。使用宏已经过时了。协变类型很直接,但是低效且缺少类型检查。C++ 模板的问题是它们太复杂,同语言的语法不和谐,还有各种各样的类型转换和重载规则,等等。D 提供了一种简单得多的使用模板的方法。 RAII(资源获得即初始化) RAII 技术是编写可靠软件的重要方法之一。 Down and dirty 编程 D 将保留 down-and-dirty 编程的能力,而不用采用别的语言编写的外部模块。在进行系统编程时,有时需要将一种指针转换成另一种指针,或者使用汇编语言。D 的目标不是避免 down and dirty 编程,而是减少在进行普通程序设计时对它们的需要。废弃的特征对 C 的源码级兼容性。保留对 C 的源码级兼容的扩展已经有了(C++ 和 Objective-C)。在这方面的进一步工作受制于大量的遗留代码,已经很难对这些代码进行什么重大的改进了。 对 C++ 的链接兼容性。C++ 的运行时对象模型太复杂了——如果要较好的支持它,基本上就是要求 D 编译器变成一个完整的 C++ 编译器了。C 预处理程序宏处理是一种扩展语言的简单方法,它可以给语言加入某些语言本不支持的(对于符号调试器不可见的)特征。条件编译、使用 #include 分层的文本、宏、符号连接等,本质上构成了两种难以区分两种语言的融合体,而不是一种语言。更糟的是(或许是最好的),C 预处理程序是一种十分原始的宏语言。是停下来的时候了,看看预处理程序是用来做什么的,并将这些功能直接设计到语言内部。多重继承它是一种拥有饱受争议的价值的复杂特征。它很难用一种高效的方式实现,而且在编译器实现它时很容易出现各种 bug 。几乎所有的 MI 的功能都能够通过使用单根继承加接口和聚集的方式实现。而那些只有 MI 才能支持的功能并不能弥补它带来的副作用。 现在调试成为了语言语法的一部分了。可以在编译时决定是否使用这些代码,再也不用使用宏或者预处理命令了。调试语法提供了一种持续的、可移植的、易于理解的识别调试代码的方法,使程序员既能够生成带有调试代码的二进制版本,也能够生成没有调试代码的二进制版本 D 对从同一份源码生成多个版本的程序提供了内建的支持。它替代了 C 预处理程序的 #if/#endif 技术。

102 题 答案是 0 即 选 D。

因为输出语句在循环体内:

for (i=0,j=1i<=j+1i+=2,j--) printf("s=%d",i)

循环体 只执行了1次,i 的当前值 是 0。

如果 在循环体以外输出,即循环语句结束后 输出 i:

for (i=0,j=1i<=j+1i+=2,j--)// 这里若有分号

printf("s=%d",i) 输出 2;

因为 循环体 执行一次后,做了步长 那部分运算 i+=2, j--

i 当前值 是 i=0+2, 成了 2。