哪个版本的C更适合学生学习 - C89 / 90或C99?

时间:2010-12-05 13:31:09

标签: c standards c99 c89

我正在研究在下个月开始系统编程之前学习C基础知识和语法。在做一些阅读时,我遇到了C89 / 99标准。根据维基百科,

  

C99推出了几项新功能,   包括内联函数,几个   新数据类型(包括long long   int和要表示的复杂类型   复数),可变长度   数组,支持可变参数宏   (变量arity的宏)和支持   以一行开头的评论   //,如在BCPL或C ++中。其中很多   已经实施为   几个C编译器中的扩展。

     

C99大部分是落后的   与C90兼容,但更严格   在某些方面;尤其是   缺少类型的声明   说明符不再具有int   含蓄地假设。一个标准的宏    STDC_VERSION 定义为值199901L以指示C99支持   是可用的。 GCC,Sun Studio和   其他编译器现在支持许多或   C99的所有新功能。

我借了一份K& R,第2版,它使用了C89标准。对于学生来说,C89的使用是否会使K& R中涵盖的某些主题无效,如果是,我应该注意什么?

8 个答案:

答案 0 :(得分:19)

没有理由在C99上学习C89或C90-它已经被字面上取代了。很容易找到C99编译器,没有任何理由可以学习早期的标准。

这并不意味着你的教授不会强迫你使用C89。从这里发布的标记作业的各种问题来看,我感觉很多很多C(以及不幸的是,C ++)课程自C89以来没有继续发展。

从初学者的角度来看,你可能没有真正注意到差异 - 有很多C都是C99和C89 / 90。

答案 1 :(得分:11)

使用C99标准,它更新,并具有更多功能。特别有用的可能是bool中的<stdbool.h>类型和int32_t等类型的类型;后者可以防止许多依赖int具有一定大小的不可移植代码。 AFAIK,它并没有使K&amp; R失效,尽管现在一些示例程序可能会以稍微不同的方式编写。

请注意,some compilers仍然不能正常支持C99。我相信GCC仍然需要使用-std=c99标志来启用它;许多Unix / Linux系统都有c99命令包装GCC并启用C99。

许多大学教授也是如此。我通过递交一个在我大一的时候使用bool的程序让我感到惊讶。他从未在C中听说过那种类型:)

答案 2 :(得分:4)

虽然我普遍认同其他人,但值得注意的是,K&amp; R是一本非常好的书,可能值得从中学习C,然后在阅读C99标准时更新你的知识。

答案 3 :(得分:3)

如果你是学生,你甚至可能不会注意到差异。

答案 4 :(得分:2)

是的,有点奇怪的是,你可以得到一个大声的共识,即K&amp; R是一本很棒的C书,并且大声一致认为C99是C的正确/当前/最佳版本。这两个职位是不相容的 - 即使K&amp; R是最好的书,可以学习“C意思是C99”,这只是暗示其余的都是垃圾,或者也是无可救药地过时了。

我建议学习和使用C99,但要注意C89。如果您使用兼容C89和C99模式的编译器,那么您可以编写一些C89来了解这些差异。然后,如果您需要编写一些旨在可移植到C99不会去的地方的代码,您就会知道该怎么做。如果你永远不必写任何这样的代码,那么你可能浪费了一天。

正确编写C89实际上是非常困难的,因为难以获得C89标准的副本。所以,C99如果可以,C89如果出于某些奇怪的原因你必须,并且有一些意识到差异是什么。也许使用K&amp; R来涵盖基础知识,但请尽快看看一些惯用的C99。

至于阅读K&amp; R时需要注意的具体问题:标准前言中有一个重大变化清单(http://www.open-std.org/jtc1/sc22/wg14/www/ docs / n1256.pdf),虽然没有详细说明。其中很多都是添加到C99的新功能,因此并不是K&amp; R 错误,它可能并不总是使用最佳工具来完成给定的工作。其中一些是非常繁琐的事情,如果你需要细节,你应该参考标准。其余的是从C89中删除的东西,通常C99编译器会告诉你何时以及何时尝试使用它们。

答案 5 :(得分:1)

作为一名学生,这对你影响不大。但是如果可能的话,你应该找到一本涵盖C99的新C书

答案 6 :(得分:1)

虽然我认为知道哪些功能更新近且不太可能被模糊(或故意破坏,如MSVC)编译器支持是有益的,但是您应该绝对使用一些C99功能:

  • snprintf:这是C中安全和干净的字符串汇编的权威函数。如果您的编译器缺少它,您可以替换整个printf子系统(可能是个好主意)因为大多数缺少snprintf的实现也充满了printf行为中的(通常是故意的)错误,或者包裹tmpfile / fprintf / fread / {{ 1}}。

  • fclose:如果您需要固定大小的类型(16/32/64位),请使用标准名称stdint.hint16_tuint16_t等等。不要发明自己的,绝对不要使用int32_tINT64等系统特定的。它只会使您的代码难以整合和重用。如果你的编译器缺少u32,只需自己动手来根据正确的平台类型定义类型。

  • 特别是stdint.h,代替uint64_tint foo[2];或其他可疑的遗留黑客来处理64位数字。即使没有C99支持,任何理智的编译器都有自己的64位类型,可用于定义struct { int lo, int hi; } foo;int64_t

答案 7 :(得分:0)

术语“C89”描述了两种截然不同的语言:

  1. 1989年程序员认为委员会在标准含糊不清的地方描述的语言,以及支持预先存在的实现中常见的功能。

  2. 委员会自那时以来所决定的语言已经描述过,它与现有的功能兼容 窗口。

  3. C99“通过说明他们的意思来澄清”标准的模糊部分 标准的解释方式会破坏实质性的 现有代码的一小部分,使得无法执行许多任务 有效率,因为他们在1989年之前在C中进行过。

    对于许多应用程序来说,正确编程的语言将是标准C,C89,C99和C11之前的超集。然而,重要的是,任何使用该语言编程的人都应该明确表示他们使用的是该语言,而不是一个有利于速度而不是可靠性的缩小子集。