IOS学习的第一天,拿起了几年前没摸的C,java用的久了,都忘记了C的很多东西下面整理一下今天所学的。
0 ,一天的总结
今天是个奇妙的一天,本来觉得今天会很枯燥,可是真的开始听发现真的自己还说有很多模糊的地方,通过今天的复习,
总结了很多不同的知识点 这些都是要好好补充的地方,理解并多加练习。
1 各种进制之间的转换
二进制转10进制 简单的要记住 128 64 32 16 8 4 2 1 着这几个数就够了
十进制转二级制 简单的用减法。
十六进制转10进制 注意 A10 B11 C12 D13 E14 F15 记住A是10 别再闹笑话了
10转16方法
先2转16
4位 4位转
2 关于变量的定义
定义变量 例如
int a = 3;
int b = 3;
即使值相等 系统分配的内存也是不一样的。
定义变量后 变量名称不可改变 分配内存可不可改变?(强制转换?)变量名称不可以改变 分配的内存也是固定的
强制类型转换只是转换了表达形式
地址内保存的值可改变
无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,
而不改变数据说明时对该变量定义的类型。
4 关于位数
int 8 位
short 4 位
char 3 位
char 类型 赋值的是asc2 码
char a = 6 ;
5 关于++a和a++
++a 与 a++
参与其他运算的时候
++a 是先自增1 再运算
a++ 是先运算再自增1
(- -a和a- - 同上)
6 关于位运算
& | ~ ^
&同1为1 (可能有从小的规律)
| 有1为1 (从大)
| 在编程中的意义 是合并 所有的都分享 大家一起嗨
& 的意义是 截取 两个人都是小气鬼 都把自己独有的藏起来 只拿同有的。
~取反
^按位异或 相同取0 不同取1
负数变正数 取反加1
正数变负数 减一取反
最高位符号位 1为负 0为正
<< 左移 乘二 高位溢出
7 关于输入输出
scanf("%d,%d",&a,&a);
注意输入的前面的格式要和后面的格式相同,如“,”既需要输入,
%d 输出整型格式,也就是10进制数 %c 输出字符格,也就是单个字母或者符号什么的 %f 输出浮点数,也就是带有四位小数位的数,比如10.0000 %ld 输出长整型格式,差不多和10进制一样,只是它可以输出很大的数 %u 输出无符号数,这个基本输出和%d差不多 %s 输出字符串,一般都是输出一个char数组的所以字符 %lf 输出长浮点数,也就是所谓的双精度浮点数,double类型,可以输出很大的带小数位的数 %a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f 浮点数(包括float和doulbe) %e(%E) 浮点数指数输出[e-(E-)记数法] %g(%G) 浮点数不显无意义的零"0" %i 有符号十进制整数(与%d相同) %u 无符号十进制整数 %o 八进制整数 e.g. 0123 %x(%X) 十六进制整数0f(0F) e.g. 0x1234 %p 指针 %s 字符串 %% "%"
%和\无法单独出现 必须和其他或本身结合 而且 %和\不能一起出现
8 关于作业题
1, 我自己所想出来的
void moveing()
{
// 循环位移 思想是判断最后一位是否为1 为1加128 为0不变。
int a =0;
printf("请输入一个小于等于255的数:");
scanf("%u",&a);
int b = 0 ,n = 0,c=a;
printf("请输入位移位数:");
scanf("%u",&n);
for(int i = 0 ; i < n ; i++)
{
b = c>>1;
if(c%2!=0)
{
b=b+128;
}
c=b;
}
printf("输入的数转换16进制为%x;\n",a);
printf("输出的数转换16进制为%x;",b);
}
同学想出来的
int main(int argc, const char * argv[])
{
unsigned char num = 0;
unsigned int save = 0;
unsigned loopright = 0;
printf("输入待右移的数字与移动的位数:\n");
scanf("%u %u", &save, &loopright);
num = (unsigned char)save;
loopright = loopright%8;
num = (num>>loopright) | num<<(8-loopright);
printf("结果: %u\n", num);
return 0;
}
总结: 我的想法是很浅显的,只是简单的走了第一步,寻找位移一位的想法,没有更深入的理解位运算和与运算的深度,这和本身的水平 和长期从事java没有深入理解这些有关,这一次深深的认识到了它的奇妙。
void change()
{
unsigned char c = 'a';
int b = 0 ,a = 0;
int v = c;
a = v % 16;
b = v / 16;
c = a*16+b;
printf("%d" ,c);
}
void change2()
{
unsigned char test = 0;
unsigned int save = 0 ;
printf("输入交换的数字:\n");
scanf("%u",&save);
test = (unsigned char)save;
test = test>>4|test<<4;
printf("交换后的数字为:%u",test);
}
int a = 0;
a = arc4random()%30;
printf("%d",a);
int a = 0 ;
a = arc4random();
printf("%d",a%30);
上不会取到负数
下会取到负数
原因是random这个函数不会取到负数 或许会取到一个高位为1的数它立即会和30取模
这时候赋值给a 肯定为30内的正数
而下方时会先赋值给a a有符号会变负数再取模则会产生负数。