C/C++
qiangchen99
这个作者很懒,什么都没留下…
展开
-
12个有趣的C语言问答
0. gets() 方法Q:以下代码有个被隐藏住的问题,你能找到它吗?A:这个不显眼的问题就是使用了 gets() 方法。此方法接受一个string类型参数,但是却没有检测此数值是否 有足够的空间来拷贝数据。所以这里我们一般用 fgets() 方法将来的更好。12345678910111213#in转载 2015-01-24 11:16:23 · 300 阅读 · 0 评论 -
C++程序员看过来,false < false的设定恰当吗?
C++中是否规范地定义了:布尔参数中的“小于(less than)运算符”,并且如果有的话,四个参数排列的结果是什么?换句话说,以下操作的结果是有准确定义的吗?1234false false true true 在我的设定下(Centos 7, GCC 4.8.2),下面的代码得出了我期转载 2015-01-24 11:34:22 · 851 阅读 · 0 评论 -
递归与尾递归(C语言)
在计算机科学领域中,递归式通过递归函数来实现的。程序调用自身的编程技巧称为递归( recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归转载 2015-01-24 11:13:53 · 337 阅读 · 0 评论 -
C++11 中值得关注的几大变化(详解)
英文文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以,我就不翻译了,我在这里仅对文中提到的这些变化“追问为什么要引入这些变化”的一个探讨,只有知道为了什么,用在什么地方,我们才能真正学到这个知识。而以此你可以更深入地了解这些变化。所以,本文不转载 2015-01-24 11:12:17 · 471 阅读 · 0 评论 -
C++语言的15个晦涩特性
这个列表收集了 C++ 语言的一些晦涩(Obscure)特性,是我经年累月研究这门语言的各个方面收集起来的。C++非常庞大,我总是能学到一些新知识。即使你对C++已了如指掌,也希望你能从列表中学到一些东西。下面列举的特性,根据晦涩程度由浅入深进行排序。1. 方括号的真正含义2. 最烦人的解析3.替代运算标记符4. 重定义关键字5. Placement new6.在声明变量的同时进行分支7.转载 2015-01-24 11:10:14 · 267 阅读 · 0 评论 -
原子操作 vs 非原子操作
在网上已经有很多有关介绍原子操作的内容,通常都是注重于原子读-修改-写(RMW)操作。然而,这些并不是原子操作的全部,还有同样重要的原子加载和原子存储。在这篇文章中,我将要在处理器级别和C/C++语言级别两个方面来对比原子加载和原子存储与它们相应的非原子部分。沿着这条路,我们将弄清楚C++11中“数据竞争”这个概念。共享内存中的原子操作是指它是否完成了一个线程相关的单步操作。当一个原子存储转载 2015-01-24 11:09:48 · 2019 阅读 · 0 评论 -
C++的另一种错误处理策略
这篇短文是讨论一个大多数程序员都感兴趣的一个话题:错误处理。错误处理是编程的一个“黑暗面”。它既是应用程序的“现实世界”的关键点,也是一个你想隐藏的复杂业务。在早期的C编程生涯中,我知道三种错误处理的方式。C语言的方式:返回错误码C语言风格的错误处理是最简单的,但是并不完美。C语言风格的错误处理依赖于“当程序遇到错误时返回一个错误码”。这里是一个简单的例子:转载 2015-01-24 11:08:51 · 874 阅读 · 0 评论 -
现代C++风格的新元素
“C++11就像一门新的语言。” – Bjarne StroustrupC++11标准推出了很多有用的新特性,本文特别关注那些相比C++98更像是一门新语言的特性,理由是:这些特性改变了编写C++程序使用的代码风格和习语【译注 1】,通常也包括你设计C++函数库的方式。例如,你会看到更多参数和返回值类型为智能指针(smart pointer),同时也会看到函数通过值传递返回大型对象转载 2015-01-24 11:08:06 · 281 阅读 · 0 评论 -
57段让编译器崩溃的C语言代码
导读:本文由犹他州大学的计算机系的 John Regehr 整理。虽然我不清楚到底有多少人喜欢看让编译器崩溃的程序,但这篇文章就是给这些的人(包括我)。我们讨论编译器Bug测试案例的论文就包括很多这种崩溃型的Bug。下文是就是这些 C 语言代码段,由工具逐字输出,代码格式上肯定会有些问题。(代码段后面申明了对应被崩溃的编译器,有读者问为什么没有 MSVC 编译器的,Regehr 回复说他们转载 2015-01-24 11:07:19 · 427 阅读 · 0 评论 -
开发者应该开始学习C++吗?
随着C++ 11和C++ CX的引入,很多人重新燃起了对这门语言的兴趣。不少开发者,尤其是Windows开发者,都想知道是否应该放弃C#和Java,转而支持C++。John Sonmez认为这并不需要。在“为什么C++并没有‘王者归来’(Why C++ Is Not ‘Back’)”一文中,John Sonmez认为只有如下三个原因才会使用C++:● 需要榨干软件每一寸可能的性能,并且转载 2015-01-24 11:06:59 · 273 阅读 · 0 评论 -
能让你成为更优秀程序员的10个C语言资源
一些人觉得编程无聊,一些人觉得它很好玩。但每个程序员都必须紧跟编程语言的潮流。大多数程序员都是从C开始学习编程的,因为C是用来写操作系统、应用程序最常用的语言。C编程笔记这些是华盛顿实验学院C编程入门课的部分笔记。它们是以《c程序设计语言》的补充笔记(从1995年春开始)为基础修改的,而这本书的作者就是大名鼎鼎的Brian Kernighan和Dennis Ritchie了,人们亲昵地转载 2015-01-24 11:05:25 · 359 阅读 · 0 评论 -
快速掌握一个语言最常用的50%
现在的开发工作要求我们能够快速掌握一门语言。一般来说应对这种挑战有两种态度:其一,粗粗看看语法,就撸起袖子开干,边查Google边学习;其二是花很多时间完整地把整个语言学习一遍,做到胸有成竹,然后再开始做实际工作。然而这两种方法都有弊病。第二种方法的问题当然很明显,不仅浪费了时间,偏离了目标,而且学习效率不高。因为没有实际问题驱动的语言学习通常是不牢固不深入的。有的人学着学着成了语言专家,反而忘了转载 2015-01-25 23:12:50 · 302 阅读 · 0 评论 -
【c语言基础必备】gcc编译器的简单编译
一. 常用编译命令选项假设源程序文件名为test.c。1. 无选项编译链接用法:#gcc test.c作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。2. 选项 -o用法:#gcc test.c -o test作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。3转载 2015-01-25 23:17:42 · 299 阅读 · 0 评论 -
那些年我们一起追过的缓存写法(一)
介绍本篇主要说下楼主平常项目中缓存使用经验和遇到过的问题。 目录一: 基本写法二:缓存雪崩1:全局锁,实例锁 2:字符串锁三:缓存穿透四:再谈缓存雪崩五:总结 一:基本写法为了方便演示,我们用Runtime.Cache做缓存容器,并定义个简单操作类。如下:123456789101转载 2015-01-24 11:13:13 · 284 阅读 · 0 评论 -
推荐!可视化垃圾回收算法
大部分开发者都认为自动垃圾回收器是理所当然的。实际上,这只是语言运行时提供的一项实用功能,旨在简化我们的开发工作。但是如果尝试着了解垃圾回收器的内部原理,你会发现很难弄明白。除非熟悉它的工作流程和错误处理方式,否则内部成千上万的实现细节会让你不知所措。我编译了一个有五种不同的垃圾回收算法工具。程序运行时会创建一个动画界面。你可以从github.com/kenfox/gc-viz上获取动画和转载 2015-01-24 11:14:32 · 302 阅读 · 0 评论 -
C++11 中的线程、锁和条件变量
线程类std::thread代表一个可执行线程,使用时必须包含头文件。std::thread可以和普通函数,匿名函数和仿函数(一个实现了operator()函数的类)一同使用。另外,它允许向线程函数传递任意数量的参数。1234567891011121314#include void f转载 2015-01-24 11:11:26 · 369 阅读 · 0 评论 -
Python -01 入门
最近系统学习Android源代码,发现很多脚本是用python写的。于是,花了一个下午快速学习了python,立马眼前一亮,取代了perl在我心中的位置。选择语言准则: 第一考虑Python Python不适合干的求助perl Perl不好干的求助Java Java不好干的求助C C不好干的求助汇编有了想法,第一步是选书,问了度娘后,选择转载 2015-01-25 23:20:39 · 371 阅读 · 0 评论 -
C/C++/PHP等语言 在线编译器 分类: C++
有时候在网吧或别人的电脑上写了一些c/c++程序,却苦于没有安装编译器,无法编译和调试,非常的不方便。这时候我们可以借助在线编译系统来进行c/c++代码的编译。仅仅是编译的话,acm oj是不太合适的。下面分享下找到一份关于在线编译系统的资料。1、http://codepad.org/推荐星级:★★★★是否需注册:否(注册的话也很快,几秒钟而已)优点:网页界面简洁,转载 2015-01-25 23:16:59 · 366 阅读 · 0 评论 -
57段让编译器崩溃的C语言代码
导读:本文由犹他州大学的计算机系的 John Regehr 整理。虽然我不清楚到底有多少人喜欢看让编译器崩溃的程序,但这篇文章就是给这些的人(包括我)。我们讨论编译器Bug测试案例的论文就包括很多这种崩溃型的Bug。下文是就是这些 C 语言代码段,由工具逐字输出,代码格式上肯定会有些问题。(代码段后面申明了对应被崩溃的编译器,有读者问为什么没有 MSVC 编译器的,Regehr 回复说他们转载 2015-01-25 23:15:43 · 604 阅读 · 0 评论 -
C++0X的三件好东西(零)
先说一些废话,可以跳过不看。我主张,在具备基础之后,学习任何新东西,都要抓住主线,突出重点。对于关键理论的学习,要集中精力,速战速决。而旁枝末节和非本质性的知识内容,完全可以留给实践去零敲碎打。原因是这样的,任何一个高级的知识内容,其中都只有一小部分是有思想创新、有重大影响的,而其它很多东西都是琐碎的、非本质的。因此,集中学习时必须把握住真正重要那部分,把其它东西留给实践。对于重点知识,只转载 2015-01-25 23:12:32 · 287 阅读 · 0 评论 -
使用 C++11 编写 Linux 多线程程序
前言在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从保持着几 t 甚或几 p 的数据的数据库系统,到手机上的一个有良好用户响应能力的 app,为了充分利用每个 CPU 内核,都会想到是否可以使用多线程技术。这里所说的“充分利用”包含了两个层面的转载 2015-01-24 11:36:42 · 494 阅读 · 0 评论 -
世界上最简单的无锁哈希表
无锁哈希表(Lock-Free Hash Table )可以提高多线程下的性能表现,但是因为实现一个无锁哈希表本身的复杂度不小。(ps:真正的复杂在于出错之后的调试,因为多线程下的调试本身就很复杂,引入无锁数据结构之后,传统的看堆栈信息和打印log都基本上没有意义了。堆栈中的数据可能被并发访问破坏,而打印log本身可能会改变程序执行时对数据访问的时序。一个比较可行的做法是实现一个无锁版本和一个传统转载 2015-01-24 11:15:21 · 453 阅读 · 0 评论 -
现代C++风格的新元素
“C++11就像一门新的语言。” – Bjarne StroustrupC++11标准推出了很多有用的新特性,本文特别关注那些相比C++98更像是一门新语言的特性,理由是:这些特性改变了编写C++程序使用的代码风格和习语【译注 1】,通常也包括你设计C++函数库的方式。例如,你会看到更多参数和返回值类型为智能指针(smart pointer),同时也会看到函数通过值传递返回大型对象转载 2015-01-25 23:21:06 · 378 阅读 · 0 评论 -
深入理解C语言-09 编译器介绍
比较小型的编译器是TinyCC(http://bellard.org/tcc/)linux下编译非常方便。但gdb使用起来没有Visual Studio方便,特意花了一点时间,整理了一个VC工程。TinyCC里面和i386/PE相关的主要是以下文件:config.h 配置elf.h ELF格式相关,由于代码写得不是太好,PE也要用,不能删除i386-asm.c转载 2015-01-25 23:18:07 · 502 阅读 · 0 评论 -
失落的C语言结构体封装艺术
目录1. 谁该阅读这篇文章2. 我为什么写这篇文章3.对齐要求4.填充5.结构体对齐及填充6.结构体重排序7.难以处理的标量的情况8.可读性和缓存局部性9.其他封装的技术10.工具11.证明及例外12.版本履历 1. 谁该阅读这篇文章本文是关于削减C语言程序内存占用空间的一项技术——为了减小内存大小而手工重新封装C结构体声明。你需要C语言转载 2015-01-24 11:04:14 · 375 阅读 · 0 评论 -
我推荐的一些C\C++书籍
人们常常问我有什么C++和编程的书籍推荐,也许是因为我在PowerDNS有一个关于“编写可读性良好的C++代码”的演讲。这篇博文可以作为我对上述问题的一个回答,同时也包含了一些更广泛的笔记编程。如果你有任何补充或喜欢的书籍但是我没有提到,请给留言提示,我打算一有新书就更新这个页面。第一个注意项:如果你打算学习C++,请务必学习最新版的C++ 2011。这个版本的C++移除了许多由C++强大带来转载 2015-01-24 11:02:39 · 277 阅读 · 0 评论 -
从开源项目学习 C 语言基本的编码规则
原文地址:http://blog.jobbole.com/79422/每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定。一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项目中的每个开发者使用他自己的风格。所有代码都保持一致风格的大型库,更容易让人理解。有许多资源是关于能让人采取的更好的编码规则的,我们可以通过以下方转载 2015-01-24 10:22:37 · 365 阅读 · 0 评论 -
编写高效的C程序与C代码优化
虽然对于优化C代码有很多有效的指导方针,但是对于彻底地了解编译器和你工作的机器依然无法取代,通常,加快程序的速度也会加大代码量。这些增加的代码也会影响一个程序的复杂度和可读性,这是不可接受的,比如你在一些小型的设备上编程,例如:移动设备、PDA……,这些有着严格的内存限制,于是,在优化的座右铭是:写代码在内存和速度都应该优化。整型数 / Integers在我们知道使用的数不可能是负数的时候转载 2015-01-24 10:21:42 · 372 阅读 · 0 评论 -
实现和调试 Malloc、Free、Calloc 和 Realloc 的快速教程
让我们编写一个malloc函数,看看它在既有程序中如何工作!本教程假定你了解指针,知道C语言中 *ptr 间接引用一个指针, ptr->foo 表示 (*ptr).foo,malloc用于内存动态分配,并且熟悉链表的概念。如果想要学习本教程但你不了解C,请告知我哪些部分需要更详细的论述。如果你想要马上浏览所有代码,可以再这里查看。该测试代码由Andrew Roth提供,他的github代码转载 2015-01-24 10:20:13 · 739 阅读 · 0 评论 -
C++之父:C++ 的五个普遍误解(3)
[为了增加您冬天阅读的乐趣,我们很荣幸地奉上Bjarne Stroustrup大神的这个包含3个部分的系列文章。第一部分在这里;第二部分在这里。今天我们正好在圣诞节之前完成这个系列。请欣赏。]1. 简介本系列包括 3 篇文章,我将向大家展示并澄清关于C++的五个普遍的误解:1. “要理解C++,你必须先学习C”2. “C++是一门面向对象的语言”3. “为了软件可靠性,你需要垃圾回转载 2015-01-24 10:19:31 · 400 阅读 · 0 评论 -
C++之父:C++ 的五个普遍误解(1)
原文地址:http://blog.jobbole.com/82460/[编注:为了增加您冬天阅读的乐趣,我们很荣幸的奉上Bjarne Stroustrup大神的这个包含3个部分的系列文章。这是第一部分;第二和第三部分将在接下来的两个周一发布,即在圣诞节之前完成这个系列。请欣赏。——Ed]1. 简介本系列包括 3 篇文章,我将向大家展示并澄清关于C++的五个普遍的误解:1转载 2015-01-24 10:17:21 · 330 阅读 · 0 评论 -
C++强大背后
在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bjarne Stroustrup,该门语言则命名为——C with classes,四年后改称为C++。C++是一门通用编程语言,支持多种编程范式,包括过程式、面向对象(object-oriented programming, OP)、泛型(generic programming, G转载 2015-01-24 10:09:39 · 388 阅读 · 0 评论 -
Unix下设计动态库的方法《精通Unix下C语言编程与项目实践》(一)
3.3 动态库的生成动态库的生成可分为三个步骤,设计库源码、编译位置无关码(PIC)型.o文件和链接动态库。链接动态库的命令包含特殊标志,与链接静态库和链接可执行目标文件有区别,而且不同的Unix系统,其实现的细节也不尽相同。编译PIC型.o中间文件的方法一般是采用C语言编译器的“-KPIC”或者“-fpic”选项,有的Unix版本C语言编译器缺省带上了PIC标志。创建最终动态库的方法一般转载 2015-01-30 11:29:55 · 583 阅读 · 0 评论 -
Linux下C编程+GDB调试
Linux的发行版中包含了很多软件开发工具。 它们中的很多是用于 C 和 C++应用程序开发的。 本文介绍了在 Linux 下能用于 C 应用程序开发和调试的工具。 本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程。 在本文中你将学到以下知识:· 什么是 C · GNU C 编译器 · 用 gdb 来调试GCC应用程序 你也转载 2015-01-28 13:20:30 · 397 阅读 · 0 评论 -
浅谈Unix和Linux下的int
这也算和平同学的点题作文了,呵呵。他对于Linux下很多时候,api函数大量使用int作为常用类型感到不解,问我,我呢,就试着回答一下哈。原帖在这里:http://student.csdn.net/space.php?uid=121080&do=thread&id=9168问题如下:根据建议,表示像“容量”这样的变量时,因为不可能出现负数,所以建议用size_t类型。但是linux转载 2015-01-28 13:18:56 · 1294 阅读 · 0 评论 -
uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结
在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样的疑问。论坛上就有人问:以*_t结尾的类型是不是都是long型的?在baidu上查一下,才找到答案,这时才发觉原来自己对C掌握的太少。那么_t的意思到底表示什么?具体的官方答案没有找到,不过我觉转载 2015-01-26 23:49:04 · 429 阅读 · 0 评论 -
关于《C语言深度解剖》4.1.5编译器的bug小节
编译器的bug?另外一个有意思的现象,在Visual C++ 6.0调试如下代码的时候却又发现一个古怪的问题:int *p = (int *)0x12ff7c;*p = NULL;p = NULL;在执行完第二条代码之后,发现p 的值变为0x00000000 了。按照我么上一节的解释,应该p的值不变,只是p 指向的内存被赋值为0。难道我们讲错了吗?别急,再试转载 2015-01-25 23:16:12 · 358 阅读 · 0 评论 -
C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏。这些的确是消耗了开发人员大多数调试时间的事项。指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是一旦您了解了指针及其关联内存操作的基础,它们就是您在 C 语言中拥有的最强大工具。本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密。本文内容包括:导致内存破坏的指针操作转载 2015-01-24 10:23:38 · 514 阅读 · 0 评论 -
用 C 语言编写一个简单的垃圾回收器
人们似乎认为编写垃圾回收机制是很难的,是一种只有少数智者和Hans Boehm(et al)才能理解的高深魔法。我认为编写垃圾回收最难的地方就是内存分配,这和阅读K&R所写的malloc样例难度是相当的。在开始之前有一些重要的事情需要说明一下:第一,我们所写的代码是基于Linux Kernel的,注意是Linux Kernel而不是GNU/Linux。第二,我们的代码是32bit的。第三,请不转载 2015-01-24 10:25:25 · 280 阅读 · 0 评论 -
15款C/C++程序员必备的编译器和IDE
当前,Web开发人员编程语言的选择很多,比如Java、.Net、PHP、Ruby、Perl、Python等等。今天,本文想和大家讨论下两种古老而又广泛流行的编程语言:C和C++。C/C++自身有许多优良的特性,代码运行高效,并有一些外围工具的支持。如今,这两种语言以其庞大的函数库和健全的安全机制,仍然活跃在编程语言领域。本文将整理一些让人印象深刻的C/C++集成开发环境(IDE)和编译器。ID转载 2015-01-24 11:01:50 · 1057 阅读 · 0 评论