21.printf()的返回值为打印字符的个数。
22.头文件写法:
#ifndef __ADD_H__
#define __ADD_H__
int ADD(int x,int y);
#endif
23.递归:
//求阶乘
int factorial(int n){
if(n<=1) //递归出口
return 1;
else
return n*factorial(n-1);
}
//斐波那契数列:指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)。(后一个数为前两个数之和)
//求第n个斐波那契数
int Fib(int n){
if(n==0)
return 0;
else if(n==1 || n==2)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
//非递归形式
int Fib(int n){
int a = 1, b = 1;
int c = 1;
while (n > 2){
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
24.在定义二维数组时,行下标可以省略,列下标不能省略。 如:int arr[][4];
25.数组作为函数参数时,在该函数内部不能计算数组的长度。
int bubble_sort(int arr[]){
int len = sizeof(arr)/sizeof(arr[0]);
//因为传递的是数组的首元素地址,计算出的长度4/4=1 byte
......
}
26.数组名:
int arr[10] = {0};
printf("%d\n",sizeof(arr));
//输出的结果是∶ 40
1.sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
2.&数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。
27.移位操作编译器默认算术移位(最高位补符号位)。
28.&:按位与 、|:按位或 、^:按位异或 (操作数必须是整数)
29.不使用临时变量交换两个数的值:
//加减法(可能会溢出)
void swap(int &x,int &y){
x=x+y;
y=x-y;
x=x-y;
}
//异或
void swap(int &x,int &y){
x=x^y;
y=x^y;
x=x^y;
}
30.求一个存储在内存中的整数(补码形式存储)的二进制形式中1的个数:
//模2除2(只能计算正整数)
void count_binary(int num){
int count=0;
while(num){
if(num%2==1)
count++;
num/=2;
}
}
//移位
void count_binary(int num){
int count=0;
for(int i=0;i<32;i++){
if((num>>i)&1==1)
count++;
}
}
//优化
void count_binary(int num){
int count=0;
while(num){
count++;
num=num&(num-1);
}
}