思考并回答以下问题:
1.bit和Byte有什么区别?有什么关系?
2.有几种浮点类型?为什么float = 0.1f要加f?
3.C#中一个变量的作用范围是怎么判定的?
4.char类型和string类型赋值方式有什么不同?
5.前加加和后加加有什么区别?
6.为什么有时候不能进行隐式转换?
7.显式转换的语法是什么?
8.成员变量和局部变量的区别
Unity脚本(继承MonoBehaviour类)的脚本必须拖到GameObject上才能生效。如果没继承MonoBehaviour,就无需拖到游戏对象上
每次将脚本附加到GameObject上时,会使用这个脚本模具创建一个实例。
整数类型
整数又分为有符号整数和无符号整数,有符号整数会使用1位(bit)表示正负的符号,无符号整数会用所有的位数来表示数值,所以相同位数的数值,有符号和无符号能表示的数值范围有差别。举例如下:
- sbyte 8位有符号整数,范围是[-128, 127]
- byte 8位无符号整数,范围是[0, 255]
- int 32位有符号整数,范围是-2,147,483,648到 2,147,483,647
1个bit(比特)代表计算机内的一个0或1
1个Byte(字节)= 8bit
一个sbyte的数值有8位,在计算机内部表示可能是01110111,一共有8位0/1的值。
一般在缩写时,小写字母b代表bit,大写字母B代表Byte,比如1KB=8Kb。
浮点类型
浮点类型可以认为是小数类型,有三种类型的浮点数类型,分别是:float、double和decimal。
这三种类型所占用的空间分别是32位,64位和128位,精度依次升高。不过在Unity中最常用的还是float,如果float精度不够时,可以尝试使用后两个类型。
浮点数在赋值时需要注意的是:默认C#中浮点数常量是double类型,比如3.14默认是double类型,当你将3.14赋值给float类型变量时会报错。1
float pi = 3.14;
报错的内容是:error CS0664: Literal(字面量) of type double cannot be implicitly(隐式) converted to type ‘float’. Add suffix ‘f’ to create a literal of this type。
1 | int a; //变量 |
含义是:无法将double类型转换为float类型,需要将double类型手动转换为float类型。
这时候需要在3.14后面加上f,将3.14强制转换为float类型的数值。后面会讲解显示转换和隐式转换。1
float pi = 3.14f;
字符类型
字符类型包括单个字符char和一串字符的字符串类型string。1
2char firstLetter; // 第一个字母
string playerName; // 玩家名字
字符和字符串的赋值方法如下,char类型需要使用单引号,string类型需要使用双引号。
1 | char question = '?'; |
变量的作用范围
C#代码中变量的声明是有作用范围的,在特定的范围内才能获取、操作这个盒子。C#中变量按作用范围可以划分为成员变量和局部变量。
确定一个变量的作用范围很好记,一个变量的作用范围就是变量当前所处的大括号范围内。如下面代码中score的作用范围就是最外层的大括号,而hp的作用范围仅限于Start方法的大括号。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyClass : MonoBehaviour
{
int score = 100;// 成员变量
// Use this for initialization
void Start ()
{
int hp = 100; // 局部变量
score = 50;
}
// Update is called once per frame
void Update ()
{
score = score + 1; // 这行代码正常
hp = hp + 1; // 这行代码会报错
}
}
上面这段代码中,Update方法中的第二行代码会报错,因为hp的作用范围仅限于Start方法中,无法在Update中获取。
运算符
+(一元)运算符可能看起来有些奇怪,因为它不会改变运算的结果,不过把值变为正的,而是仍旧保持原始值。例如var2是-1,则+var2的结果还是-1。这个运算符只在运算符重载时有用,后面会讲到。
特别注意除法操作,在大多数编程语言中,如果两个int类型的数相除,结果还是int类型,会丢失小数部分。如果想要保留小数部分,需要手动将int类型转为float或double类型以保留小数。1
2Debug.Log(10/3); // 3
Debug.Log(10/3f); // 3.333...
只有加号能用于字符串的连接,其他运算符不能用于处理字符串。
前加加与后加加的区别可以记为:前加加是先加后赋值,后加加是先赋值后加。1
2
3
4float var1 = -2, var2 = 7.21f; // 可以在同一行进行声明和初始化
Debug.Log(var1++); // 先返回var1的值,再+1,成为-1
Debug.Log(++var1); // 先+1成为0,再返回var1的值
类型转换
无论是什么类型,在计算机内部,所有的数据都是由0和1构成的。一个变量具体代表的内容是由解释这些数据的方式来确定的。比如char类型和ushort类型,这两种类型存储方式完全相同,都存储0-65535之间的数字,但是一个代表的是字符,另外一个是数字。
有时候需要对数据的类型进行转换,有以下两种形式:
- 隐式转换 从类型A到类型B的转换不需要额外的代码,可以自动执行转换。
- 显示转换 只能在某些情况下转换,需要额外写代码。
隐式转换 1
2int a = 10;
float b = a;
如上面两行代码,a是int类型的变量,b是float类型的变量,但是可以直接将a赋值给b。
无法隐式转换时,编译器会报错。
比如下方的代码:1
2float a = 10;
int b = a;
float类型只能隐式转换为double类型,如果转为int类型,就会报如下错误:
error CS0266: Cannot implicitly convert type `float’ to `int’. An explicit conversion exists (are you missing a cast?)
那么能不能把float转成int呢?答案是可以的,但是必须显式转换。
显式转换
显式转换就是通过明确的代码,将一种数据类型转换为另一种数据类型。
如上面的代码,可以通过显式转换的方式转换数据类型:1
2float a = 10.1f;
int b = (int)a;
显式转换的语法是:1
(<数据类型>)<变量名>
需要显式转换的情况一般都是:转换时会发生数据或数据精度丢失。比如double类型的数据精度比float类型精度高,从double转为float类型时,需要显式转换。
上面的代码转换时,由于b是整数类型,变量a值为10.1的小数部分会丢失,b的值是10。
10.1f中的f也是一种显示转换,这种显示转换只能用于字面值(即字面就代表了数值的常量)。一般只在对float类型的变量赋值时使用。