本文共 4417 字,大约阅读时间需要 14 分钟。
int fun(int n){ int count = 0; while(n) { count++; n &= n-1; } return count;}
!(x&(x-1))
int fun(int x, int y){ return (x & y) + ((x ^ y) >> 1);}
int fun(int a, int b){ return ((a+b) + abs(a-b))/2;}
inline int max(int a, int b) { return a >= b ? a : b; };inline int min(int a,int b) { return a <= b ? a : b; };inline int medium(int a, int b, int c){ int t1 = max(a, b); int t2 = max(b, c); int t3 = max(a, c); return min(t1, min(t2, t3));}
void fun(int &a, int &b){ a = a ^ b; b = a ^ b; a = a ^ b;}
C++语言支持函数重载,C语言不支持函数重载。
用于解决名字匹配问题。防止头文件被重复引用。
#define
需要注意括号的使用,例如
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
int b = 500;const int *a = &b; //情况1int const *a = &b; //情况2int* const a = &b; //情况3const int* const a = &b //情况4
对于情况1和2,则const用来修饰指针所指向的变量,这种情况下不允许对内容进行更改:
*a = 600; //错误
但是有其他方法可以改变*a
的值:
int b = 500, c = 600;const int *a = &b;a = &c; //方式1a = 800; //方式2
对于情况1和2,可以先不进行初始化。虽然指针指向的内容是常量,但是指针本身不是常量。
const int *a; //正确
对于情况3,定义时必须同时初始化:
int b = 500, c = 600;int* const a; //错误,没有初始化int* cosnt a = &b; //正确,必须初始化*a = 600; //正确,允许改值cout< <
对于情况4,指针本身和指向的内容均为常量。
任何不修改成员数据的函数都应该声明为const函数。
const声明必须出现在函数的声明和函数的实现里,否则编译器会把它看成一个不同的函数。
C++可以用const或者#define定义常量,但是前者比后者有更多的优点:
char *ss1 = "0123456789"; //sizeof(ss1)=4,指针大小为定值4char ss2[] = "0123456789"; //sizeof(ss2)=11char ss3[100] = "0123456789"; //sizeof(ss3)=100int ss4[100]; //sizeof(ss4)=400char q1[]="abc"; //sizeof(q1)=4char q2[]="a\n"; //sizeof(q2)=3,'\n'为一位char* q3 = "a\n"; //sizeof(q3)=4char *str1=(char*)malloc(100); //sizeof(str1)=4void *str2=(void*)malloc(100); //sizeof(str2)=4
对于结构体,结构体的长度一定是最长的数据元素的整数倍。结构体对齐参数按默认的8字节对齐。
struct{ short a1; short a2; short a3;}A; //sizeof(A)=6struct{ long a1; short a2;}B; //sizeof(B)=8
空的类是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。
类内部的成员变量:
类内部的成员函数:
struct也可以有构造函数、析构函数,之间也可以继承。唯一的不同是struct里面默认的访问控制是public,class中默认的访问控制是private。
继承方式 | 对派生类可见性 | 对派生类对象可见性 | 作为派生类对象时状态 |
---|---|---|---|
public | 公有和保护 | 公有的可见 | 保持原状态 |
protected | 公有和保护 | 都不可见 | 保护 |
private | 公有和保护 | 都不可见 | 私有 |
printf("%f", 5); // 0.000000printf("%d", 5.01); //一个大数
unsigned int i = 0; i -= 1; // i=65535=pow(2,8) - 1;
#define BIT3 (0x1 << 3)static int a;void set_bit3(){ a |= BIT3;}void clear_bit3(){ a ^= BIT3;}
int *pa = NULL;int *pb = pa + 15;printf("%x", pb);return 0;
语法与const一样,但是volatile的意思是在编译器认识的范围外,这个数据可以被改变。(该变量可能会被意想不到地改变)
int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa66;
转载地址:http://shaex.baihongyu.com/