我如何学习编写高效且可维护的C代码?

时间:2011-01-30 12:13:00

标签: c

我目前在编程方面的经验仅限于在过去将一些shell脚本和一些程序集混合在一起。但是,我在大学里学到了C代码的基本语法。

我想学习如何编写高效的C代码,我对是否从K& R或C编程:现代方法开始感到困惑。我还应该学习一些算法书籍,以便我不会从一开始就编写效率低下的代码吗?

7 个答案:

答案 0 :(得分:12)

在此阶段不要过分关注高效的代码。使用清晰易读的代码,更关注自己。

通常,保持功能较小,执行一项任务。如果描述一个函数的作用需要太多的句子,那么它可能需要分解成更小的函数。

使用描述性变量名称,而不仅仅是x和n等。

首先编写您喜欢开发的程序,而不是“书中告诉您要做的无聊练习”。但是,请遵循本书的建议和指导原则。

每个人都有自己的风格,如果你的风格与下一个人的风格不太匹配,请不要担心。

最重要的是,享受吧!如果你发现学习一件事有点无聊,那么继续学习其他东西,总是需要学习。

编辑:另外,在你走路之前不要试着跑 - 我特意想的是指针和b)动态内存分配。在你很舒服的时候,没有必要在这个早期阶段使用它们。

答案 1 :(得分:7)

首先弄湿基础知识。学习陷阱,学习好C风格。您无法在一次运行中学习如何编写高效的C代码,因此可以在开始时犯错误。

我发现学习如何编写高效代码的最佳方法是学习如何避免内存泄漏。 可维护的C代码需要源代码中的良好文档和注释。此外,它需要编写能够抵制变更的代码。

示例:

糟糕的例子:

int* ptr = malloc(5 * 4); //4 here being size of int.
... do something with ptr here... //<-- this is wrong!

为什么不好? int可能并不总是4.另外,在第二行中你正在使用ptr(可能是赋值)而不检查它是否为NULL。

更好的例子:

int* ptr = malloc(5*sizeof(int)); // better, always allocate with respect to int size
if (ptr) ..do something..

为什么更好?首先你分配了int的大小,所以即使在另一个架构int的大小不同,你也是好的。 在使用

之前,还要检查ptr是否为NULL

最好的例子:

int* ptr = malloc(5* sizeof(*ptr));
if (ptr) .. do something.
free(ptr); // done with ptr

为什么这是最好的方法?首先,您将分配的大小与int的大小无关,而是直接与ptr的类型相关联。现在,如果有人出于任何原因在ptr的声明中将int更改为long(特别是如果它在其他地方被声明),而不更改为malloc的long内部参数;你的分配仍然是正确的,因为它根据ptr的类型直接分配。

完成后我们也免费使用了ptr,以防止内存泄漏。

答案 2 :(得分:1)

你应该尝试阅读史蒂夫马奎尔的“编写固体代码”,这是一本旧书,但它可以教你所需要的东西。

答案 3 :(得分:1)

首先,关注便携式编程。有一个C标准(ISO 9899:1999又名C99和:2011又名C11--你需要投资~20美元)和一个名为POSIX的“Unix”标准(可自由访问)。读它们,活它们。远离任何和所有Windows和图形编程,直到你不再是一个蚱蜢。

正如智者所说:新手编程他的机器。专家对一组机器进行编程。没有特定机器的大师程序。

这就是可移植性的本质,它将为您节省很多问题它使用Frobozz魔术编译器在FOO-OS下编译/运行,但不在BAR-OS,WTF下吗? /强>

答案 4 :(得分:1)

老实说,在我看来,你开始学习c ++这是c语言的高级版本,这里有更好更有效的代码,这个链接可以让你开始.. 链接http://internetseekho.com/learn-the-write-way-to-code-in-c-part-4-getting-data-from-user-and-displaying-it-on-screen/

答案 5 :(得分:0)

您可以模拟面向对象的编程。

通过定义包含在这些结构上运行的结构和函数的文件来定义实体。将不需要在外部看到的函数标记为静态。这将使它们隐藏,因此您减少了对命名空间的污染。使用new函数创建一个新结构,该函数返回指向新malloc()结构的指针,以及执行free()的删除。定义对结构数据进行操作的简单成员,始终接受指向结构的指针作为第一个参数。

我建议你用python学习一些OOP,并应用相同的概念。

答案 6 :(得分:0)

要添加其他人所说的内容,我建议只编写大量代码。我经常发现这个领域的人等待太长时间才能实际编码,并花太多时间阅读。