C#学习第三弹之给常量赋值可能引发的问题

C#是一种强类型的语言,即变量必须先声明类型才能够使用,且变量的使用需要完全符合定义。也就是说,一旦一个变量被指定了数据类型,那么如果不经过类型转换,它永远都是这个数据类型。于此相对,弱类型语言是数据类型可以忽略的语言,一个变量可以赋予不同的数据类型的值。

C#支持隐式类型转换:

1 static void Main(string[] args)
2 {
3     short a = 6;
4     int b = a;
5 }

但是如下代码:

1 static void Main(string[] args)
2 {
3     int a = 6;
4     short b = a;
5 }

却会报错,提示:“错误 1 无法将类型“int”隐式转换为“short”。存在一个显式转换(是否缺少强制转换?) ”。

将int转化为short是危险的,所以C#并不鼓励程序员这样做。

如果一定要这样写,可以改成显式的类型转换:

1 static void Main(string[] args)
2 {
3     int a = 6;
4     short b = (short)a;
5 }

不过作为程序员,应该留意这条语句可能带来的问题。

接下来来看这样一段程序:

1 static void Main(string[] args)
2 {
3     short a = 0xffff;
4     Console.WriteLine(a);
5 }

我们要做的是将0xffff(-1)赋给short型变量a,看似好像没有任何问题,但编译器提示:

错误 1 常量值“65535”无法转换为“short”

原因是在C#中的十六进制常量默认是int型的,直接赋值给一个short型的变量显然行不通。

那么如果我们加上显式的类型转换是否就可以了呢?

1 static void Main(string[] args)
2 {
3     short a = (short)0xffff;
4     Console.WriteLine(a);
5 }

编译依旧不过,只是错误提示发生了变化:

错误 1 常量值“65535”无法转换为“short”(使用“unchecked”语法重写)

看来编译器还是不允许我们这样做,试一下unchecked重写:

1 static void Main(string[] args)
2 {
3     unchecked
4     {
5         short a = (short)0xffff;
6         Console.WriteLine(a);
7     }
8 }

发现终于可以了!

unchecked语法的作用:用于取消整型算术运算和转换的溢出检查。

随后发现C#对溢出有很严格的检查,诸如:int a = 2147483647 * 2; 和 int a = 2147483647 + 1; 的语句正常情况都是不能通过编译的,2147483647是int能表示的最大值。

而unchecked语法的存在又使得这些语句可以被执行,心中忽然觉得C#这门语言虽然很杂(支持超多关键字和语法),但是许多特性还是很实用的。

时间: 2024-08-02 22:42:45

C#学习第三弹之给常量赋值可能引发的问题的相关文章

运维学习第三弹

运维学习--命令 cd: cd[-L|-P][dir] pwd  查看目录  oldpwd cd DIR 将工作目录切换到DIR所代表的目录 cd:将工作目录切换至当前用户的家目录 cd -:将工作目录切换至上一次的工作目录:在两个目录之间互相切换 cd ~:将工作目录切换至家目录 cd~USERNAME : 将工作目录切换至指定用户"username'的家目录,仅限于root用户使用 pwd[-LP] pwd  type pwd  (查看内部命令) pwd -p 切换根本路径 ls ls:查看

Python 学习第三弹:异常情况如何处理?

python 的处理错误的方式: 1> 断言 assert condition 相当于 if not condition: crash program 断言设置的目的就是因为与其让程序晚点崩溃,不如直接设置错误情况,让它直接崩溃 >>> age = -1 >>> assert 0 < age < 100 AssertionError 2> 捕捉异常 try: x = input() y = input() print(x/y) except Ze

css学习の第三弹—盒模型的创建和使用

一.css盒模型: 元素分类: 块状元素.内联元素(又叫行内元素)和内联块状元素. >>常用的块状元素有: <div>.<p>.<h1>...<h6>.<ol>.<ul>.<dl>.<table>.<address>.<blockquote> .<form> 设置display:block就是将元素显示为块级元素.如下代码就是将内联元素a转换为块状元素,从而使a元

Android Window PhoneWindow Activity学习心得--第三弹

Android Window  PhoneWindow Activity学习心得--第三弹 前面 我们完成了从Activity到PhoneWindow的整体跨度 正如我们所知道的与Activity组件关联的一个应用程序窗口视图对象关联一个ViewRoot对象,而将 一个Activity组件的应用程序窗口视图对象与一个ViewRoot对象关联是通过该Activity组件所使用的 窗口管理器(WindowManager)来执行的. 在我们初始化DecorView完成之后,我们需要关联应用程序窗口视图

爬虫学习 Python网络爬虫第三弹《爬取get请求的页面数据》

爬虫学习 Python网络爬虫第三弹<爬取get请求的页面数据> 一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2. 二.由易到难的爬虫程序: 1.爬取百度首页面所有数据值 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #导包 4

salesforce 零基础学习(三十八) soql函数以及常量

在salesforce中,我们做SOQL查询时,往往需要用到计算式,比如求和,求平均值,或者过滤数据时,往往需要通过时间日期过滤,SOQL已经封装了很多的函数,可以更加方便我们的sql查询而不需要自己另外设计. 一. 聚合函数 常用的聚合函数有如下几种: AVG():求平均值 COUNT():求记录个数 COUNT_DISTINCT():求不重复记录个数 MIN():求记录中最小值 MAX():求记录中的最大值 SUM():求和 这些聚合函数通常和group by fieldName 一起用,达

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

运维学习第四弹

运维学习第四弹之shell(bash): 一. hell可以翻译成壳,大多指能够对内部核心起到保护作用的一种装置或结构.在计算机科学中shell的实际意义为操作者提供的.能够通过系统调用或库调用使用整个计算机资源的访问接口. 它既是一种命令解析器又是一种程序设计语言.作为命令解析器,它可以解释和执行用户输入的命令,也可以自动地解释和执行预先编写好并保存在某个文本文件中的一系列的命令:作为程序设计语言,shell特别定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和条件分支

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd