哪个版本的 C 更适合学生学习——C89/90 还是 C99?
Posted
技术标签:
【中文标题】哪个版本的 C 更适合学生学习——C89/90 还是 C99?【英文标题】:Which version of C is more appropriate for students to learn- C89/90 or C99? 【发布时间】:2011-05-20 12:45:42 【问题描述】:我正在考虑在下个月开始系统编程之前学习 C 基础知识和语法。在阅读时,我遇到了 C89/99 标准。根据***,
C99 引入了几个新特性, 包括内联函数,几个 新的数据类型(包括 long long int 和一个复杂类型来表示 复数),可变长度 数组,支持可变参数宏 (可变元的宏)和支持 对于以开头的单行 cmets //,如在 BCPL 或 C++ 中。其中许多 已经实施为 几个 C 编译器中的扩展。
C99 大部分是落后的 与C90兼容,但更严格 在某些方面;特别是,一个 缺少类型的声明 说明符不再具有 int 隐含假设。标准宏 STDC_VERSION 定义为值 199901L 表示支持 C99 可用。海湾合作委员会、太阳工作室和 其他编译器现在支持许多或 C99 的所有新功能。
我借了一份 K&R,第 2 版,它使用 C89 标准。对于学生来说,使用 C89 是否会使 K&R 涵盖的某些科目无效,如果是,我应该注意什么?
【问题讨论】:
【参考方案1】:没有理由在 C99 上学习 C89 或 C90 - 它已被完全取代。很容易找到 C99 编译器,而且没有任何理由学习早期的标准。
这并不意味着您的教授不会强迫您使用 C89。从这里发布的各种标记为作业的问题中,我感觉到自 C89 以来,许多 C(不幸的是,还有 C++)课程都没有继续。
从初学者的角度来看,您可能不会真正注意到其中的区别 - 有很多 C 语言需要涵盖 C99 和 C89/90。
【讨论】:
“很容易找到 C99 编译器”——GCC 仍然需要-std=c99
标志,而微软显然不支持它 ***.com/questions/2656080/vs-2008-and-c99
@larsmans:所以,GCC 完全支持它,并且有许多适用于 Windows 的 C 编译器。至于微软,如果你有一个 C++ 编译器,你必须疯了才能回到 C,所以他们缺乏对 C99 的支持没什么大不了的。
很公平,答案+1。不过,我不同意“回到”C 是一个疯狂的举动。我的职业是 C++ 程序员,但我仍然喜欢 C 的极简主义。
@DeadMG:GCC 确实不完全支持 C99,有一些遗漏(通常可以忽略不计,但在某些平台上比其他平台更差)。
不,反对票是“没有任何理由学习早期标准”,这完全是错误的。使用 C89 的原因是小众且越来越少,这与不存在不是一回事。我也不确定学生是否不会注意到差异 - 如果你没有注意到,那么你所写的内容比惯用的 C99 更接近 C89:当然没有利用 C99 中的新功能。正如您所说,放弃这些新功能并不是一个好主意,除非课程教师绝对要求提交的代码编译为 C89。【参考方案2】:
使用 C99 标准,它更新且功能更多。特别有用的可能是<stdbool.h>
和int32_t
等类型家族中的bool
类型;后者可以防止大量依赖int
s 具有一定大小的不可移植代码。 AFAIK,它不会使 K&R 无效,尽管现在一些示例程序可能会以稍微不同的风格编写。
请注意,some compilers 仍然不能正确支持 C99。我相信 GCC 仍然需要使用 -std=c99
标志来启用它;许多 Unix/Linux 系统都有一个 c99
命令,用于包装 GCC 并启用 C99。
许多大学教授也是如此。我在大一的时候提交了一个使用bool
的程序,这让我感到惊讶。他从未听说过 C 语言中的那种类型 :)
【讨论】:
我在我的个人系统上安装了 MinGW,【参考方案3】:虽然我一般同意其他人的观点,但值得注意的是,K&R 是一本非常好的书,值得从中学习 C,然后在阅读 C99 标准时更新您的知识。
【讨论】:
我是唯一一个不认为 K&R 是学习 C 语言的最佳书籍的人吗?这确实是一本经典的 CS 课本,但我不确定它是否适合初学者。可能最好学习新的标准和样式。【参考方案4】:如果您处于学生级别,您可能甚至不会注意到差异。
【讨论】:
C99/C++ cmets//
, (u)intN_t, declarations after code and printfs
%z` 是一些很可能会注意到的事情。至少如果你学习 c 的方式不错。【参考方案5】:
是的,有点奇怪的是,你能得到一个响亮的共识,即 K&R 是一本很棒的 C 书,而且还有一个响亮的共识,即 C99 是 C 的正确/当前/最佳版本。这两个位置是不相容的——即使K&R 是最好的书,可以用来学习“C 意思是 C99”,这只是暗示其余的都是垃圾,或者也已经过时了。
我建议学习和使用 C99,但在这样做时请留意 C89。如果您使用同时具有 C89 和 C99 兼容模式的编译器,那么您可以编写 C89 的一些位来了解差异。然后,如果您需要编写一些旨在移植到 C99 不去的地方的代码,您就会知道该怎么做。如果您永远不必编写任何此类代码,那么您可能已经浪费了一天。
正确编写 C89 实际上非常困难,因为获取 C89 标准的副本很困难。所以,如果可以的话,C99,如果出于某种奇怪的原因你必须这样做,C89,并且知道有什么区别。也许使用 K&R 来涵盖非常基础的内容,但请尽快了解一些惯用的 C99。
至于阅读 K&R 时需要注意的具体问题:该标准的前言中有一个主要更改列表(http://www.open-std.org/jtc1/sc22/wg14/www/docs/ n1256.pdf),虽然细节没有在那里列出。其中很多是添加到 C99 的新功能,因此并不是说 K&R 错,它可能并不总是针对给定工作使用最好的工具。其中一些是相当繁琐的事情,如果您仍然需要详细信息,您可能应该查阅标准。其余的是从 C89 中删除的内容,通常 C99 编译器会在您尝试使用它们时告诉您。
【讨论】:
【参考方案6】:作为一名学生,这对你影响不大。但如果可能的话,你应该找到一本涵盖 C99 的新 C 书籍
【讨论】:
【参考方案7】:术语“C89”描述了两种截然不同的语言:
程序员在 1989 年认为委员会在标准不明确的地方描述的语言,并且支持预先存在的实现中常见的功能。
委员会自此决定它想要描述的语言,它放弃了与现有功能的兼容性 窗口。
C99 “澄清”了标准中模棱两可的部分,说明它们的意思是 以一种会破坏实质性的方式解释标准 现有代码的一小部分,并且无法执行许多任务 高效,因为它们在 1989 年之前在 C 中执行。
对于许多应用程序来说,正确的编程语言应该是标准 C、C89、C99 和 C11 的超集。然而,重要的是,任何使用该语言编程的人都清楚他们正在使用该语言,而不是一个缩小的子集,它有利于速度而不是可靠性。
【讨论】:
【参考方案8】:虽然我认为了解哪些功能较新且不太可能被晦涩的(或故意破坏的,如 MSVC)编译器支持是有益的,但您绝对应该使用一些 C99 功能:
snprintf
:这是 C 中安全和干净的字符串汇编的最终功能。如果您的编译器缺少它,您可以替换整个 printf
子系统(这可能是一个好主意,因为大多数实现都使用缺少snprintf
也充满了(通常是故意的)printf
行为中的错误),或者包装tmpfile
/fprintf
/fread
/fclose
。
stdint.h
:如果需要固定大小的类型(16/32/64 位),请使用标准名称int16_t
、uint16_t
、int32_t
等。不要自己发明,并且绝对不要使用特定于系统的那些,如INT64
或u32
。它只会让您的代码变得丑陋且难以集成和重用。如果您的编译器缺少 stdint.h
,只需插入您自己的编译器,根据适合您的平台的类型来定义类型。
特别是 uint64_t
,代替 int foo[2];
或 struct int lo, int hi; foo;
或其他可怕的遗留黑客来处理 64 位数字。即使没有 C99 支持,任何健全的编译器都有自己的 64 位类型,可用于定义 int64_t
和 uint64_t
。
【讨论】:
以上是关于哪个版本的 C 更适合学生学习——C89/90 还是 C99?的主要内容,如果未能解决你的问题,请参考以下文章