十月10号

只有字符才有ascll码表
数值型:
整形  int
输出整形数据的格式控制符是%d,如printf("a = %d ",a );   //a = 3
实型(浮点型) float  f1 = 1.25  格式控制符是%f,如printf("f1 = %f",f1)  // f1= 1.25000
char的格式控制符是%c 如 char c1= 'a'  c3 = 'c' printf("c1 = %c, c3 = %c" c1 ,c3)  c1 = a , c3= c




定义变量的格式:


类型说明符   标识符(变量名);
int x  =  0;  (一边来说整形数据占4个字节)
0000 0000 0000 0000 0000 0000 0000 0000


输出整形数据的方法:
printf("%d",x);
printf("100");


常量与变量:
常量不可以改变;
变量是可以改变的   自己定义的.


给变量起的名字就叫标识符;命名规则:


1.只能由字母,数字,下划线组成,只能由字母或下划线开头
2.见名知意
3.不能使用函数 的关键字.
4.特殊符号:$可以作为开头或组成部分


auto 局部变量(自动储存)
break无条件退出程序最内层循环
case   switch语句中选择项
char单字节整型数据
const定义不可更改的常量值
continue中断本次循环,并转向下一次循环
default switch语句中的默认选择项
do  用于构成do.....while循环语句
double定义双精度浮点型数据
else构成if.....else选择程序结构
enum枚举
extern在其它程序模块中说明了全局变量
float定义单精度浮点型数据
for构成for循环语句
goto构成goto转移结构
if构成if....else选择结构
int基本整型数据
long长整型数据
registerCPU内部寄存的变量
return用于返回函数的返回值
short短整型数据
signed有符号数
sizoef计算表达式或数据类型的占用字节数
static定义静态变量
struct定义结构类型数据
switch构成switch选择结构
typedef重新定义数据类型
union联合类型数据
unsigned定义无符号数据
void定义无类型数据
volatile该变量在程序中执行中可被隐含地改变
while用于构成do...while或while循环结构


小数转二进制 乘以2取整数 
如 0.625 * 2 = 1.25 取 1
   0.25 * 2  = 0.5 取 0
   0.5 * 2 = 1  取 1


结果为0.101










假设你要交换两变量 a,和b的值:
方法一:
a = a + b;
b = a - b;
a = a - b;
方法二:
a = a * b;
b = a / b;
a = a / b;
方法三:
a = a ^ b;
b = a ^ b;
a = a ^ b;








不用第三方变量交换两个变量的值


1、这需要进行位操作,必较麻烦的
在学习程序语言和进行程序设计的时候,交换两个变量的值是经常要使用的。通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下: 
int a,b; 
a=10; b=15; 
int t; 
t=a; a=b; b=t; 
这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称


为标准算法)。


上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!这里我们可以用三种算法来实现:1)算术运算;2)指针地址操作;3)位运算。


1) 算术运算 
简单来说,就是通过普通的+和-运算来实现。代码如下: 
int a,b; 
a=10;b=12; 
a=b-a; //a=2;b=12 
b=b-a; //a=2;b=10 
a=b+a; //a=12;b=10 
通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。 
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。 
具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之


和),并且将其保存在a中。完成交换。 
此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)


2) 指针地址操作 
因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通


过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。即: 
int *a,*b; //假设 
*a=new int(10); 
*b=new int(20); //&a=0x00001000h,&b=0x00001200h 
a=(int*)(b-a); //&a=0x00000200h,&b=0x00001200h 
b=(int*)(b-a); //&a=0x00000200h,&b=0x00001000h 
a=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h 
通过以上运算a、b的地址真的已经完成了交换,且a指向了原先b指向的值,b指向原先a指向的值了吗?上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在? 
首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等。在编译源程序时,常量、全局变量等都放入全局数据区,局部变量、动态变量则放入堆栈区。这样当算法执行到“a=


(int*)(b-a)”时,a的值并不是0x00000200h,而是要加上变量a所在内存区的基地址,实际的结果是:0x008f0200h,其中0x008f即为基地址,0200即为a在该内存区的位移。它是由编译器自动添加的。因此导致以后的地址计算均不正确


,使得a,b指向所在区的其他内存单元。再次,地址运算不能出现负数,即当a的地址大于b的地址时,b-a<0,系统自动采用补码的形式表示负的位移,由此会产生错误,导致与前面同样的结果。 
有办法解决吗?当然!以下是改进的算法: 
if(a<b) 

a=(int*)(b-a); 
b=(int*)(b-(int(a)&0x0000ffff)); 
a=(int*)(b+(int(a)&0x0000ffff)); 

else 

b=(int*)(a-b); 
a=(int*)(a-(int(b)&0x0000ffff)); 
b=(int*)(a+(int(b)&0x0000ffff)); 

算法做的最大改进就是采用位运算中的与运算“int(a)&0x0000ffff”,因为地址中高16位为段地址,后16位为位移地址,将它和0x0000ffff进行与运算后,段地址被屏蔽,只保留位移地址。这样就原始算法吻合,从而得到正确的结果。 
此算法同样没有使用第三变量就完成了值的交换,与算术算法比较它显得不好理解,但是它有它的优点即在交换很大的数据类型时,它的执行速度比算术算法快。因为它交换的时地址,而变量值在内存中是没有移动过的。(以下称为地


址算法)


3)** 位运算 
通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码: 
int a=10,b=12; //a=1010^b=1100; 
a=a^b; //a=0110^b=1100; 
b=a^b; //a=0110^b=1010; 
a=a^b; //a=1100=12;b=1010; 
此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。 
即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值