C/C++语法知识精华整理(1)-左值与右值、变量与常量、 define与const、Printf特点、补码与阶码、位运算等

来源:互联网 发布:sql中delete和drop 编辑:程序博客网 时间:2024/05/16 12:26


1.左值与右值的区别

左值可以放在左边赋值的值。右值可以放在右边的值。

左值,没有内存实体的左值不存在的。Int a=3;

右值,可以有内存实体,也可以没有内存实体. A+1,&a,100,右值,都在寄存器。

Int b=a,在内存实体

CPU处理计算,内存是存储的。

寄存器的内容不可以取内存地址 &a+1)非法。

赋值的时候,二进制数据在CPU寄存器中产生,赋值的时候,实际上传递二进制的过程。

 char  ch = -1;                                 //1111 1111

int num = ch;// 1111 1111  1111 1111  1111 1111  1111 1111

printf("%d", num);

//小字节数据转换为大字节数据的时候,填充符号位

 

掌握内嵌汇编

//data = num + 4;

_asm

{

    mov eax,num  //num移动到eax

   add eax,4   //eax 的值自动+4

mov data,eax //eax的值移动到data

}

 

2.变量的赋值原理

变量的赋值就是拷贝二进制,内存之间不可以直接拷贝,必须通过CPU

变量的值发生变化,就是变量的那一段内存,存放不同的二进制数据。

    

3.Defineconst的区别

   Defineconst最大差别是

#define  K  100.0

const  int  Knum  =  100.0;//赋值号会自动进行数据类型转换

 

const是伪常量,可以改变它的值,不可以用于数组,define可以

 

    改变伪常量:

     const int num = 10;//伪常量

 int *p = (int *)#//C++强类型

 *p = 3;//指针赋值,const不靠谱

 printf("%d", num);

 

const常量只有在初始化的时候是左值,const常量有内存实体

 

int  data = 10;

const  int num=20;//常量必须初始化,可以接受任何赋值

const  int num = data;//编译的时候避免出错,避免对不该赋值的赋值

理解下C++强类型,C类型,区别是赋值的时候,C++会严格检测类型。

     const int Knum = 100.0;//赋值号会自动进行数据类型转换

 

4.Printf特点

    printf不会自动进行数据类型转换,打印的变量必须匹配打印方式

printf("%d,%d", 10.9, 10);//printf,第一个错误,第二个连带错误

 

5.指针数据类型

指针是一种数据类型,类型决定了大小,决定了二进制数据的解析方式,指针变量存储的是地址,因为类型,同一个地址也有所不同。

int num = 100;

double *p1 = #

int  *p2 = #

float *p3 = #

printf("%f\n", *p1);

printf("%d\n", *p2);

printf("%f\n", *p3);

 

6.Long long和long double

Long long用于存储大整数重点

Longlong打印用%lld


long,int32位,64位平台等价,16位平台intshort等价

 

7.处理浮点数,处理整数字符的极限

极限的意义

//所有的数据操作,赋值,计算,极限范围之内不会错误

//极限范围之外,偶尔正确,一定出错。


8.补码阶码概念

   补码存储负数,阶码存储实数

   补码吧-0当作尾部最后一个数,可以多表示一个数据

   printf不会自动进行数据类型转换。

  %d有表示范围的。

 

9.变量在内存中的存储 

所有的计算机,负数手机电脑都是补码存储,实数是阶码存储。

 

10.补码

补码理解负数的存储方式,赋值方式,printf不经转换直接解析的方式

数据转换的时候,无符号数据填充0,有符号数据填充符号位。

补码的加法速度要快于原码

补码与数据极限的关系,补码的-0存储一个数据。

 

11.指针的高级处理方式

指针的高级处理方式,内存检索,改变指针的类型,检索任意数据

指针的类型决定了长度,决定了解析方式,指针变量的值仅仅存储地址

 

12.位运算

|运算符

// 1|1 -> 1     0|1 -> 1   

// 1|0 ->1      0|0->0

//0101 1010

//1111 0000

//1111 1010   //指定的字段置1

 

&运算符

// 11->1    01->0    

//10->0    00->0  

//0101 1110;

//0000 1111

//0000 1110   //某一段清零用&

 

^异或运算符

// 1^1  0^0     0

// 1^0  0^1     1

//1010 0101

//1111 0000  

//0101 0101   //指定的字段反转,交换数据

 

~取反运算符

unsigned char ch1 = ~0;

//0000 0000

//1111 1111  255

 

左移等价于×2,右移等价于/2

 

异或:指定的字段反转,交换数据

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击