• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jk-2048
博客园    首页    新随笔    联系   管理    订阅  订阅
刘铁猛C#学习笔记7 操作符详解3

1. 强制类型转换操作符

强制类型转换操作符()

int x;
string s = (String)x;
例1:
string str1 = Console.ReadLine();
string str2 = Console.ReadLine();
//使用ReadLine读取到的是两个string类型的数据
//如果要进行计算,需要把两个string转换为int
int x = Convert.ToInt32(str1);
int y = Convert.ToInt32(str2);

Console.WriteLine(x + y);//打印两数的和

隐式类型转换

隐式(implicit)类型转换
代码中不用明确告诉编译器,编译器自动转换的,有以下三种

1.不丢失精度的转换

进容量范围小的同类类型装入容量范围大的类型中
如将int装入long中、将float装入double,总集参见下表

2.由子类向父类的转换

所以面向对象的编程语言都支持这种转换
“多态”就是基于这种隐式类型转换
class Animal   //创建类“动物”
{
    public void Eat()
    {
    
    }
}

class Human : Animal   //创建派生类“人类”,继承自“动物”类,以动物为基类
{
    //一旦以“动物”为基类,动物的所有成员都会被“人类”所继承
    public void Think()
    {
        Console.WriteLine("Who I am?");
    }
}

class Teacher : Human   ////创建派生类“老师”,继承自“人类”类,具有人类、动物所有的成员
{
    public void Teach()
    {
        Consile.WriteLine("I teach programming.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Teacher t = new Teacher();
        //子类像父类的隐式类型转换
    } 
}
由于Teacher是Human的子类,将Teacher装入父类型变量时,会进行隐式类型转换
t身上有【动物】【人类】【老师】的成员
而装入父类Human后,h身上只有【动物】【人类】的成员,没有【老师】的teach方法
//ushort的最大值为65535 uint x = 65536; //比ushot最大值还大1 ushort y = (ushort)x; //强制显性类型转换,要转换的目标类型写在圆括号中 //将32位大小的变量强行塞入16位大小的类型中,会取前面16位,舍弃后面16位,所以结果为0
所有显式类型转换:
 
注意:将有符号数装入无符号类型时,一定会发生数值的改变
有符号数最高位的1表示负号,而无符号类型会将其当作最高位数值
 

2.拆箱

 

3.使用Convert类的ToXXXX静态方法

Convert类是一个类型转换枢纽,内有大量现成的类型转换方法
ToString : 转换为string字符串
 
使用例1:
把输入的string文本转换为double类型并存入变量:
double x = System.Convert.ToDouble(tb1.text);
函数的参数括号中写要转换类型的变量
 
使用例2:
把double类型数值转换为string类型并输出到文本框:
this.tb3.Text = System.Convert.ToString(result);
 

4.使用数值数据的ToString实例方法

使用例:
把double类型数值转换为string类型并输出到文本框:
this.tb3.Text = result.ToString();
ToString是object(C#中所有类的基类)自带的四大基本方法之一,所有所有类型都有这个方法
 

5.使用类型的静态方法Parse

使用方法与使用Convert类下辖ToXXXXX方法几乎一模一样
例:把输入的string文本转换为double类型并存入变量:
double x = double.Parse(this.tb1.Text);
但Parse方法有一个缺点,只能转换输入类型正确的值
若在double类型中输入了“ab”,其无法被转换为double,会报错
要转换为double必须输入的是和double一样的数值格式,如123、1e2(科学计数法中的100,10的二次方)
 
EX:为了弥补这个缺点,C#有另一个方法TryParse
double x = double.TryParse(this.tb1.Text);
TryParse有一个bool类型“输出参数”(待续)
 

自定义类型转换操作符

(转换操作符的重载)

显式

class Program   //程序主体
{
    static void Main(string[] args)
    {
        Stone stone = new Stone();
        stone.Age = 5000;
            //调用操作符定义的类型转换方法
        Console.WriteLine(wukongSun.Age);
    }
}

class Stone  //定义类:石头
{
    public int Age;
    
    public static explicit operator Monkey(Stone stone)   
    {       //定义一个将Stone类型转换为Monkey类型的类型转换操作符
            //返回值为一个猴子变量,参数为一个石头变量
        //explicit operator:显式类型转换操作符
        Monkey m = new Monkey();
        m.Age = stone.Age / 500;  //石头的500岁转化为猴子的1岁
        return m;
    }
}


class Monkey  //定义类:猴子
{
    public int Age;
}
类型转换方法类似一个实例构造器,但不是写在转换目标类中,而是写在被转换的类中
 
 

隐式

将上面的显性转换方法中的 implicit operator Monkey(Stone stone) { //定义一个将Stone类型转换为Monkey类型的类型转换操作符 //返回值为一个猴子变量,参数为一个石头变量 //explicit operator:显式类型转换操作符 Monkey m = new Monkey(); m.Age = stone.Age / 500; //石头的500岁转化为猴子的1岁 return m; }
调用:
Monkey wukongSUN = stone;
隐式类型转换方法在赋值时会自动调用
 
 

2.算数运算操作符

乘法 *

(1)整数乘法

包括所有不带小数点的数值变量,int、uint、long、ulong四种
 

(2)浮点乘法

包括float、double,计算结果带小数点
浮点数中包括两个特殊值,无穷大(正无穷大、负无穷大)和NAN(not a number,不是一个数)
X * 无穷大 = 无穷大
-X * 无穷大 = 负无穷大
0 * 无穷大 = NAN
无穷大 * 无穷大 = 无穷大
 
注意数值类型提升,int 乘 double的结果是double
当程序发现除号两边类型不一样时,会将结果的类型提升到不损失精度的类型
 
 

除法 /

(1)整数除法

整除,结果也是整数
除数不能为0,否则会报错

(2)浮点除法

两个数都是浮点数时进行浮点除法,结果有小数点值
正数除0得 正无穷大(PositiveInfinity) (极限思想)
负数除0得 负无穷大(NegativeIninity)
 
正无穷大 除 负无穷大 = NAN
 
例:
double x = (double)5/4;  
结果为double类型的1.25
因为类型转换操作符优先级高于除法,5先被变为double,然后去除int 4,得double 1.25
double x = (doub)(5/4); 
结果为double类型的1
因为用括号改变了运算的优先级,先进行了除法
 

(3)decimal除法

待续
 

取余 %

运算法则遵从下表
整数取余:
11 % 10 = 1
 
浮点数取余:
3.5 % 3 = 0.5
取余也会产生类型提升
 

加法 + 和减法 -

加号可用来连接连个字符串
还可以用来操作委托(待续)
对无穷大和NAN的处理法则:
正无穷大 - 正无穷大 = NAN
 
加法、减法也会产生类型提升
 

3.位移操作符 << 和 >>

能够将数据在内存中的二进制结果进行一定位数的平移
 
int x = 7; //7的二进制为111
int y = x << 1;  //将x在内存中向左移动一位
string strX = Convert.ToString(x,2).PadLeft(32,"0"); //转化为32位二进制字符串
string strY = Convert.ToString(x,2).PadLeft(32,"0");
Console.WriteLine(strX);    //打印
Console.WriteLine(strY);
输出结果为
strX = 00000000000000111
strY = 00000000000001110 向左移动了一位
 
对应二进制数字,在没有溢出的情况下,左移 = 乘2 , 右移 = 除2
0000000111 = 7
0000001110 = 14
左移补进来的都是0
右移正数补进来0,负数补进来1
 

4.比较判断操作符 == != < > <= >=

< > <= >= 优先级更高
== != 优先级较低
关系运算符运算结果都是bool类型
 
还可用于char类型的比较
比如‘a’ > ‘A’
使用的是unicode编码,其向下兼容ASCII码
但unicode是用16位表示,ASCII是用8位表示
 
字符串比较
不能比大小,但能用“==”、“!=”比是否相等
也可以用String.Compare(str1,str2); 比较
返回值是一个整数,若为0是相等,若为正值是第一个大于第二个,若为负值是第一个小于第二个
 

4.类型检验操作符 is as

is操作符

Is 用来检验一个对象是不是一个类型的对象
Teacher t = new Teacher();
var result = t is Teacher;
输出结果为true
若变量t中装的是NULL,检验结果会为false
Teacher t = new Teacher();
var result = t is Human;
输出结果为true
子类型的对象,是属于(is)父类的
 
object o = new Teacher();
if (o is Teacher)
if判断结果为true,父类型可以装子类型实例,并可通过判断
 

as操作符

object o = new Teacher();
Teacher t = o as Teacher;  //类似一个强制类型转换
if(t != NULL)
{
    t.Teach();
}
将父类(基类)对象以子类(派生类)的形式存入变量
 

5.位运算操作符

位与 &

两个二进制数对齐,按位求与
 

位或 |

两个二进制数对齐,按位求或
 

位异或 ^

异或:两位不一样时为真
两个二进制数对齐,按位求异或
 

6.条件运算符

条件与 &&

条件或 ||

 

&&、||的短路效应

注:&&与||有短路效应
例:
if(a++ > 3)
&&先判断右边,发现右边为假,此时无论左边为何值,结果都是假
此时程序会偷懒,直接不运行右边的表达式,因此
但很多地方需要NULL值,所以3.0之后C#更新了可空类型
是一种【泛型】,如下语句表示【可空的int】
由于可空类型特别常用,所以C#将其吸收为了关键字
Int? X 就等于 Nullable<int> x
 

?? 操作符的用法

该表达式意为:“正常赋值,但如果X是NULL值,用0代替”
0可以换为其他数字
 

8.条件操作符(三目运算符)

本质上是if - else分支语句的简写
如判断分数是否及格
If - else形式:
条件操作符形式:
若结果为真,返回冒号前面的值,若条件为假,返回冒号后的值
经常用圆括号把“条件”扩起来,以提高可读性
 

9.= 赋值运算操作符

x += 1 等价于 x = x + 1,其余同理
注意:带有赋值操作符的表达式,运算顺序需要从右向左 !
图中表达式计算结果为 47
posted on 2024-02-23 18:49  JK降谷羽  阅读(104)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3