Questions tagged «c»

C是用于操作系统,游戏和其他高性能工作的通用计算机编程语言。

6
是否有一种语言可以更好地转换为C语言?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 CoffeeScript是一种受Ruby启发的具有清晰语法的语言,可以转换为JavaScript。有没有类似的语言可以转换成C语言,从而在不影响性能的情况下提供更具可读性的代码?如果没有类似的东西存在,是否有充分的理由不创建它?
19 c  syntax  compiler 

8
为什么x = x ++未定义?
它是未定义的,因为它x在序列点之间修改了两次。标准说它是未定义的,因此它是未定义的。 我知道的那么多。 但为什么? 我的理解是,禁止这样做可以使编译器更好地进行优化。当发明C时,这本来是有道理的,但现在看来似乎是一个很弱的论点。 如果我们今天要重新发明C,那么我们会这样做吗,还是可以做得更好? 或者,也许还有一个更深层次的问题,那就是很难为此类表达式定义一致的规则,因此最好禁止它们? 因此,假设我们今天要重新发明C。我想为诸如的表达式建议简单的规则x=x++,在我看来,这些规则比现有规则更有效。 与现有规则或其他建议相比,我希望您对建议的规则有意见。 建议规则: 在序列点之间,未指定评估顺序。 副作用立即发生。 没有涉及未定义的行为。表达式的计算结果等于或等于该值,但肯定不会格式化硬盘(奇怪的是,我从未见过x=x++格式化硬盘的实现)。 示例表达式 x=x++-定义明确,不会改变x。 首先,x将其递增(立即x++求值时),然后将其旧值存储在中x。 x++ + ++x-递增x两次,计算为2*x+2。 尽管可以首先评估任一侧,但结果要么是x + (x+2)(首先是左侧),要么是(首先是(x+1) + (x+1)右侧)。 x = x + (x=3)-未指定,x设置为x+3或6。 如果首先评估右边,则为x+3。也有可能x=3首先被评估,所以是3+3。在任何一种情况下,x=3赋值都会在x=3评估时立即发生,因此存储的值将被另一个赋值覆盖。 x+=(x=3)-定义明确,设置x为6。 您可以说这只是上述表达式的简写。 但是我要说的是,+=必须在之后执行x=3,而不是分为两个部分(读取x,评估x=3,添加和存储新值)。 有什么优势? 一些评论提出了这一点。 我当然不认为x=x++在任何普通代码中都应使用诸如此类的表达式。 实际上,我要比这严格得多-我认为单独使用x++in 的唯一好用法x++;。 但是,我认为语言规则必须尽可能简单。否则,程序员只是不了解它们。禁止在序列点之间两次更改变量的规则当然是大多数程序员都不了解的规则。 一个非常基本的规则是: 如果A有效,B有效,并且它们以有效方式组合,则结果有效。 x是有效的L值,x++是有效的表达式,并且=是将L值和表达式组合在一起的有效方法,那么为什么x=x++不合法呢? C标准在这里是一个例外,该例外使规则复杂化。您可以搜索stackoverflow.com并查看此异常使人们感到困惑的程度。 所以我说-摆脱这种混乱。 ===答案摘要=== 为什么这样 我试图在上一节中解释-我希望C规则要简单。 优化的潜力: 这确实使编译器有了一些自由,但是我没有看到任何使我相信它可能很重要的东西。 大多数优化仍然可以完成。例如,a=3;b=5;即使标准指定了顺序,也可以重新排序。诸如之类的表达式a=b[i++]仍然可以进行类似的优化。 您不能更改现有标准。 …

6
在C ++代码中使用C表达式是一种好习惯吗?
尽管我确实比班级领先,但我们还是从今年开始在学校学习C。在班级是C的基础上,我学习了Java,C ++和C。无论如何,我一直在记录自己,读书,文章,我问我的老师为什么我应该学习C,她说这是C ++的基础。刚开始编程时,我发现C ++容易得多,后来又学习了C。但是在书中,您可以看到C代码可以在C ++中运行,但反之则不行。 我的问题很简单〜在C ++中使用C表达式是一种好习惯吗?让我给你举个例子: 该代码应 #include <stdio.h> #include <iostream> int main() { int x; scanf("%d", &x); cout << "The number you entered is " << x << "And it's double is " << x*x; return 0; } 在任何方面都比这更有效率或更好: #include <iostream> int main() { int x; cin >> …
19 c++  c 

7
C程序的OO最佳实践
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 “如果您真的想要OO糖-请使用C ++” –当我问到这一点时,我立即从我的一位朋友那里得到了答复。我知道这里有两件事是完全错误的。首先,OO不是“糖”,其次,C ++没有吸收C。 我们需要用C语言编写服务器(前端将使用Python),因此我正在探索更好的方法来管理大型C程序。 根据对象和对象交互对大型系统进行建模,使其更具可管理性,可维护性和可扩展性。但是,当您尝试将此模型转换为不包含对象(及其所有其他对象)的C语言时,您将面临一些重要的决策。 您是否创建了自定义库来提供系统所需的OO抽象?诸如对象,封装,继承,多态性,异常,发布/订阅(事件/信号),名称空间,自省等(例如GObject或COS)。 或者,您仅使用基本的C构造(struct和函数)以即席方式近似所有对象类(和其他抽象)。(例如,关于SO的此问题的一些答案) 第一种方法为您提供了一种结构化的方法,用于在C中实现整个模型。但是,这也增加了您必须维护的复杂性。(请记住,首先要通过使用对象来减少复杂性)。 我不知道第二种方法,以及它在逼近您可能需要的所有抽象方面的效果如何。 因此,我的简单问题是:在C语言中实现面向对象设计的最佳实践是什么。记住,我并不是在问如何做到这一点。这个和这个问题都在谈论,甚至有一本书。我更感兴趣的是一些现实的建议/示例,这些示例/示例解决了此问题时出现的实际问题。 注意:请不要建议为什么不应该使用C来支持C ++。我们已经超越了那个阶段。

6
2011年的C编程
已关闭。这个问题需要更加集中。它当前不接受答案。 6年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 许多个月前,我削减了C代码为生,主要是在维护支持各种操作系统(Linux,* BSD,HPUX,VMS等)的POP3服务器的同时。 我计划通过使用C语言编写简单的FORTH来提高我的C语言技能,并学习一些有关语言实现的知识。 但是我想知道自2000年以来C世界中的事情如何(或是否发生了变化)。当我想到C时,我认为... comp.lang.c 尽可能使用ANSI C(但C89和C99并未得到广泛支持) gcc -Wall -ansi -pedantic 代替静态分析工具 埃马克斯 标签 Autoconf + make(有关VMS,HP-UX等优点,请参见第2点) 在过去的11年中一直用C编写的任何人都可以让我知道这些年来发生了什么变化(如果有的话,-)。 (在其他新闻中,我已经做了十多年了)。

4
了解C / C ++中的函数调用堆栈框架吗?
我试图了解如何构建堆栈框架以及哪些变量(参数)以什么顺序被压入堆栈?一些搜索结果表明,C / C ++编译器根据函数内执行的操作进行决策。例如,如果假定该函数只是将传入的int值加1(类似于++运算符)并返回它,则它将把该函数的所有参数和局部变量放入寄存器中。 我想知道哪些寄存器用于返回或按值传递参数。引用如何返回?编译器如何在eax,ebx,ecx和edx之间进行选择? 我需要了解什么才能了解​​函数调用期间如何使用,构建和销毁寄存器,堆栈和堆引用?
19 c++  c  compiler  stack 

8
在第一个错误之后,您是否阅读C或C ++编译错误?
我从来不明白为什么C和C ++编译器会尝试从错误中恢复并继续解析。几乎总是,第一个错误会生成一系列伪错误,这些错误会在第一个错误修复后立即消失。经过几年的经验,我只是停止查看除每个文件的第一个错误以外的任何错误。我重新运行编译器,然后再次执行该操作,直到没有更多错误为止。这是常见的做法吗?


7
当仅包含.cpp文件时,一切正常时,为什么需要包含.h?
为什么我们需要同时包含.h和.cpp文件,而仅通过包含.cpp文件就可以使其起作用? 例如:创建一个file.h包含声明,然后创建一个file.cpp包含定义,并将两者都包含在中main.cpp。 或者:在中创建一个file.cpp包含声明/定义的声明(没有原型)main.cpp。 两者都为我工作。我看不出有什么区别。也许对编译和链接过程有一些了解可能会有所帮助。
18 c++  c  headers  linking  include 

2
为什么C在TIOBE受欢迎程度索引中如此之高,而C ++也在此之下,却没有那么受欢迎?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我无法解决这个问题。如果使用了很多C,但不是C ++,有人可以向我解释使C比C ++更常用的最重要原因吗?这些C代码在哪里写? 这是否与高度依赖命令式编程但不能承受实现或调整C ++编译器的成本的工业部门有关?有那么多内核黑客吗? tiobe是否相关?我从没涉足任何文章,也没有发表评论或解释tiobe的排名是多少,它实际上表明了该行业的喜好,以及它可以表明该行业的实际用途,从而确定了该行业的实际需求。很难解释。 我只是觉得奇怪,即使这些C / C ++职位很烂,许多公司也想要C#,php,java职位,而不是C或C ++职位(只是与我的失业状况和我的采访有关)。我会选择那些。还是这意味着语言炒作在这里起着重要作用?

8
什么时候应该在C中检查指针是否为NULL?
总结: C语言中的函数是否应该始终检查以确保未取消引用NULL指针?如果不是,何时跳过这些检查是否合适? 详细资料: 我读过一些有关编程面试的书,我想知道在C语言中对函数参数进行输入验证的适当程度是多少?显然,任何需要用户输入的功能都需要执行验证,包括NULL在取消引用指针之前检查指针。但是,如果您不希望通过API公开同一文件中的函数,该怎么办? 例如,以下内容出现在git的源代码中: static unsigned short graph_get_current_column_color(const struct git_graph *graph) { if (!want_color(graph->revs->diffopt.use_color)) return column_colors_max; return graph->default_column_color; } 如果*graph为,NULL则将取消引用空指针,这可能会使程序崩溃,但可能导致某些其他不可预测的行为。另一方面,函数是static,因此程序员可能已经验证了输入。我不知道,我只是随机选择了它,因为它是用C编写的应用程序中的一个简短示例。我已经看到许多其他地方使用了指针而不检查NULL。我的问题不是针对此代码段的。 我在异常处理的上下文中看到了一个类似的问题。但是,对于不安全的语言(例如C或C ++),不会自动传播未处理的异常。 另一方面,我在开放源代码项目(例如上面的示例)中看到了很多代码,这些代码在使用它们之前不做任何指针检查。我想知道是否有人对何时将检查放入函数与是否假定使用正确参数调用函数的准则进行了思考。 对于编写生产代码,我通常对此问题感兴趣。但是我也对编程面试感兴趣。例如,许多算法教科书(例如CLR)倾向于以伪代码表示算法,而没有任何错误检查。但是,尽管这对于理解算法的核心很有帮助,但显然不是一种好的编程实践。因此,我不想告诉采访者我正在跳过错误检查以简化代码示例(就像教科书一样)。但是我也不想出现带有过多错误检查的低效率代码。例如,graph_get_current_column_color可以将其修改为检查*graph空值,但不清楚是否*graph为空值,除非不取消引用它。
18 c  validation  null 

8
C和C ++之间是否有语言?
我真的很喜欢C的简单和透明的性质:当我编写C代码时,我不受“泄漏抽象”的束缚,并且几乎总能对我正在生成的程序集做出精明的猜测。我也喜欢C的简单,熟悉的语法。 但是,C没有C ++提供的这些简单,有用的东西,例如类,简化的非字符串处理等。我知道可以使用跳转表之类的东西在C中实现,但这有时有点麻烦,并且出于各种原因也不是很安全的类型。 不过,我不喜欢过分强调C ++中的对象,并且我对“ new”运算符等不屑一顾。例如,C ++似乎有太多的障碍,无法用作系统编程语言。 在小部件和小工具的规模上是否存在介于C和C ++之间的语言? 免责声明:我的意思是纯粹是事实问题。我不想激怒您,因为我不同意您的观点,即C {,++}足以胜任我计划的一切。
18 c++  c 

3
从左到右语言语法的优点
我一直在Channel9上观看Herb Sutter的一次采访,他在视频的结尾提到,对于将来的C ++标准,从左到右的语言语法将是他的愿望清单上的第一名(尽管他承认以这种方式修改C ++会造出完全不同的野兽)。 除了: 人类更容易理解,肉眼更清晰;例如 //C syntax /*pointer to function taking a pointer to function(which takes 2 integers as arguments and returns an int), and an int as arguments and returning an int*/ int (*fp)(int (*ff)(int x, int y), int b) //Go analogous syntax which is left to write …

15
使用高级语言进行原型制作常见吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我目前正在玩一个项目,该项目的语言远远超出了我目前的编程能力,而我在(C)中没有多少实际经验,我正在玩这个想法。使用我更熟悉的高级语言(例如Perl / Python / Ruby / C#)进行原型设计是否有价值,以便使整体设计顺利进行? 最终,最终产品是性能敏感的(它是一个数据库引擎),因此选择了C。但是,恐怕不太了解C会让我迷失森林。 在寻找类似问题时,我注意到一个人提到程序员曾经在Prolog中进行原型设计,然后在汇编器中进行原型设计。

5
为有抱负的学生提供有关构建自己的内核的建议[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我是一个非常有野心的大学生,希望学习几乎所有有关计算机的知识(如果有需要,请抨击我,我喜欢学习)。最近,我认为设计和构建自己的内核是一个有趣的项目(尽管是一个漫长的项目)。 我掌握了一些基本信息,并且已经积累了一些需要掌握Assembly和C / C ++才能真正完成此工作的信息。当我从事这些工作时,我想从编程的角度学习内核实际上是如何工作的。我已经花了几个小时浏览Linux内核的代码,但这只能带您到现在为止。 构建内核的基本步骤是什么?您需要解决的问题?命令还是做事?我知道我很讨厌,但我决心要应付。
18 c  assembly  kernel 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.