我正在研究在下个月开始系统编程之前学习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中涵盖的某些主题无效,如果是,我应该注意什么?
答案 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.h
,int16_t
,uint16_t
等等。不要发明自己的,绝对不要使用int32_t
或INT64
等系统特定的。它只会使您的代码难以整合和重用。如果你的编译器缺少u32
,只需自己动手来根据正确的平台类型定义类型。
特别是stdint.h
,代替uint64_t
或int foo[2];
或其他可疑的遗留黑客来处理64位数字。即使没有C99支持,任何理智的编译器都有自己的64位类型,可用于定义struct { int lo, int hi; } foo;
和int64_t
。
答案 7 :(得分:0)
术语“C89”描述了两种截然不同的语言:
1989年程序员认为委员会在标准含糊不清的地方描述的语言,以及支持预先存在的实现中常见的功能。
委员会自那时以来所决定的语言已经描述过,它与现有的功能兼容 窗口。
C99“通过说明他们的意思来澄清”标准的模糊部分 标准的解释方式会破坏实质性的 现有代码的一小部分,使得无法执行许多任务 有效率,因为他们在1989年之前在C中进行过。
对于许多应用程序来说,正确编程的语言将是标准C,C89,C99和C11之前的超集。然而,重要的是,任何使用该语言编程的人都应该明确表示他们使用的是该语言,而不是一个有利于速度而不是可靠性的缩小子集。