随笔分类 -  C/C++编程

摘要:C语言提供类似于矩阵的多维数组,在一些进行数学运算的程序中会经常用到。从形式 上看多维数组是由多个一维数组组成的,但C语言处理多维数组的方法和一维数组一样,都是线性存储,连续分配存储空间,可以用带偏移量(offset)的一 维数组来访问多维数组。而在数组规模不确定的情况下,就需要用malloc函数动态分配存储空间。这里的数组规模不确定指的是数组的维数确定,而每一维的 元素个数是不确定的。例如根据用户输入的行数和列数来确定一个二维数组。下面使用两种方式来进行二维数组分配:对应的代码如下: #include<stdio.h>#include<stdlib.h>#define 阅读全文
posted @ 2012-05-14 11:01 Mr.Rico 阅读(1072) 评论(0) 推荐(0) 编辑
摘要:c++类的构造函数详解 一、 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; } private: // 数据成员 int m_value; } 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员的初始化工作 eg:Counter c1; 编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动地初始化对象c1的m_value... 阅读全文
posted @ 2012-05-11 17:50 Mr.Rico 阅读(95895) 评论(11) 推荐(17) 编辑
摘要:使用Memoization,以避免递归重复计算考虑Fibonacci(斐波那契)问题;Fibonacci问题是可以通过简单的递归方法来解决:intfib(n){if(n==0||n==1){return1;}else{returnfib(n-2)+fib(n-1);}}注:在这里,我们考虑Fibonacci 系列从1开始,因此,该系列看起来:1,1,2,3,5,8,... 注意:从递归树,我们计算fib(3)函数2次,fib(2)函数3次。这是相同函数的重复计算。如果n非常大,fib这个简单的技术叫做Memoization,可以被用在递归,加强计算速度。fibonacci 函数Memoizat 阅读全文
posted @ 2012-05-08 10:39 Mr.Rico 阅读(4483) 评论(0) 推荐(0) 编辑
摘要:原文:http://www.linuxforu.com/2011/12/loading-library-files-in-cpp/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+LinuxForYou+%28LINUXForYou+%29在C语言中载入库比较容易,而在C++中则比较麻烦。在C语言中函数都唯一的,这样在库中可以直接使用函数名作为函数的记号,而在C++中由于函数重载和多态的存在,使得C++中函数名不能直接作为函数的记号。为了解决这个问题,C++中使用是Name mangling技术,对不同的函数 阅读全文
posted @ 2012-04-26 17:34 Mr.Rico 阅读(2086) 评论(0) 推荐(0) 编辑
摘要:C代码优化方案1. 使用尽量小的数据类型 2. 求余运算使用位操作来代替求余运算:只要是2^n的取模,都可以使用位操作来代替。 使用移位运算来代替乘法运算。比如: 3. 避免不必要的整数除法整数除法是整数运算中最慢的,所以应该尽可能避免。一种可能减少整数除法的地方是连除,这里除法可以由乘法替代,但是存在副作用就是,乘法有可能溢出。4. 使用符合操作表达式,都能获得高质量的程序代码。5. 结构体成员布局我们都知道对于结构体存在内存对其的问题,所以为了付出最小代价情况下得到结构体的内存对齐,可以采取下面的一些策略:按数据类型的长度排序,先存放多字节数据,然后再存放单字节数据,这样可以避免内存空洞。 阅读全文
posted @ 2012-04-11 21:41 Mr.Rico 阅读(471) 评论(0) 推荐(0) 编辑
摘要:这个是在《C/C++程序员实用大全·精华版:C/C++最佳编程指南》一书中提到了"ANSI设备驱动器"。在shell编程中也是类似的。要是通过彩色化提示符来增加个性化,就要用到转义序列。 转义序列就是一个让 shell 执行一个特殊步骤的控制指令。 转义序列通常都是以 ESC 开头(这也是它的命名原因)。 在 shell 里表示为 ^[。这种表示法需要一点时间去适应, 也可以用 \033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27, = 用八进制表示的 33)。要直接在 shell 里面输入转义序列我们需要先按 ctrl-v:CTRL-v E 阅读全文
posted @ 2012-03-27 21:11 Mr.Rico 阅读(661) 评论(0) 推荐(0) 编辑
摘要:这是在《C专家编程》一书上提到的一个问题。我在网上搜索了一下,找到了一些解法,总结如下。首先是《C专家编程》上提到解法:#define ISUNSIGNED(a) (a>=0 && ~a>=0)#define ISUNSIGNED(type) ((type)0-1 > 0)第二个从类型来判断,没有问题。而第一个只能用在K&R C里,在ANSI C里就不行了。当这个宏被用在int/unsigned int时,没有任何问题。但是当使用在char和short上就会出错。分析: 此宏在int/unsigned int好使的原因是宏中的a的精度始终不会发生变化, 阅读全文
posted @ 2012-03-27 21:10 Mr.Rico 阅读(3266) 评论(1) 推荐(0) 编辑
摘要:内联函数并不总是内联 Inline function是在C++中引入的一种机制,它可以拓展函数代码,避免调用函数的额外开销。在Linux环境下,gcc编译选项必须加上优化选项才能使inline有效。inline与static的关系在这儿有一个比较详细的分析:http://www.cnblogs.com/xkfz007/articles/2370640.html 内联函数(inline)机制与陷阱 内联机制被引入C++作为对宏(Macro)机制的改进和补充(不是取代)。内联函数的参数传递机制与普通函数相同。但是编译器会在每处调用内联函数的地方将内联函数的内容展开。这样既避免了函数调用的开销... 阅读全文
posted @ 2012-03-27 21:09 Mr.Rico 阅读(16710) 评论(0) 推荐(0) 编辑
摘要:const: const 是一个左结合的类型修饰符,它与其左侧的类型修饰符和为一个类型修饰符。const可以用于定义常量,可以限定函数的引用参数(因为传值的参数根本不用限定),可以限定函数返回值为引用的情况。还有一个用法是修饰类的成员函数。这样情况下,在类内的声明和类外的定义都要加上const。 还有一种情况是,声明类的const成员变量的时候,如何进行初始化。在这种情况下,由于常量不能修改,所以只能在构造函数的初始化列表中进行复制初始化。如果同时声明为了static时可以在类外进行初始化,但此时不能加static关键字。mutable: mutalbe的中文意思是"可变的,易变的& 阅读全文
posted @ 2012-03-27 21:09 Mr.Rico 阅读(2945) 评论(0) 推荐(0) 编辑
摘要:在看《你必须知道的496个C语言问题》一书中,提到"达夫设备"这个东西,主要是下面的代码: register n = (count + 7) / 8; /\* count > 0 assumed \*/ switch (count % 8) { case 0: do { \*to = \*from++; case 7: \*to = \*from++; case 6: \*to = \*from++; case 5: \*to = \*from++; case 4: \*to = \*from++; ... 阅读全文
posted @ 2012-03-27 21:08 Mr.Rico 阅读(6404) 评论(3) 推荐(1) 编辑
摘要:下面是一些比较重要的宏定义,记录一下:assert断言:#define assert(cond) ((cond)?(void)0:_assert(#cond,__FILE__,__LINE__)) void _assert(char*cond,char*filename,long lineno) { printf("assert:%s in file:%s, at line:%d\n",cond,filename,lineno); }获得结构体中域的偏移量#define offsetof(type,field) ((int)((char*)&(((type*)0)- 阅读全文
posted @ 2012-03-27 21:07 Mr.Rico 阅读(1060) 评论(0) 推荐(0) 编辑
摘要:Quine 以哲学家 Willard van Orman Quine (1908-2000) 而命名,表示一个可以生成他自己的完全的源代码的程序。编写出某个语言中最简短的 quine 通常作为黑客们的消遣。作为真正的 quine ,有一些约定:程序不能接受输入或者是打开文件,因为那样就可以直接输入源代码或者是把源代码文件直接打开再重新打印出来,就没有什么意思了;同时,一个完全空白的程序(产生完全空白的输出,即没有输出)也并不能称作 quine 。quine 的想法最初出现在 Bratley, Paul and Jean Millo. "Computer Recreations; Se 阅读全文
posted @ 2012-03-27 21:07 Mr.Rico 阅读(8451) 评论(0) 推荐(0) 编辑
摘要:网上搜索了一下,发现检测内存泄漏的工具还是很多的。下面是从网上找到的一些材料,主要是在linux系统中内存泄漏的检测方法。(1)什么是内存内存泄漏? 在此,谈论的是程序设计中内存泄漏和错误的问题,不过,并不是所有的程序都有这一问题。首先,泄漏等一些内存方面的问题在有的程序语言中是不容易发生的。这些程序语言一般都认为内存管理太重要了,所以不能由程序员来处理,最好还是由程序语言设计者来处理这些问题,这样的语言有Perl、Java等等。 然而,在一些语言(最典型的就是C和C++)中,程序语言的设计者也认为内存管理太重要,但必需由开发人员自己来处理。内存泄漏指的是程序员动态分配了内存,但是在... 阅读全文
posted @ 2012-03-27 21:05 Mr.Rico 阅读(1090) 评论(0) 推荐(0) 编辑
摘要:先通过一个小程序来看一看: #include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at [%X]n", z, &z); } int main(int argc, char *argv[]) { foo(100, 200, 300); return 0; }运行结果:x = 100 at [... 阅读全文
posted @ 2012-03-27 21:04 Mr.Rico 阅读(30227) 评论(1) 推荐(6) 编辑
摘要:线性同余随机数生成器介绍:古老的LCG(linearcongruentialgenerator)代表了最好最朴素的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。LCG 算法数学上基于公式:X(n+1)=(a*X(n)+c)%m其中,各系数为:模m,m>0系数a,0<a<m增量c,0<=c<m原始值(种子)0<=X(0)<m其中参数c,m,a比较敏感,或者说直接影响了伪随机数产生的质量。一般而言,高LCG的m是2的指数次幂(一般2^32或者2^64),因为这样取模操作截断最右的32或64位就可以了。多数编译器的库中使用了该理论实现其伪随机 阅读全文
posted @ 2012-03-27 21:03 Mr.Rico 阅读(24799) 评论(0) 推荐(3) 编辑
摘要:编译器的发展:上世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如现在所称的Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序 阅读全文
posted @ 2012-03-27 21:01 Mr.Rico 阅读(4137) 评论(0) 推荐(0) 编辑
摘要:1. 关键字volatile有什么含意?并给出三个不同的例子。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:(1)并行设备的硬件寄存器(如:状态寄存器) (2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) (3) 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式 阅读全文
posted @ 2012-03-27 20:54 Mr.Rico 阅读(954) 评论(0) 推荐(0) 编辑
摘要:这是一篇从网上看到的一篇文章,讲得挺有道理。记录下来。(1) 精英化趋势 C++是一门引起无数争议的语言。眼下最常听到的声音则是C++将趋于没落,会被某某语言取代。我很怀疑这种论调的起点是商业宣传,C++的真实趋势应该是越来越倾向于精英化。精英化是指在可用可不用C++的领域中,C++将逐渐退出,而所有剩下必须用C++的领域通常都是附加值比较高,难度较高的领域,比如:操作系统,数据库,大型网站后端等。这一过程造成的现象就是在TIOBE上,C++的份额逐步下降。但就像经济上挤泡沫一样,这倒不是C++衰落了,而是原本人们对C++的期望过高了。早在1995年,美国的调查机构就曾经预测:"终端 阅读全文
posted @ 2012-03-27 20:45 Mr.Rico 阅读(1414) 评论(0) 推荐(0) 编辑
摘要:C和C++之间的关系非常的密切,我们也都知道C++是从C扩充而来的,但是这并不表示C++对C完全兼容。C++并不是C的超集,C的有些特性在C++中并不适用。看完《C专家编程》之后,从中了解到了几个。简单总结一下。 (1)在C++中,用户代码不能调用main函数,但在C语言中却是允许的。(所以可以递归调用main函数)比如:#include <stdio.h>int a=5;int main(){if(a==0)return 0;else{printf("call main again:%d\n",a);a--;main();}return 0;}输出如下:cal 阅读全文
posted @ 2012-03-12 15:33 Mr.Rico 阅读(1093) 评论(0) 推荐(0) 编辑
摘要:对于下面的程序:View Code #include<iostream>#include<string>usingstd::string;//usingstd::size_t;usingstd::endl;usingstd::cout;classItem_base{public:Item_base(conststring&book="",doublesales_price=0.0):isbn(book),price(sales_price){cout<<"base:constructor"<<end 阅读全文
posted @ 2012-03-05 11:34 Mr.Rico 阅读(358) 评论(0) 推荐(0) 编辑