摘要:
这个是在《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
阅读(682)
评论(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
阅读(3308)
评论(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
阅读(16741)
评论(0)
推荐(0)
摘要:
const: const 是一个左结合的类型修饰符,它与其左侧的类型修饰符和为一个类型修饰符。const可以用于定义常量,可以限定函数的引用参数(因为传值的参数根本不用限定),可以限定函数返回值为引用的情况。还有一个用法是修饰类的成员函数。这样情况下,在类内的声明和类外的定义都要加上const。 还有一种情况是,声明类的const成员变量的时候,如何进行初始化。在这种情况下,由于常量不能修改,所以只能在构造函数的初始化列表中进行复制初始化。如果同时声明为了static时可以在类外进行初始化,但此时不能加static关键字。mutable: mutalbe的中文意思是"可变的,易变的& 阅读全文
posted @ 2012-03-27 21:09
Mr.Rico
阅读(2965)
评论(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
阅读(6484)
评论(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
阅读(1074)
评论(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
阅读(9530)
评论(0)
推荐(0)
摘要:
网上搜索了一下,发现检测内存泄漏的工具还是很多的。下面是从网上找到的一些材料,主要是在linux系统中内存泄漏的检测方法。(1)什么是内存内存泄漏? 在此,谈论的是程序设计中内存泄漏和错误的问题,不过,并不是所有的程序都有这一问题。首先,泄漏等一些内存方面的问题在有的程序语言中是不容易发生的。这些程序语言一般都认为内存管理太重要了,所以不能由程序员来处理,最好还是由程序语言设计者来处理这些问题,这样的语言有Perl、Java等等。 然而,在一些语言(最典型的就是C和C++)中,程序语言的设计者也认为内存管理太重要,但必需由开发人员自己来处理。内存泄漏指的是程序员动态分配了内存,但是在... 阅读全文
posted @ 2012-03-27 21:05
Mr.Rico
阅读(1109)
评论(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
阅读(30404)
评论(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
阅读(25176)
评论(0)
推荐(4)
摘要:
编译器的发展:上世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如现在所称的Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序 阅读全文
posted @ 2012-03-27 21:01
Mr.Rico
阅读(4282)
评论(0)
推荐(0)
摘要:
1. 关键字volatile有什么含意?并给出三个不同的例子。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:(1)并行设备的硬件寄存器(如:状态寄存器) (2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) (3) 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式 阅读全文
posted @ 2012-03-27 20:54
Mr.Rico
阅读(982)
评论(0)
推荐(0)
摘要:
这是一篇从网上看到的一篇文章,讲得挺有道理。记录下来。(1) 精英化趋势 C++是一门引起无数争议的语言。眼下最常听到的声音则是C++将趋于没落,会被某某语言取代。我很怀疑这种论调的起点是商业宣传,C++的真实趋势应该是越来越倾向于精英化。精英化是指在可用可不用C++的领域中,C++将逐渐退出,而所有剩下必须用C++的领域通常都是附加值比较高,难度较高的领域,比如:操作系统,数据库,大型网站后端等。这一过程造成的现象就是在TIOBE上,C++的份额逐步下降。但就像经济上挤泡沫一样,这倒不是C++衰落了,而是原本人们对C++的期望过高了。早在1995年,美国的调查机构就曾经预测:"终端 阅读全文
posted @ 2012-03-27 20:45
Mr.Rico
阅读(1462)
评论(0)
推荐(0)
摘要:
const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。 例如: const int nValue; //nValue是const int const nValue; //nValue是const 但是对于指针类型的TYPE,不同的写法会有不同情况: (1) 指针本身是常量不可变 (char*) const pConte... 阅读全文
posted @ 2012-03-27 14:40
Mr.Rico
阅读(30643)
评论(3)
推荐(18)
摘要:
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。 Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、Const作用 如下表所示: No. 作用 说明 参考代码 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,... 阅读全文
posted @ 2012-03-27 14:30
Mr.Rico
阅读(7692)
评论(0)
推荐(2)

浙公网安备 33010602011771号