那么教学生这个更合适还是我们应该坚持使用C89?
不幸的是,这个问题无法客观地回答,所以会有点自以为是。
如果我是老师,我会使用现代 C,即 C11 或更高版本。但我也会经常展示过去如何完成的示例。许多更改旨在改善编程习惯。
但是,作为教师,我建议反对的较新 C 语言(在 C11 中已成为非强制性)中的一件事是 VLA:s。您可以在此处阅读我的答案以了解原因:为什么 VLA:s 不好请注意,这是人们不同意的事情。我没有声称我是正确的。VLA:s 有其优点,但肯定也有其缺点。如果您想教授 VLA:s,还必须教授何时以及如何不使用它们。
如果你想使用旧版本,那么至少坚持 C99。从 C89 到 C99 的改进非常重要。在大多数情况下,改进主要是关于可读性的便利性,但这不应被低估。
Example1,循环变量:(恕我直言,对于良好的代码结构非常重要)
/* C89 */
int i;
for(i=0; i<10; i++) {
// C99
for(int i=0; i<10; i++) {
这不仅更方便和可读。它还使循环变量在到达循环结束时消失,使其保持本地化。
示例2,评论:
/* C89 comment */
// C99 comment, and is not valid in C89
Example3,初始化器:
struct myStruct {
uint8_t a;
char b;
char *s;
};
struct myStruct createStructC89(uint8_t a, char b, char *s)
{
struct myStruct x;
x.a = a;
x.b = b;
x.s = s;
return x;
}
struct myStruct createStructC99(uint8_t a, char b, char *s)
{
struct myStruct x = {a, b, s};
return x;
}
该决定也可能取决于 C 课程的目标。
如果它的目标是成为一名 C 程序员,那么我想说指出差异很重要,因为大多数专业的 C 程序员将不得不处理遗留问题。
另一方面,考虑一下仅选择 C 作为一种语言来教授初学者编程的情况,或者如果课程旨在接近硬件,例如计算机体系结构课程。那我肯定会选择C11或C18。我会考虑要求所有handins编译gcc -Wall -Wextra -Werror -Werror=vla -pedantic -std=c11
-Wall -Wextra启用额外警告
-Werror将警告视为错误。典型的学校任务应该没有警告。
-Werror=vla不允许 vla
pedantic禁用许多扩展并强制程序(大部分)符合指定的标准
-std=c11使用 C11。如果需要,更改为 C99 或 C18。