C/C++
文章平均质量分 57
CNnumen
If i want , i must try...
展开
-
高效程序员的45个习惯总结...
<br /><br />1. 不管路走了多远,错了就要重新返回<br />文章上来就引用了一句土耳其的谚语“不管路走了多远,错了就要重新返回”, 这个说的容易, 做起来真的很难,尤其是已经做了很多的时候, 放弃真的很不舍得…所以在开发一个软件之前最好要把需求整明确了, 而且开发过程中过段时间就要停下来审视一下目前的工作符不符合需求,也就是敏捷开发中常说的多和客户进行沟通, 及早发现问题, 修改起来代价也小…<br />说到开发过程中过段时间就要审视的问题, 我又想到之前遇到的问题, 就是开始时为了赶原创 2011-03-18 12:23:00 · 1427 阅读 · 1 评论 -
递归求解最大公约数...
<br />#include <cstdlib>#include <iostream>using namespace std;int gcd(int m, int n){ if(m % n == 0) return n; return gcd(n, m % n);}int main(int argc, char *argv[]){ int m = 128, n = 100; cout << gcd(m, n)原创 2010-07-27 15:55:00 · 1025 阅读 · 0 评论 -
声明虚函数的限制...
【1】只能用virtual声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数。 【2】一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同参数(个数与类型)和函数返回值类型的同名函数。 【3】静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。 【4】inline函数不能是虚函数,因为inline函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时,仍将其视为非inline的。转载 2010-07-27 15:02:00 · 745 阅读 · 0 评论 -
strcpy, memcpy实现...
<br />static char * strcpy(char *dest, const char *src){ assert(dest != NULL && src != NULL); char *ret = dest; while ((*dest++ = *src++) != '/0'); return ret;} <br /> <br />memcpy实现:<br /> <br />#include <cstdlib>#include <iostre原创 2010-07-27 14:34:00 · 724 阅读 · 0 评论 -
数字转string的几种方法...
<br />#include <cstdlib>#include <iostream>#include <string>#include <sstream>using namespace std;const int MAX = 100;/*frist method*/inline void numToString0(int value){ string str; char buf[MAX]; sprintf(buf, "%d", va原创 2010-07-27 09:12:00 · 10114 阅读 · 0 评论 -
cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
<br /><br />1、cin<br />1、cin.get()<br />2、cin.getline()<br />3、getline()<br />4、gets()<br />5、getchar()<br />1、cin>> <br />用法1:最基本,也是最常用的用法,输入一个数字:<br />#include <iostream><br />using namespace std;<br />main ()<br />{<br />int a,b;<br />cin>>a>>b转载 2010-07-26 23:27:00 · 517 阅读 · 0 评论 -
signed和unsigned的比较
<br />unsigned int i=3;<br />cout<<i * -1;问结果是多少。 第一反应:-3。不过结果似乎不是这样的,写了个程序,运行了一下,发现是:4294967293。很诡异的一个数字,怎么也想不明白为什么会是这么个奇怪的数字。但是在我发现这数的十六进制数是FFFFFFFD时,我想我已经离答案很近了... 这个涉及到了混合着不同数据类型的表达式中的数据类型的转换问题。在总结转换问题之前,先说明一下各种数据类型(只说明numeric类型的),下表来自MSDN:Type NameByt转载 2010-07-23 09:07:00 · 739 阅读 · 0 评论 -
C语言要点总结(二)...
<br /> <br />1.malloc()函数和calloc()函数的区别是前者不初始化所分配的内存空间,而后者会初始化所分配的内存空间的每一位为零。<br /> <br />2.在程序退出main()函数后,要想在进行一些操作,需要借助C库函数atexit()。利用atexit()函数可以在程序终止前完成一些其他的操作。如果将一组函数指针传递给atexit()函数,那么在程序退出main()函数后(此时程序还未终止)就能自动调用这组函数,在使用atexit()函数时要注意:<br />(1)由atex原创 2010-07-21 00:00:00 · 619 阅读 · 0 评论 -
交换a和b...
<br />#include <cstdlib>#include <iostream>using namespace std;void swap(int &a, int &b){ a = a ^ b; b = b ^ a; a = a ^ b; }int main(int argc, char *argv[]){ int a = 9; int b = 10; swap(a, b);原创 2010-07-23 16:23:00 · 504 阅读 · 0 评论 -
C语言要点总结(二)...
<br /> <br />1.连接运算符”##”可以把两个独立的字符串连接成一个字符串。在C的宏中,经常用到”##”运算符。如下:<br />#include <cstdlib>#include <iostream> using namespace std; #define CREATE(name) create ## name int createInt(){ return rand();} float createFloat(){原创 2010-07-22 00:19:00 · 499 阅读 · 0 评论 -
assert用法...
<br /> <br />ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序: <br /> ...... <br /> ASSERT( n != 0); <br /> k = 10/转载 2010-07-27 15:23:00 · 1134 阅读 · 0 评论 -
逆序输出字符串(递归实现)
<br />#include <cstdlib>#include <iostream>#include <cstdio>using namespace std;void rDisplay(char *str){ if(*str != '/0') rDisplay(str + 1); printf("%.*s", 1, str);}int main(int argc, char *argv[]){ char str[] = {"1原创 2010-08-12 07:16:00 · 2507 阅读 · 0 评论 -
不使用sizeof, 计算int的位数...
<br />#include <cstdlib>#include <iostream>using namespace std;int __sizeof(){ unsigned int i = ~0; int count = 0; while(i) { i &= (i - 1); count++; } return count;}int main(int argc,原创 2010-10-12 16:01:00 · 1482 阅读 · 0 评论 -
合并两个链表递归和非递归实现
<br />#include <cstdlib>#include <iostream>using namespace std;const int LIST_LENGHT = 10;typedef struct _NODE{ int value; struct _NODE *next; _NODE(int val) : value(val), next(NULL){}}NODE, *PTRNODE;void createList(PTRNO原创 2010-09-29 14:24:00 · 1613 阅读 · 0 评论 -
寻找倒数第K个节点...
<br />#include <cstdlib>#include <iostream>using namespace std;typedef struct _NODE{ int value; struct _NODE *next; _NODE(int val) : value(val), next(NULL){}}NODE, *PTRNODE;void createList(PTRNODE &head){ PTRNODE cur原创 2010-09-26 09:38:00 · 1150 阅读 · 0 评论 -
C语言18个经典问题答录
<br />1.这样的初始化有什么问题?char *p = malloc(10); 编译器提示“非法初始式” 云云。<br /><br />答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量) 的初始式中。<br />因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请的内存地址是在运行时确定的。<br /><br />2. *p++ 自增p 还是p 所指向的变量?<br /><br />答:后缀++ 和-- 操作符本质上比前缀一目操作的优先级高, 因此*p++转载 2010-09-06 15:20:00 · 791 阅读 · 0 评论 -
关于内存中栈和堆的区别
<br /><br />1、内存分配方面:<br /> 堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式是类似于链表。可能用到的关键字如下:new、malloc、delete、free等等。<br /> 栈:由编译器(Compiler)自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。<br />2、申请方式方面:<br /> 堆:需要程序员自己申请,并指明大小。在c中malloc函数如p1 =转载 2010-09-14 22:51:00 · 1026 阅读 · 1 评论 -
程序的内存映像
一个由C/C++编译的程序的内存分布分为以下几个部分:1、 栈(stack):也是我们所说的堆栈,是由编译器自动分配释放,用来存放函数参数值,函数的返回地址,非静态局部变量的值等。其操作方式类似于数据结构中的栈(后进先出LIFO)。2、 堆(Heep):一般由程序员分配释放,若程序员不释放,程序结束可能由OS回收。3、 全局区(静态区):全局变量和静态变量存储在这一块,初始化的全局变量河静态变量放在一块区域,未初始化的全局变量静态变量放在相邻的另一块区域(BSS)。程序结束后由系统释放。4、 文字常转载 2010-09-14 17:44:00 · 6451 阅读 · 1 评论 -
计算结构体成员地址偏移量...
<br />计算一个结构体成员变量地址相对结构体的偏移量...<br /> <br />#include <cstdlib>#include <iostream>using namespace std;typedef struct _NODE{ int a; int b[20]; char c;}NODE;#define FIND(struc, a) (size_t)(&(((struc*)0)->a))int main(int argc, char原创 2010-09-01 17:52:00 · 2027 阅读 · 2 评论 -
const用法小结
<br /><br />1. const常量,如const int max = 100; <br />优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)<br />2. const 修饰类的数据成员。如:<br />class A<br />{<br /> const int size;<br /> … <br />}<br />const转载 2010-09-12 22:58:00 · 644 阅读 · 0 评论 -
字节对齐...
<br /><br />编译器为程序分配内存时,为什么要进行字节对齐?什么时候进行字节对齐?<br />对如下声明:<br />char a[17];<br />int i;<br />其中i为4字节长度,若编译器对齐方式为4字节,是不是要分配24字节,其中头17个分配给字符型数组a,中间空3字节,后4字节分配给i?这么做有什么好处?<br />--------------------------------------------------------------------------------<b转载 2010-08-23 16:45:00 · 677 阅读 · 0 评论 -
不用sizeof(), 判断系统是32位还是16位...
<br />#include <cstdio>#include <cstdlib>#include <iostream>using namespace std;int main(){ unsigned int a = ~0; if( a>65536 ) { cout<<"32 bit"<<endl; } else { cout<<"16 bit"<<endl; }原创 2010-07-23 14:44:00 · 1067 阅读 · 0 评论 -
Big Endian和Little Endian的转换...
<br />#include <iostream>using namespace std;#define swap(a) a = ((unsigned int)a >> 24) | ((unsigned int)a >> 8) & 0x0000ff00 | (a << 8) & 0x00ff0000 | (a << 24)int main(){ int a = 0x12345678; swap(a); cout << hex << a << endl;原创 2010-07-23 13:08:00 · 919 阅读 · 0 评论 -
C++易错知识点总结(二)...
<br />1.有些类需要完全禁止对象之间的复制。比如iostream类就不允许复制,这时,类必须显示声明其复制构造函数为private类型的。<br /> 如果复制构造函数是私有的,将不允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。<br /> 然而,类的友元函数和成员函数仍然可以进行复制,如果想要有元和成员函数也不能复制对象,就可以声明一个private类型的复制构造函数但不对其进行定义。<br /> 声明而不定义成员函数是合法的。但是,任何使用未定义原创 2010-07-14 19:59:00 · 762 阅读 · 0 评论 -
C语言要点总结(一)
<br /><br />1.在函数参数的声明中,数组名被编译器当做指向数组第一个元素的指针,因此不能够通过在函数中使用sizeof(array_name) / sizeof(type)求数组的大小,而是应该通过参数将数组的大小传递给调用函数.<br /> <br />2.当字符串常量出现在表达式中时,它的值是指针常量。编译器把该字符串的一份拷贝存储在内存中的某个位置,并存储一个指向第一个字符的指针,我们可以对字符串常量进行下标引用,间接访问以及指针运算。<br />如:<br />#include <ios原创 2010-07-15 23:52:00 · 781 阅读 · 0 评论 -
复制构造函数, 复制操作符重载, 析构函数使用...
#ifndef _SD_STRING_H_#define _SD_STRING_H_#include using namespace std;class SDString{public: SDString(); SDString(char *str); SDString(const SDString &str); ~SDString(); SDString&原创 2010-07-15 14:15:00 · 992 阅读 · 3 评论 -
c++异常示例
<br />#include <cstdlib>#include <iostream>using namespace std;int test(int val){ if(val == 0) throw 1.0; return 100 / val;} int main(int argc, char *argv[]){ try { test(0); }原创 2010-07-13 09:23:00 · 605 阅读 · 0 评论 -
编程性能优化...
<br /><br />性能优化<br />第1节中已经提到过快速原则1:尽量减少对数据的复制。在这一节将讨论更多的提高程序执行速度的方法。<br />快速原则2:尽量利用先前算出的结果。<br />比如说计算数列:1,1,2,3,5,8,13„„的第n位,即f(0)=f(1)=1,f(n)=f(n-1)+f(n-2),最直观的代码就是这样:<br />int f(int n){<br />if(n==0 || n==1)return 1;<br />else return f(n-1)+f(n-2);<b转载 2010-07-13 09:17:00 · 485 阅读 · 0 评论 -
如何用栈实现递归与非递归的转换
<br />如何用栈实现递归与非递归的转换<br /><br />一.为什么要学习递归与非递归的转换的实现方法?<br /> 1)并不是每一门语言都支持递归的.<br /> 2)有助于理解递归的本质.<br /> 3)有助于理解栈,树等数据结构.<br /><br />二.递归与非递归转换的原理.<br /> 递归与非递归的转换基于以下的原理:所有的递归程序都可以用树结构表示出来.需要说明的是,<br />这个"原理"并没有经过严格的数学证明,只是我的一个猜想,不过在至少在我遇到的例子中是适转载 2010-07-12 14:40:00 · 1222 阅读 · 0 评论 -
精通递归程序设计
<br /><br />递归的经典示例<br />计算阶乘是递归程序设计的一个经典示例。计算某个数的阶乘就是用那个数去乘包括 1 在内的所有比它小的数。例如,factorial(5) 等价于5*4*3*2*1,而 factorial(3) 等价于 3*2*1。<br />阶乘的一个有趣特性是,某个数的阶乘等于起始数(starting number)乘以比它小一的数的阶乘。例如,factorial(5) 与 5 * factorial(4) 相同。您很可能会像这样编写阶乘函数:<br />清单 1. 阶乘函数转载 2010-07-12 12:02:00 · 906 阅读 · 0 评论 -
C++易错知识点总结(一)...
<br />1. 在类内部定义的函数默认为inline类型的<br /> <br />2. 类的有些成员必须在构造函数初始化列表中进行初始化。对于这样的成员,在构造函数函数体中对他们赋值不起作用。这样类型的成员有:没有默认构造函数的类类型的成员,const或引用类型的成员(不管他们本身是什么类型的,如int &a或是string &a),都必须在构造函数初始化列表中进行初始化。如下例:<br />#include <cstdlib>#include <iostream>#include <str原创 2010-07-11 09:13:00 · 4648 阅读 · 0 评论 -
类斐波那契问题....
<br />若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛?<br /> <br /> <br />先写出函数表达式:f(n)=f(n-1)+f(n-3) <br />为什么f(n)=f(n-1)+f(n-3)呢,请看:<br />f(n)-f(n-1)=f(n-3)<br />因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。<br /> <br /> <br />递归实现(假设第一年有原创 2010-07-12 10:53:00 · 900 阅读 · 0 评论 -
strtok使用...
/* strtok example */#include #include #include #include using namespace std;int main(int argc, char *argv[]){ char str[] = "This#is only!a.test_for+strtok"; char *pCur; cout原创 2010-07-15 09:47:00 · 674 阅读 · 0 评论 -
滚动数组实现斐波那契数列...
<br />#include <cstdlib>#include <iostream>using namespace std;int main(int argc, char *argv[]){ int index; cout << "please input the index you want to cal: "; cin >> index; int a[2] = {0, 1}; int i; fo原创 2010-07-15 09:18:00 · 1088 阅读 · 0 评论 -
C语言深度剖析总结(一)
<br /> <br /> <br />1.register关键字请求编译器尽可能的将变量存储在CPU内部寄存器中而不是内存中以提高访问效率。<br />数据从内存中取出来首先放到寄存器中,然后CPU再从寄存器中读取数据来进行处理,处理完后同样通过寄存器放到内存中, CPU不直接和内存打交道。<br />Register的值必须是一个单个的值,并且其长度应小于或等于int的长度,而且register变量可能不放在内存中,所以不能用取地址符(&)来获取register变量的地址。<br /> <br />2.原创 2010-07-23 13:04:00 · 613 阅读 · 0 评论 -
讲讲volatile的作用
<br />一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: <br /> 1). 并行设备的硬件寄存器(如:状态寄存器) <br /> 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) <br /> 3). 多线程应用中被几个任务共享的变量转载 2010-07-19 09:29:00 · 481 阅读 · 0 评论 -
字符串匹配...
<br />#include <cstdlib>#include <iostream>using namespace std;int const MAX = 100;int strMatch(char *target, char *pat){ assert(target != NULL && pat != NULL); char *ptrTar = target; char *ptrPat = pat; int index = 0, t原创 2010-07-18 16:33:00 · 560 阅读 · 0 评论 -
strcpy实现
<br />#include <cstdlib>#include <iostream>#include <cstring>using namespace std;char *_strcpy(char *strDest, const char *strSrc){ assert(strDest != NULL && strSrc != NULL); const char *ptrSrc = strSrc; char *ptrDest = strDes原创 2010-07-20 17:23:00 · 1898 阅读 · 0 评论 -
C++要点(四)-函数模板和类模板
1.函数模板可以用与非模板函数一样的方式声明为inline。说明符放在模板形参之后,函数返回值之前,不能放在关键字template之前,格式如下:Template inline void fun(T t);2. 模板在实例化的时候,编译器必须能够访问定义模板的源代码。当调用函数模板或类模板的成员函数的时候,编译器需要函数定义,需要那些通常放在源文件中的代码。这个要求使得我们要把函数或类的声明和定义放在同一个文件中,要是想把声明和实现分开,可以使用export关键字。对于函数模板,使用方法如下:在函数模板的定原创 2010-07-19 10:29:00 · 733 阅读 · 0 评论 -
C++要点(五)-多重继承和虚继承
<br /><br />1.在多重继承中,构造函数的初始化式只能控制用于初始化基类的值,不能控制基类的构造次序。基类的构造次序按照基类构造函数在类派生列表中出现的次序调用,如下:<br />class Dirve : public A, public B, public C<br />{<br />pulbic:<br /> Dirve() : A(),C(), B(){}<br />};<br />则基类构造函数调用的次序是A, B, C 而不是初始化列表中的A, C, B<br />析构函数原创 2010-07-20 15:16:00 · 508 阅读 · 0 评论