首页 > 编程语言 >刘铁猛C#学习笔记7 操作符详解3

刘铁猛C#学习笔记7 操作符详解3

时间:2024-02-23 18:55:56浏览次数:28  
标签:类型转换 无穷大 刘铁猛 C# double 操作符 类型 Teacher

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

标签:类型转换,无穷大,刘铁猛,C#,double,操作符,类型,Teacher
From: https://www.cnblogs.com/jk-2048/p/18030224

相关文章

  • 基于STM32F407MAC与DP83848实现以太网通讯三(STM32F407MAC配置以及数据收发)
    本章实现了基于STM32F407MAC的数据收发功能,通过开发板的RJ45接口连接网线到电脑,电脑使用Wiershark工具抓包验证。参考文档:DP83848IV英文DP83848EP中文STM32F4xx参考手册一、工程模板以及参考源码的获取工程源码我使用的正点原子的探索者开发板STM32F407(V2)参考源码:正点原子......
  • 刘铁猛C#学习笔记8 表达式、语句1
    表达式1.表达式的定义通用定义:一种专门用来求值的语法实体C#中定义:由一个或多个操作数,零个或多个操作符,功能是求值,求值的结果可能是四类Singlevalue、object、method、namespace(说明至少要有一个操作数,但不一定要有操作符)  C#中表达式值的类型:(1)单值Singlevalue......
  • oracle11g静默安装
    一、先设置swap大小设置方法见另外文档:(21条消息)Linux系统设置swap大小_Tyler唐的博客-CSDN博客_linuxswap设置多大二、准备静默安装Oracle2.1创建Oracle用户(ROOT用户下)/usr/sbin/groupadd-g501oinstall/usr/sbin/groupadd-g502dba/usr/sbin/groupadd-g503oper/usr/......
  • css 动画
    <divclass="quan-box">逐渐放大消失<div>  /*申明一个div的class用于执行动画*/.quan-box{opacity:0;background:#70D97C;position:absolute;//3秒执行完成quan动画,infinite动画会无限次重复播放,steps(40)表示将整个动画过程分割成40个......
  • Anaconda的安装&基本使用
    一.下载&安装ANACONDA下载进入Anaconda官网下载AnacondaIndividualEdition,这是一个完全免费的软件。安装右击安装包,以管理员身份运行;Next;agreeLicenseAgreement;这里选择AllUsers(所有用户安装):设置安装路径,注意路径中尽量不要出现中文:这个地方......
  • linux(ubuntu22.04)+PicGo(gui版)+阿里云oss搭建图床教程
    linux(ubuntu22.04)+PicGo(gui版)+阿里云oss搭建图床教程资源库PicGo下载链接:山东镜像源github原版阿里云oss链接linux下PicGo(gui版)的安装从资源库链接里下载后缀为.AppImage的安装包,版本可以选择稳定版2.3.1也可以用更新的beta版。修改文件权限,打开文......
  • Cursor 介绍与基础生成用法
    Cursor介绍与基础生成用法实验介绍Cursor是一款与OpenAI合作并且基于GPT-4的新一代辅助编程神器,国内直接可以访问,它可以根据你的输入和需求自动生成代码片段,还可以帮助你重构、理解和优化代码,提高开发效率。在本节课程中,我们将介绍Cursor的基本使用方法。知识点Curso......
  • ThreadLocal
    前置知识Java中有些引用类型?Java中主要有4种引用类型,分别是:强、软、弱、虚。他们主要跟Java的垃圾回收机制有关强引用:Java中默认的引用类型,一个对象如果具有强引用,那么只要这种引用还存在就不会被回收软引用:在内存充足时,是不会GC这个对象的。只有在JVM内存不足的时候才会调用......
  • mybatis和jdbc有啥区别
    JDBC是Java提供的一个操作数据库的API,是一种规范;mybatis是一个持久层框架,用java编写的.他封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程.他使用了ORM思想实现了结果集的封装(ORM:ObjectRelationalMapping对象关系映射简单......
  • react生命周期
    1.类组件生命周期以下是React类组件的全部生命周期方法,按照调用顺序排列:constructor(props)用途:组件的构造函数,在组件实例化时调用,用于初始化状态和绑定方法。staticgetDerivedStateFromProps(props,state)用途:在组件实例化、接收新的属性(props)或调用setState方法......