从更高级语言过渡到C的最佳方法是什么?

时间:2009-05-19 13:57:47

标签: c language-features

我是一名网络编码员:我目前喜欢AS3并处理PHP。我拥有一台任天堂DS,并希望给予一个去吧。

从更高的层面来看,什么基本的东西/生物的舒适将会失踪? 我找不到[for ... in]循环,所以我认为它们不在那里。看起来我将不得不虔诚地声明事物,并且我假设我没有任何对象(我刚才用PHP处理过)。

哈希表?有趣的数据类型?

12 个答案:

答案 0 :(得分:9)

总结一下,你基本上会得到:

  • 键入的变量
  • 功能
  • 指针
  • 标准库

然后,你做了其余的事情 - 这可能有点过于简化了,但这对于要面对的事情是一个粗略的想法。

一开始可能令人生畏,可能需要克服学习曲线。这可能是您遇到的一些减速带:

<强>字符串?什么字符串?

习惯的一件大事就是字符串。 C中没有string这样的东西。字符串是“null - 终止的字符数组”(有时称为C strings),它基本上是指{{1}类型的数组最终元素为char\0char)。

在内存中,包含0的长度为4的char数组将显示为:

Hi!

此外,字符串不知道自己的长度(在C中没有“免费”的“对象”),因此需要使用标准库调用char[0] == 'H' char[1] == 'i' char[2] == '!' char[3] == '\0' ,这或多或少是一个strlen循环遍历字符串,直到它到达for个字符。 (这意味着它是一个O(N)操作 - 字符串越长,查找长度所需的时间越长,这与现代语言中大多数\0实现的O(1)操作不同。)

垃圾收集?

在C中没有这样的垃圾收集器。事实上,你需要自己分配和释放内存:

string

分配内存后无法清理会导致memory leaks之类的事情,我相信你以前听说过。

<强>指针!

和往常一样,当我们谈论C时,我们不能忘记pointers。引用变量和解引用指针的整个概念可能是一个严重的令人头疼的概念,但是一旦你掌握了它,它实际上并不是太糟糕。

除了你期望它以某种方式工作的时候,但是你发现你并没有很好地理解指针,它实际上做了别的事情 - 就像他们说的那样,在那里,完成了。

哦,指针可能是你第一次真正看到程序崩溃到足以让操作系统对你大喊大叫的事情之一。 segmentation faultnot something the computer likes a lot

<强>类型

C中的所有变量都有类型。 C是statically-typed language,意味着将在编译时检查变量类型。这可能需要一些人在开始时习惯,但也可以看作是一件好事,因为它可以减少运行时错误,例如在尝试为字符串分配数字时输入类型错误。

但是,可以执行typecasts,因此可以将/* Allocate enough memory for array of 10 int values. */ int* array_of_ints = malloc(sizeof(int) * 10); /* Done with the array? Don't forget to free the memory! */ free(array_of_ints); 类型(它们是整数值)转换为int类型(浮点类型值)。但是,无法尝试将double直接转换为int之类的字符串。

因此,例如,在某些语言中允许以下内容:

char*

在C中,必须调用itoa函数来获取// Example of a very weakly-typed pseudolanguage with implicit typecasts: number n = 42 string s = "answer: " string result = s + n // Result: "answer: 42" 的{​​{1}}表示,然后使用strcat来连接两个字符串。

<强>结论

那些事情说,学习C来自更高级的语言可能会让人大开眼界并且可能很难开始,但是一旦你掌握了它,它就会很有趣。

我建议您开始尝试使用C编译器,并拥有一本好书或参考书。

我想很多人会推荐K&R book,这确实是一本很好的书。

起初,我认为推荐K&amp; R作为第一本C书并不是一个好主意,因为它可能有点困难,但第二个想法,我认为这是非常全面的如果您已经拥有一些编程经验,那么写得很好,可以很好地进入C语言。

祝你好运!

答案 1 :(得分:6)

嗯......你可能会受到一些文化冲击。 These是C中的32个标准关键字,包括基本类型。

C的标准库功能非常强大(比人们预期的要多),但与高级语言相比,它非常精简。看不到哈希表,你可以假设C没有对象的语法或语义支持。

无论如何都可以编写漂亮的面向对象的代码,但是你必须跳过几个环节,并且手动做得更多,因为语言对你没用。例如,请参阅GTK+ UI工具包,以获取精心设计的面向对象的C库/ API的示例。

答案 2 :(得分:2)

  

我是一名网络编码员:我目前喜欢AS3并处理PHP。我拥有一台任天堂DS,并希望给予一个去吧。

为什么要进行C编程? 你有什么理由,你希望实现什么目标? 是为了为Nintendo DS编写软件吗?

  

从更高的层面来看,什么基本的东西/生物的舒适将会失踪?

鉴于你的背景,我认为你个人会错过缺乏动态类型支持,换句话说你必须在你的C程序中非常明确,你的数据必须用适当的类型指定,以便编译器知道您正在使用哪种类型的数据。这也适用于任何类型的内存管理,即基本上任何一旦你开始使用非POD的数据结构。

例如,你可以在php中做这样的事情:

function multiply(x) {
 return (x*x);
}

你必须在C:

中做这样的事情
int multiply(int x) {
 return (x*x);
}

虽然这些可能看起来非常相似,但存在很大差异,即输入限制:php版本也可以使用浮点值,而在C中你必须明确地提供不同类型和值范围的版本(C类型)被限制在某些范围内。)

  

我找不到[for ... in]循环,所以假设它们不在那里

在C中,它看起来更像是:

int c;   for(c = 0; c <= 10; c ++){   //循环体   }

  

看起来我将不得不虔诚地宣布事情

是的,非常如此 - 比你更欣赏

  

我认为我没有对象(我刚才用PHP处理过)。

正确,没有对象 - 但是仍然可以使用其他方式模拟OOP,例如function(struct obj)

根据你的目标和动机,我认为你可能会发现C是一种非常令人沮丧的语言来开始认真的编程,你可能想要研究一些相关的替代方案,例如Java。

答案 3 :(得分:1)

动态数组和垃圾回收。它不是内置于C中,因此您需要自己动手或使用预​​先存在的解决方案。

标准程序是你自己管理内存,这可能听起来像一些可怕的东西,但实际上并非如此。例如,在AS3和PHP中,您可以创建一个数组,并在完成后忘记它。在C中,你必须确保自己解除分配,否则内存会泄漏,可能/将会发生坏事。

答案 4 :(得分:1)

你会特别想念自动内存管理和语义上有意义的数据类型,如字符串,表格和c。但是,学习C语言非常有启发性,即使你可能不想将它用于应用程序级编程,所以我建议你拿一个“K&amp; R”(Kernighan和Ritchie的开创性书籍)并试一试 - - 你可以在网上找到大量的免费图书馆来使用和学习,但是你必须遵守自己的规则来使用适当的记忆管理启发式方法......快乐的学习!

答案 5 :(得分:1)

我刚刚在网上做了一些研究,似乎有可能使用lua在“nintendo DS”上进行开发,这对于熟悉高级语言的人来说可能是开始嵌入式操作的最简单方法开发,在不牺牲过多的HLL能力的情况下,在从HLL迁移到C microlua时不会遇到不可避免的文化冲击,这里是API docs

所以你可能想要试一试,可能会为初学者使用模拟器。

让我们发布!

答案 6 :(得分:0)

我很确定你想要查看C ++,而不是C. C ++基本上是面向对象的C语言。

答案 7 :(得分:0)

真的错过的是快速原型化和测试更改的能力。您不仅可以更改一行代码并运行。即使使用像“make”这样的构建工具重新编译也可能需要几分钟时间。如果你认为在C / C ++中犯错很容易,那就更糟了。在大型项目中,我认为我花费的时间比实际编码要多。作为脚本语言的长期用户,这是使用C的最大问题。

答案 8 :(得分:0)

直接从具有有效无限资源的机器上运行的高级语言移动到DS将是一个挑战,而不仅仅是因为语言。

Nintendo DS只有4MB RAM,66MHz ARM-7,没有操作系统,而且可用的开发库(如libnds)只提供了对硬件本身的精简抽象。

因此,除了必须处理手动内存管理之外,还有一种更简单的语言,更少的生物舒适,静态类型,缺少对象,以及在看到任何更改之前需要运行编译步骤,您还必须处理内存碎片,现代标准的CPU速度非常慢,需要直接与硬件交互才能做任何有用的事情。

为DS编写代码,唯一的另一个选择是C ++。在这样一个有限的系统中,你不能使用许多使C ++值得的高级功能。您将使用C ++编译器编写C代码。

那就是说,这很有趣。您可以随心所欲地使用硬件,并且不需要与操作系统连接,因为没有操作系统。

答案 9 :(得分:0)

C是直接汇编程序的下一级,允许您在靠近金属的位置操作。这样可以让你做出惊人的东西,也可以轻松拍摄自己的脚!

一个这样的例子是直接存储器访问以及指针算法的危险和奇迹。指针非常强大,快速,方便,但需要仔细管理。有关示例,请参阅此SO question

另外,如其他回答者所述,您必须自己进行内存管理。又强大又痛苦。

我建议您研究good textbook并找到一些高质量的示例代码。关键是学习模式,使所有这些东西正确和优雅地挂在一起(尽可能多)。一个好的调试器也会真正帮助并熟悉标准的C库。

你可能会注意到你的应用程序最初会崩溃,但仍然坚持不懈,因为C绝对值得至少考虑。你会理解一些高级语言提供的惊人抽象以及真正发生的事情。

答案 10 :(得分:0)

我们需要更多的自制开发者。我是GBA / NDS和许多其他嵌入式平台开发人员,希望看到你继续这样做。我会说跳到arm armr然后备份到C或任何其他你喜欢的语言,一旦你知道处理器是如何工作的,语言只是语法。

我认为您之前的经验涵盖了编程思维模式,将内容分解为一小块大小,然后编写代码来执行这些大块。然后是另一个将这些连接起来的模块,依此类推。然后C只是另一种语言,一种非常非常简单的语言,无需潜入它的角落,从中间开车。声明变量等是一个好习惯,在这里你必须这样做。当你忘记了什么时,编译器会告诉你。你不需要大概念,大结构,语言魔法,这是嵌入式的,你是资源有限的,在这里写一些字节,在那里读一个寄存器,从数据中提取一点,看看是否按下了一个按钮,写响应移动精灵等的寄存器

我认为你会发现NDS比C更难,有两个处理器和一些基础设施来获得最简单的二进制文件。当然,也有许多例子。我一般(并且仍然)建议从GBA开始然后毕业到NDS。一口大小的块。

答案 11 :(得分:-2)

OOP中的很多东西在PHP和C#中都是相同或几乎相同的。

你不玩C#中的指针(与C ++相比)所以如果你想玩C,我肯定会推荐使用C#。

你在说什么C?

C#

foreach(string item in itemsCollection)
{
...
}

PHP

foreach($itemsCollection as $key=>$value)
{
...
}

我喜欢C#,因为它是强类型的,并且在编写代码时会自动检查您的类型...尝试将整数保存到字符串或反之亦然的可能性为零,与PHP相比,您可以将任何内容保存到任何内容中。 ..

相关问题