C++与C#对照学习:基本数据类型,变量

C++与C#对比学习:基本数据类型,变量

1.变量命名规范

c++变量名中可包含字母,下划线,$,数字.但第一个字符不能是数字.

C#变量名中可包含字母,下划线,@,数字.但第一个字符不能是数字.如果用@出现在变量名中只能在最开头.并且只能出现一次

c++,C#变量名都是区分大小写的,VB是不区分大小写的.

2.基本数据类型

C++ 基本数据类型

******************************************************************************************************

类   型                         字节数

bool                             1

char                             1    

wchar_t                        2      (宽字符类型,存储Unicode代码值.用法wchart_t  letter = L'a')

short                             2

unsigned short             2      (unsigned 表示无符号,只能取非负数.unsigned short num = 123U ;   //数字后面的U可加可不加)

int                                 4       (整形默认为int,long型需在后加L,如long lNumber = 123L;  //L可加可不加)

unsigned int                 4         (可简写为unsigned)

long                              4          (貌似不同的编译器中不一样,有时会是8,偶也不太确定)

unsigned long              4

float                              4    

double                          8   

******************************************************************************************************

C#基本数据类型

******************************************************************************************************

类   型                         字节数

bool                             1

char                             2      (相当于C++中的wchar_t)

short                            2

ushort                          2

int                                4       (整形默认为int,long型需在后加L,如long lNumber = 123L)

uint                              4

long                             8

ulong                           8

float                             4    

double                         8     (浮点型默认为double,声明float型要加F,如float fNumber = 12.3F)

byte                             1     (只能取非负数)

sbyte                           1     (可以取负数)

decimal                       16

******************************************************************************************************

详细解释

布尔类型

C++中的布尔类型实际是是个整数值.所以其他整数也可以当成bool值来用.不过它们之间的转换有点特殊.

true 转换成整数是1,false是0.

所有非0整数转换成bool是true.所有0转换成false

所以if( true )与if( 123 )       , if( false )与if( 0 ) 是等价的.

bool   num = 123;

int   no = num + 1;  //结果是2,因为num会被先转换成1

由于其他数字能转换成bool值,所以很容易犯的一个错误就是在判断语句变成赋值语句了.

比如:  int num = 123;

if ( num = 100)   //本来是想写成num == 100的.结果写错了变成赋值语句.此时不会出错.这个语句变成等价于if ( true ).此时虽没出错,但表达的意思完全不一样了

为了不再出现这样的错误,C#做了一些改进.bool类型不再是整数值,不能和其他整数进行运算和转换.

所以在C#中 :int num = 123;   if( num = 100 )这样的语句不会再存在,会当成语法错误.

当然如果要出现这样的情况 bool check = false;     if ( check = true )   //这就没办法了,当然最好的办法是如果某个值是布尔值时直接当条件去判断,不用再去和true ,false比较.写成if ( check )就行.

字符类型

C#相当于去掉了C++中的char类型.只保留wchar_t类型,而C#中还是用char这个名字.

整型

首先是C#把C++中的unsigned 简化成u,写起来方便多了.ushort就等价于unsigned short.

其次C#中多出了一个类型byte,占用空间为一个字节.其实这可以和c++中的char对应,刚好也是一个字节,并且实际上也是个整数

另外C#中的long型占8个字节,而且C++中的long貌似根据编译器不同会不一样,有时4字节有时8

浮点型

C#和C++浮点型都有float,double没啥太大区别.不过有一个书写的小区别.

在整型中c#,c++赋值时无符号,或者long型,数字后面的后缀U,L可写可不写.

但在C#浮点型中float num = 123.12F;    //float赋值必须加后缀F,当然小写f是一样的

double  eno = 123d;   //后缀d可写可不写

C++中float,double是没有后缀的.

在C#中之所有比较注重右值(字面值)的后缀书写问题,我觉得应该是因为C#中有个类型推断的特性.就是可以这样命名变量: var somevalue = 123f;

关键字var可以替代任何变量类型,但C#不像javascript,它可是强类型的.所以编译时就必须确定具体类型是啥,所以必须通过右值推断出变量具体是啥类型.

此时后缀就非常有用了,因为123d, 123f, 123是三种不同的类型.分别代表double,float,int类型.

在数字没有后缀的情况下,C#默认是这样判断的,如果有小数,比如123.11就当成double,整数的话124这样的就默认为int.

在float num = 123.12f;//这样的赋值中如果写成123.12会出错.因为123.12默认是当成double型.而double型不能隐式转换成float型的.

而像long lo = 123;//是因为整数123能隐式转换成long

float fl = 123; //整数123能隐式转换成float

另外C#中多了个浮点类型,decimal ,占16个字节,表示小数可以很精确,主要应用在金融领域,计算跟有钱相关的数字啊.因为差几个小数那就是白花花的银子啊,所以是能精确就精确啊.decimal定义变量时是    decimal    money = 123.12m; //加后缀m.当然也可以省略

3.值溢出问题

在c++中,如果赋值时值溢出了,不会报错,只是得到个错误的值.比如short sh = 65534; //此值超出了short的范围,但不出错,只是sh得到的值为-2.

而在C#中如果这样赋值 short sh = 65534;//编译不会通过,当成错误来处理

不过在进行类型转换时,C#对值溢出做了些特殊处理.

默认情况下C#跟C++一样,对溢出值不报错,直接给个错误结果完事.

比如int num = 65534;

short sh = (short) num;   //sh的值为-2;

但是如果要做溢出检查的话必须得加关键字checked.用法很简单,写上关键字checked,然后加个中括号,中括号里面所有代码在做类型转换时要检查溢出.

checked

{

     int num = 65534;

    short sh = (short) num; 

}

这样的话编译时不会出错,但运行时会有个overflowexception异常.如果你代码中有用checked去做溢出检查那最好要用try catch这样的异常处理去捕捉那异常.

另外如果你在checked括起来的代码中有一部分又不想要溢出检查就再加个unchecked关键字,然后把那一部分代码中括号括起来就行了.