算法:(针对求二进制中1得个数)
(1)余除法
如:
1234%10=4
1234/10=123
123%10=3
123/10=12
.......
这种算法可以用来打印每一位数字,或者求出每一位数字,求解水仙花数等等
二进制也可以用,用来求解二进制中1的个数
(2)按位&+移位法
(3)n = n &(n-1)
(4)判断一个数是不是2得n次方
2^1 10
2^2 100
2^3 1000
条件:if ((n&(n-1)) == 0)
sizeof计算返回值的结果是size_t类型的,是无符号整形的
#include <stdio.h>
int i;
int main()
{
i--;
if (i > sizeof(i))
printf(">\n");
else
printf("<\n");
return 0;
}
运行结果: >
因为i是有符号类型,sizeof是无符号类型,当有符号类型负数被转化为无符号类型正数会变成很大的无符号类型正数
调试使用技巧
调试,又称除错,时发现和减少怕计算机程序或电子设备中程序错误的过程,Debug通常称为调试版本,包含调试信息,并且不做任何优化,便于程序员调试程序。
release称为发布版本,它往往进行了各种优化,是程序在代码大小和运行速度上都是最优的,方便用户很好使用。
数据结构中的栈:压栈、出栈。
1.栈区内存的使用习惯是先使用高地址的空间,在使用低地址的空间。
2.数组随着下标的增长地址是由低到高变化的。数组越界可能造成死循环。
3.若i与arr之间有适当的空间,利用数组内越界操作就可能会覆盖到i,可能导致死循环/
const修饰指针变量:
#include <stdio.h>
int main()
{
const int num = 10;
const int* p = #//num不可改变
int n = 100;
*p = 20;
p = &n;
//可以通过间接其他地址改变p变量
return 0;
}
(1)放*左边意思:
p指向的对象不能通过p来改变,但p变量本身的值是可以改变的
(2)放*右边
p指向的对象是可以通过p来改变的,但是不能修改p变量本身的值
即二级指针p=&n无效通不过。
*p=20可以通过进而修改num的值
const在*左边和右边的区别:
const int* p = &m;
*p = 0;//×
p = &n;//√
int* const p = &m;
*p = 0;//√
p = &n;//×
const int* const p = &m;
*p = 0;//×
p = &n;//×
任何变量/表达式都有两个属性:值属性和类型属性
scanf读到\0不再往下读,可以用gets()
pow()是库函数,用来求次方