C#编程(三十八)----------运算符
原文链接: http://blog.csdn.net/shanyongxu/article/details/46877353
运算符
类别 |
运算符 |
算术运算符 |
+ - * / |
逻辑运算符 |
& | ^ ~ && || ~ |
字符串连接运算符 |
+ |
增量和减量运算符 |
++ -- |
移位运算符 |
<< >> |
比较运算符 |
== != < > <= >= |
赋值运算符 |
= += -= *= /= %= &= |= ^= >>= <<= |
成员访问运算符运算符(用于对象和结构) |
. |
索引运算符(用于数组和所引起) |
[] |
类型转换运算符 |
() |
条件运算符(三元运算符) |
?: |
委托连接和删除运算符 |
+ - |
对象创建运算符 |
new |
类型信息运算符 |
sizeof is typeof as |
溢出异常控制运算符 |
checked unchecked |
间接寻址运算符 |
[] |
名称空间别名限定符 |
:: |
空额合并运算符 |
?? |
sizeof,*,->和&只能用于不安全的代码,注意sizeof运算符在早期版本中使用,自从.NET 2以来就不要了.
使用C#运算符 最大的一个缺点是与C风格的语言类似,对于赋值(=)和比较(==)运算符C#使用不同的运算符.例如:
x=3 //x等于3
如果要比较x与另一个值:
if(x==3)
{}
因为C#非常严格的类型安全则防止出现常见的C错误,比如在C中不出错的:
if(x=3)
{}
这在C#中是错误的.
在C#中使用加号(+)连接字符串,使用”&”发号表示连个不同整数值的按位AND运算,”|”符号表示两个整数值的按位OR运算.C#中海油取模运算符(%),7%5的结果为2.
C#很少使用指针和间接寻址运算符(->)
C#中的拥有简化赋值操作符:
例如:x++等价于x=x+1;x*=y等价于x=x*y
C#中的++x和x++的意思是不一样的,一个是前置,一个是后置 .案例:
int x=1;
if (++x==2)//因为这里是前置,所以先执行+1操作,x为2
{
Console.WriteLine("x=2");
}
if (x++==3)//因为这里是前置,所以先判断,然后再执行+1操作
{
Console.WriteLine("x=3");
}
Console.WriteLine(x);
Console.ReadKey();
下面介绍C#中频繁使用的基本运算符和类型强制转换运算符.
1条件运算符
条件运算符(?:)也成三元运算符:
condition ? true_value : false_valur
condition 为要判断的布尔表达式,true_value是condition为true时返回的值,false_value是condition为false时返回的值.
案例:
int x=1;
string s = x + " ";
s += (x == 1 ? "man" : "men");
Console.WriteLine(s);
2 .checked和unchecked
案例:
byte b = 255;
b++;
Console.WriteLine(b.ToString());
Console.ReadKey();
因为byte数据类型只能包含0~255的数,所以递增b的值会导致溢出.输出b的值为0.
如果把代码修改一下:
byte b = 255;
checked
{
b++;
}
Console.WriteLine(b.ToString());
Console.ReadKey();
CLR就是执行溢出检查,如果发生溢出,就会抛出异常.
执行代码会抛出异常.
如果要禁止异常检查,则可以把代码标记为unchecked
byte b = 255;
unchecked
{
b++;
}
Console.WriteLine(b.ToString());
Console.ReadKey();
本例中,不会抛出异常,但会丢失数据,因为byte数据类型不能包含256,溢出的位会丢弃,所以b的值为0.
注意,unchecked是默认行为.只有在需要把几行未检查的代码放在一个显式的标记为checked的大代码块中,才需要显示的使用unchecked关键字.
3.is运算符
is运算符可以检查对象是否与特定的类型兼容.”兼容”表示对象或该类型,或者派生自该类型.例如,要检查变量是否与object类型兼容,可以使用下面的代码:
int i = 10;
if (i is object)
{
Console.WriteLine("i is object");
}
4.as运算符
5.as运算符用于执行引用类型的显示类型转换.如果要转换的类型于指定的类型兼容,转换就会成功进行:如果类型不兼容,as运算符就会返回null值.如下例,如果object引用实际上不引用string实例,把object引用转换为string就会返回null:
object o1 = "some string";
object o2 = 5;
string s1 = o1 as string;
string s2 = o2 as string;
as运算符允许在一部中进行安全的类型转换,不需要先使用is运算符测试类型,在执行转换
5.sizeof运算符
使用sizeof运算符可以确定栈中值类型需要的长度(单位是字节):
Console.WriteLine(sizeof(int));
结果显示4,因为int有四个字节.
如果对于复杂类型(和非基元类型)使用sizeof运算符,就需要把代码放在unsafe块中,如下:
unsafe
{
Console.WriteLine(sizeof(Person));
}
6.typeof运算符
typeof运算符返回一个表示特定类型的System.Type对象.例如,typeof(string)返回表示System.String类型的Type对象.在使用反射技术动态的查找对象的相关信息时,这个运算符很有用.
7.可空类型和运算符
对于布尔类型,可以给他指定true或false值.但是,要把该类型的值定义为undefined,该怎么办>此时使用可空类型可以给应用程序提供一个独特的值.如果在程序中使用可空类型,就必须考虑null值在与各种运算符一起使用时的影响.通常可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个操作数都输null,其结果就是null.例如:
int? a = null;
int? b = a + 4;//b=null
int? c = a * b;//c=null
但是在比较可空类型时,只要有一个操作数是null,比较结果就是false.既不能因为一个条件是false,就认为该条件的对立面是true,这在使用非可空类型的程序中很常见.例如:
int? a = null;
int? b = -5;
if (a>=b)
{
Console.WriteLine("a>=b");
}
else
{
Console.WriteLine("a<b");
}
8.空合并运算符
空合并运算符(??)提供了一种快捷方式,可以在处理可空类型和引用类型时表示null可能的值.这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或引用类型;第二个操作数必须与第一个操作数的类型相同,或者可以隐含的转换为第一个操作数的类型.空合并运算符的计算如下:
如果第一个操作数不是null,整个表达式就等于第一个操作数的值.
如果第一个操作数是null,整个表达式就等于第二个操作数的值.
案例:
int? a = null;
int b;
b = a ?? 10;
Console.WriteLine(b);
a = 3;
b = a ?? 10;
Console.WriteLine(b);
运算符的优先级(从高到低的顺序)
组 |
运算符 |
初级运算符 |
() . [] x++ x-- new typeof sizeof checked uncheched |
一元运算符 |
+ - ! ~ ++x --x和数据类型强制转换 |
乘除运算符 |
* / % |
加减运算符 |
+ - |
移位运算符 |
<< >> |
关系运算符 |
< > <= >= is as |
比较运算符 |
== != |
按位AND运算符 |
& |
按位XOR运算符 |
^ |
按位OR运算符 |
| |
布尔AND运算符 |
&& |
布尔OR运算符 |
|| |
条件运算符 |
?: |
赋值运算符 |
= += -= *= /= %= &= |= ^= <<= >>= >>>= |
注意:在复杂的表达式中,应避免利用运算符又声称正确的结果,使用圆括号指定运算符的执行顺序,可以使代码更整洁,避免出现潜在的冲突.
C#编程(三十八)----------运算符的更多相关文章
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- Deep learning:三十八(Stacked CNN简单介绍)
http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...
- 【FastDev4Android框架开发】打造QQ6.X最新版本号側滑界面效果(三十八)
转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50253925 本文出自:[江清清的博客] (一).前言: [好消息] ...
随机推荐
- 如何动态修改windows下的host文件
事件背景:为了测试数据提交后,需要在另一个环境的多个测试节点下去验证测试数据是否添加成功,找了一大堆放法,用了比较笨的方法实现了.不多废话思路如下: 为了万无一失,先备份hosts文件内容: 1.读取 ...
- nodejs抓取别人家的页面的始末
内容:分析并获取页面调取数据的API(接口),并跨域获取数据保存在文档中(nodejs做代理-CORS) 事由以及动机 2015年9月份全国研究生数学建模竞赛的F题,旅游线路规划问题.其中需要自己去查 ...
- Hazelcast是什么
Hazelcast是什么 “分布式”.“集群服务”.“网格式内存数据”.“分布式缓存“.“弹性可伸缩服务”——这些牛逼闪闪的名词拿到哪都是ITer装逼的不二之选.在Javaer的世界,有这样一个 ...
- Kotlin中var和val的区别
Kotlin中有两个关键字定义变量,这两个关键字外形看着差别很小就只差了一个字母,但实际差别很大的. var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量.这种声明变量的方式和Java ...
- CCF计算机职业资格认证考试题解
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF计算机职业资格认证考试题解 CCF计算机软件能力认证(简称CCF CSP认证)是CCF计算机职业资格认证系 ...
- Webpack按需加载一切皆模块
前言 在学习 Webpack 之前,我们需要了解一个概念:模块. 何为模块? 如果你曾学过 Java , C# 之类的语言,一定会知道 Java 中的 import 或 C# 中的 using 吧? ...
- windows + hadoop + eclipse 过程记录
昨天在本机上搭建了伪分布式的hadoop,今天决定在eclipse中搭建hadoop的环境,毕竟磨刀不误砍柴工 安装的hadoop是2.7.5版本,要想使用eclipse写MapReduce需要一个 ...
- ref:Spring JDBC框架
ref:https://blog.csdn.net/u011054333/article/details/54772491 Spring JDBC简介 先来看看一个JDBC的例子.我们可以看到为了执行 ...
- 标签传播算法(llgc 或 lgc)
动手实践标签传播算法 复现论文:Learning with Local and Global Consistency1 lgc 算法可以参考:DecodePaper/notebook/lgc 初始化算 ...
- SpringAOP实战应用
Springboot中使用AOP特性非常简单,使用@AspectJ注解,然后再配置中开启AspectJ即可.在日常的应用,有时可以将日志记录和异常处理在一个拦截器中统一处理,但有时在项目中无法通过一个 ...