- //============================================================================
// Name : ProTest.cpp // Author : Binbin.Song // Version : // Copyright : 2012 SoftWare Inc. // Description : C++, Ansi-style //============================================================================ #include #include #include #include #include using namespace std; #define CUBE(i) ((i) * (i) * (i)) #define FOUTH(i) ((i) * (i) * (i) * (i)) int main() { //eg1.自增自减 /********************************************************* int a,b,c,d; a=10; b=a++; c=++a; d=10*a++; //10, 12, 120 //a++在使用a之后给a加一, ++a在使用a之前给a+1 cout << "b, c, d:"<<b<<","<<c<<","<<d<<endl; ***********************************************************/ //eg2.结构体和共用体 /********************************************************* typedef union { long i; int k[5]; char c; } DATE; struct data { int cat; DATE cow; double dog; }; DATE max; //union共用一块内存,其内存的大小为其成员中占用存储空间最大的成员所占用的大小,DATE的内存大小为 4*5=20 //结构体struct data的大小为其成员所占的存储空间的大小,其大小为:4 + 20 + 8 = 32; printf("%d\n",sizeof(struct data)+sizeof(max)); ***********************************************************/ //eg3.函数指针 /********************************************************* int inc(int a) { return(++a); } int multi(int* a,int* b,int* c) { //11*10 return(*c =*a * *b); } typedef int(FUNC1)(int in); // 定义函数指针FUNC1指向参数为整型返回指为整型的函数 typedef int(FUNC2) (int*,int*,int*);// 定义函数指针FUNC1指向参数为三个整型指针返回指为整型的函数 void show(FUNC2 fun,int arg1, int*arg2) { FUNC1 pf = &inc; int temp = pf(arg1); //arg1 = 10, temp = 11, arg2 = ?? fun(&temp,&arg1, arg2); //arg1 = 10, temp = 11, arg2 = 110 printf("%d\n",*arg2); } int a; //局部变量a为0; show(multi,10,&a); ***********************************************************/ //eg4.字符串逆转 /********************************************************* char str[] = "12345"; doExchange(str); void doExchange(char* str) { int len = strlen(str); cout << "strlen(str):" << len << endl;; char temp; for(int i = 0; i < len/2; i++) { temp = str[i]; str[i] = str[len - i - 1];1,4,2,5,2,6,8,3,9 str[len - i - 1] = temp; } } cout <<"str = " <<str << endl; ***********************************************************/ //eg5.指针的运算 /********************************************************* unsigned char *p1; unsigned long *p2; cout << "=======" < (y) ? (x) : (y)) #define MIN(X, Y) ((X) > (Y) ? (Y) : (X)) int a = 3, b = 5; SWAP(a, b) int max = MAX(a, b); cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "MAX(a, b) = " << max << endl; ***********************************************************/ //eg7.算法1(数组中存放n ~ n-1 个数,有一个数被重放了一次,求这个数,时间复杂度 O(n)) /********************************************************* int array[5] = {1,2,2,3,4}; int sumArray = 0, sum = 0; for(int i = 0; i < 5; i++) { sumArray += array[i]; } sum = 5*(5 - 1)/2; int num = sum - sumArray; cout << "number is:" << num <<endl; ***********************************************************/ //eg8.算法2(判断一个数是不是2的n次幂,一行代码实现) /********************************************************* //位与为0,则表示是2的若干次幂 int i = 2; cout << ((i & (i - 1)) ? false : true) << endl; ***********************************************************/ //eg9.sizeof 和 strlen /********************************************************* char str[] = {"hello"}; char *ptr = str; //sizeof为运算符,当其参数为数组时,返回数组的大小,当其参数为指针时,返回指针类型大小4 //sizeof计算常量自字符串时包括系统自动添加的\0 //当数组作为函数参数时,退化为函数指针 //输出结果为:5 6 5 4 cout<< "strlen(str) = " << strlen(str) << endl; cout<< "sizeof(str) = " << sizeof(str) <<endl; cout<< "strlen(str) = " << strlen(ptr) << endl; cout<< "sizeof(str) = " << sizeof(ptr) <<endl; ***********************************************************/ //eg10.数组指针 /********************************************************* //a为数组指针,给其地址加1时系统会做加一个数组位移处理(4 * 5),所以(&a+1)指向数组a末位的下一地址 //当强制转换为int时,则 a - 1 只移动一个整数位 //输出结果:2,5 int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); ***********************************************************/ //eg11.位域的计算 /********************************************************* //位域指在内存中只占某些特定位的一类数据结构,为原子化数据单元 //SS中s1占前两位,s2占2~4三位,s3占5~7三位 //采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节, //而Big-endian模式对操作数的存放方式是从高字节到低字节。也就是说 //Big-endian模式符合人的习惯,而Little-endian更加方便计算机操作。 //例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为: //内存地址 0x4000 0x4001 //存放内容 0x34 0x12 //而在Big-endian模式CPU内存中的存放方式则为: //内存地址 0x4000 0x4001 //存放内容 0x12 0x34 union { struct { unsigned int s1:2; unsigned int s2:3; unsigned int s3:3; }SS; unsigned int v; }U; U.v = 15; //union共用一块内存,所以struct里存放的就是union成员v的二进制位 //15的二进制为:1111,则U在内存中的存放形式为(大端):00000000 00000000 00000000 00001111 (小端):11110000 00000000 00000000 00000000 cout << "U.SS.s1 = " << U.SS.s1 <<endl; cout << "U.SS.s2 = " << U.SS.s2 <<endl; cout << "U.SS.s3 = " << U.SS.s3 <<endl; ***********************************************************/ //eg12.判断大小端的方法 /********************************************************* //计算机读取地址的方式是从底地址开始,向高地址移动,要判断一个机器是打断还是小端,则可通过存储int a = 1; //来看其地地址存放的是不是1,如果存放的是1,则证明是小端,如果不是1则证明是大端 //方法1(利用强制转换) int i = 1; char* p = (char*)&i; if(*p == 1) { cout << "Little-endian"<<endl; } else { cout << "Big-endian"<<endl; } //方法2(利用共用体特性) union { int a; char b; }U; U.a = 1; if(U.b == 1) { cout << "Little-endian"<<endl; } else { cout << "Big-endian"<<endl; } ***********************************************************/ //eg13.交换两个变量的值,不使用中间变量 //方法一(加减法) /********************************************************* int a = 3, b = 5; a = a + b; b = a - b; a = a - b; cout << "a = " << a << endl; cout << "b = " << b << endl; //方法二(异或) a = a ^ b; b = a ^ b; //a ^ b ^ b = a a = a ^ b; //a ^ b ^ a = b cout << "a = " << a << endl; cout << "b = " << b << endl; ***********************************************************/ //eg14.实现strcpy函数 /********************************************************* char str1[] = "sssss"; char str2[] = "jjjjj"; char *strcpy(char *dest, const char *src) { char* address = dest; while((*address++ = *src++) != '\0'); return address; } strcpy(str1, str2); cout << str1 < right) { return -1; } if(element == array[mid]) { return mid; } else if(element < array[mid]) { return Search(array, element, left, mid - 1); } else { return Search(array, element, mid + 1, right); } } //非递归 int Search(int array[], int element, int n) { int left = 0, right = n; int mid; while((left <= right)) { mid = (left + right) / 2; if(array[mid] == element) { return mid; } else if(element < array[mid]) { right = mid -1; } else { left = mid + 1; } } return -1; } int n = Search(array, 5, 9); cout << n < 0 ? num : -num); while(temp){ temp /= 10; count++;} temp = num > 0 ? num : (count++, -num); *(str + count) = '\0'; while(count > 0) { *(str + (--count)) = temp % 10 + '0'; temp /= 10; } return num > 0 ? str : (str[0] = '-', str); } char *ltoa(const long long num, char* str) { int count = 0; long long temp = (num > 0 ? num : -num); while(temp){ temp /= 10; count++;} temp = num > 0 ? num : (count++, -num); *(str + count) = '\0'; while(count > 0) { *(str + (--count)) = temp % 10 + '0'; temp /= 10; } return num > 0 ? str : (str[0] = '-', str); }
const char* str = "-2147483647"; long number = atoi(str); cout << number << endl; long long num = -32147483647L; char array[16]; char* strr = array; str = ltoa(num, str); cout << "结果是:" << strr << endl; ***********************************************************/ //eg18. 联合 /********************************************************* //赋值为0x4241,则在内存中存放的顺序是0x41 0x42 转换为十进制则为 65 66 A B //由于联合与结构体共用内存,而第二次赋值在内存中存放为b a 98 97 转换为十进制6261 union {//定义一个联合 int i; struct {//在联合中定义一个结构 char first; char second; }half; }number; number.i=0x4241; //联合成员赋值 printf("%c%c\n", number.half.first, number.half.second); number.half.first='a'; //联合中结构成员赋值 number.half.second='b'; printf("%x\n", number.i); ***********************************************************/ return 0; }
|