C# 操作符之二 算数操作符_C#教程

赋值运算符也有和算数操作符所结合的用法之前附录中有提及,用法是:比如要将x加上4,然后再赋值给x,就可以写成x+=4.

复制代码 代码如下:

public class MathOps{
public static void main(String [] args){
Random rand=new Random(47);
int i,j,k;
j=rand.nextInf(100)+1;
System.out.println("j:"+j);
k=rand.nextInt(100)+1;
System.out.println("k:"+k);
i=j-k;
System.out.println("j-k:"+i);
i=k/j;
System.out.println("k/j:"+i);
i=k*j;
System.out.println("k*j:"+i);
j%=k;
System.out.println("i%=k:"+j);
float u,v,w;
v=rand.nextFloat();
System.out.println("v:"+v);
w=rand.nextFloat();
System.out.println("w:"+w);
u=v+w;
System.out.printlln("v+w:"+u);
u=v-w;
System.out.println("v-w:"+u);
u=v*w;
System.out,print("v*w"+u);
u=v/w;
System.out.print("v/w:"+u);
u+=v;
System.out.print("u+=v:"+u);
u-=v;
System.out.print("u-=v:"+u);
u*=v;
System.out.print("u*=v:"+u);
u/=v;
System.out.print("u/=v:"+u);
}
}

输出:
j:59;
k:56;
j+k:115;
j-k:3;
k/j:0;
k*j:3304;
k%j:56;
j%=k:3;
v:0.5309454;
w:0.0534122
v+w:0.5843576
v-w:0.47753322
v*w:0.028358962
v/w:9.94025
u+=v:10.471473
u-=v:9.940527
u*=v:5.2778773
u/=v:9.940527
通过Random类的对象,程序可以生成许多不同类型的随机数字。做法很简单,只需要调用方法nextInt()和nextFloat()即可(或nextLong()或者nextDouble())。传递给nextInt()的参数设置了所产生的随机数的上限,而其下线为0,但是这个下线并不是我们想要的,因为他会产生除0的可能性,所以做了+1的操作。
一元操作符中编译器会自动判断+,-号的作用
比如:x=a*-b;编译器可以编译其含义b前-号是负号但为了避免读者混淆最佳的写法是
x=a*(-b)
一元减号用于转变数据的符号,而一元加号只是为了与一元减号相对应,但是它唯一的作用仅仅是将较小类型的操作数提升为int;
算术操作符


Operator


Use


Description


+


op1 + op2


返回op1和op2的和


-


op1 - op2


返回op1和op2的差


*


op1 * op2


返回op1和op2的积


/


op1 / op2


返回op1除以op2的商


%


op1 % op2


返回op1除以 op2的余数

自动递增和递减
Java中提供的打量快捷运算中递增和递减运算时两种相当不错又快捷的运算(通常被称为"自动递增"和"自动递减"运算)。其中,递减操作符是"--",意私事减少一个单位,递增是"++"意思是增加一个单位
++a等价于a=a+1递减亦同
递增,递减又分为"前缀式"和"后缀式"。
对于前缀式:++a,--a,会先执行运算,再生成值。而对于后缀式a++,a--,会先生成值,在执行运算。

复制代码 代码如下:

public class AutoInc{
public static void main(String [] args){
int i=1;
System.out.println("i:"+1);
System.out.println("++i:"+ ++i);
System.out.println("i++:"+ i++);
System.out.println("—i:"+ --i);
System.out.println("i--:" + i--);
}
}

输出
i:1
++i:2
i++:2
--i:1
i--:1
从上面这个例子中可以看书前缀式和后缀式的区别
递增操作符正是c++这个名字的一种解释,"超越c一步"
关系操作符
关系操作符主要生成的的是一个boolean布尔结果,他们比较值之间的结果如果为真返回true,如果为假则返回false,关系操作符包括<,>,<=,>=,==,!=(不等于),等于和不等于适合于所有基本数据类型,而其他的操作符不适合对boolean值的操作,因为true和false两个之间不存在大于或小于的关系

复制代码 代码如下:

public class Equivalence{
public static void main(String [] arg){
Integer n1=new Integer(47);
Integer n2=new Integer(47);
System.out.println(n1==n2);
System.out.println(n1!=n2);
}
}

输出
false
true
结果可能会跟你想的不一样,在这里尽管对象内容相同,但是对象的引用是不同的,而==和!=比较的是对象的引用,而不是内容。
如果相比较两对象的实际内容是否相同的话要怎么做?需要使用所有对象都适用的equals()方法。但这个方法不适用于基本类型,基本类型直接使用==,!=即可

复制代码 代码如下:

public class EqualMethod{
public static void main(String [] args){
Integer n1=new Integer(47);
Interger n2=new Integer(47);
System.out.println(n1.equals(n2));
}
}

输出
true
但是如果引用的对象是自己创建的类,结果又会有不同

复制代码 代码如下:

class Value{
int i;
}
public class EqualsMethod2{
public static void main(String [] args){
Value v1=new Value();
Value v2=new Value();
v1.i=v2.i=100;
System.out.println(v1.equals(v2));
}
}

输出
false
结果又是false,这是由于equals的默认其实是比较引用。所以除非在自己的新类中重写equals方法、否则是不能达到我们预期的效果的。
关系操作符


Operator


Use


Description


>


op1 > op2


当op1 大于op2 时返回true


>=


op1 >= op2


当op1 大于或等于op2 时返回true


<


op1 < op2


当op1 小于op2 时返回true


<=


op1 <= op2


当op1 小于或等于op2 时返回true


==


op1 == op2


当op1 等于大于op2 时返回true


!=


op1 != op2


当op1 不等于op2 时返回true

逻辑操作符
逻辑操作符与(&&),或(||),非(!)能根据参数的关系返回布尔值

复制代码 代码如下:

public class Bool{
public static void main(String [] args){
Random rand=new Random(47);
int i=rand.nextInt(100);
int j=rand.nextInt(100);
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("i > j is" +( i>j));
System.out.println("i < j is" +( i<j));
System.out.println("i > =j is" +( i>=j));
System.out.println("i <=j is" +( i<=j));
System.out.println("i ==j is" +( i==j));
System.out.println("i !=j is" +( i!=j));
System.out.println("(i <10) && (j<10) is" +((i <10) && (j<10)));
System.out.println("(i <10) || (j<10) is" +((i <10) ||(j<10)));
}
}

输出
i=58
j=55
i>j is true
i<j is false
i>= j is true
i<=j is false
i==j is false
i!=j is true
(i <10) && (j<10) is false
(i <10) ||(j<10) isfalse
与或非操作只能应用于布尔值,如果在应该是String值的地方使用了boolean的话,布尔值会自动转换成适当的形式。
应注意的是在程序上对浮点数的比较是非常严格的。
条件操作符


Operator


Use


Description


&&


op1 && op2


当op1和op2都是true时,返回true ;如果op1的值是false,则不运算右边的操作数


||


op1 || op2


当op1和op2有一个是true时,返回true;如果op1的值是true,则不运算右边的操作数


!


! op


当op是false时,返回true;当op是true时,返回false


&


op1 & op2


运算op1和op2;如果op1和op2都是布尔值,而且都等于true,那么返回true,否则返回false;如果op1和op2都是数字,那么执行位与操作


|


op1 | op2


运算op1和op2;如果op1和op2都是布尔值,而且有一个等于true,那么返回true,否则返回false;如果op1和op2都是数字,那么执行位或操作


^


op1 ^ op2


运算op1和op2;如果op1和op2不同,即如果有一个是true,另一个不是,那么返回true,否则返回false;如果op1和op2都是数字,那么执行位异或操作

短路
当使用逻辑操作符的时候会遇到一种短路状况。既一但能够明确无误地确定整个表达式的值,就不再计算表达式余下的部分了。因此,整个逻辑表达式靠后的部分有可能不再计算。下面的例子展示了短路现象

复制代码 代码如下:

public class ShortCircuit{
static Boolean test1(int val){
System.out.println(“test1(“+val+")");
System.out.println(“result:"+(val<1));
return val<1
}
static Boolean test2(int val){
System.out.println(“test1(“+val+")");
System.out.println(“result:"+(val<2));
return val<2
}
static Boolean test3(int val){
System.out.println(“test1(“+val+")");
System.out.println(“result:"+(val<3));
return val<3
}
public static void main(String [] args){
Boolean b=test1(0)&&test2(2)&&test3(2);
System.out.println(“expression is “ + b);
}
}

输出
test1(0)
result:true
test(2)
result:false
expression is false
由于调用了3个方法你会很自然的觉得3个方法应该都被运行,但实际上输出并非这样,因为在第二次测试产生一个false结果。由于这意味着整个表达式肯定为false,所以没必要继续计算剩余的表达式,那样只是浪费。“短路“一次正来源于此。实际上,逻辑上所有的逻辑表达式都有一部分不必计算,那将获得性能的提升。
三元操作符
三元操作符也成为条件操作符,他显得比较特别,因为有三个操作数,但是他又确实属于操作符的一种
其形式为
boolean-exp?value0 :value1
如果boolean-exp表达式结果为true,就计算value0,而且这个计算结果也就是操作符最终产生的值。如果boolean-exp表达式结果为false,就计算value1,同样的,他的结果也将成为操作符最后的值。
当然它也可以被if-else代替,但是三元操作符与if-else是完全不同的,操作符会产生一个值。

复制代码 代码如下:

public class TernaryIfElse{
static int ternary(int i){
return i<10?i*100:i*10;
}
static int standardIfElse(int i){
if(i<10)
return i*100;
else
return i*10;
}
public static void main(String [] args){
System.out.println(ternary(9));
System.out.println(ternary(10));
System.out.println standardIfElse( (9));
System.out.println standardIfElse( (10));
}
}

输出
900
100
900
100
相比之下三元运算符要紧凑很多,而if-else更易理解
字符串操作符+和+=
Java中+和+=操作符除了之前讲到的作用外,在特殊的上下文环境中是可以用作字符连接的。所以他们又称为字符串操作符,字符串操作符有一些很有趣的行为。如果表达式以一个字符串起头,那么后续所有的操作数都必须是字符串型(编译器会自动将双引号中的字符序列传化成字符串):

复制代码 代码如下:

public class StringOperators{
public static void main(String [] args){
int x=0,y=1,z=2;
String s="x,y,z";
System.out.println(s+x+y+z);
System.out.println(x+""+s);
s+="(summed) =";
System.out.println(s+(x+y+z));
System.out.println(“"+x);
}
}

输出
x,y,z 012
0 x,y,z
x,y,z (summed) = 3
0
应注意的是第一行输出的是012而不是总和3,是因为编译器将他们自动转化成了字符串形式,最后部分用+=讲一个字符串追加到了s上,并且用括号来控制了编译器的转换,使他们可以顺利求和。

时间: 2025-01-29 19:28:09

C# 操作符之二 算数操作符_C#教程的相关文章

C#数据结构与算法揭秘二 线性结构_C#教程

上文对数据结构与算法,有了一个简单的概述与介绍,这篇文章,我们介绍一中典型数据结构--线性结构. 什么是线性结构,线性结构是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这 种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数据元素: (2)除最后一个位置的数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是一个接一个的排

C# 操作符之三元操作符浅析_C#教程

C# 操作符之三元操作符"?:"是什么呢? C# 操作符之三元操作符"?:"有时也称为条件操作符. 对条件表达式b?x:y,先计算条件b,然后进行判断. 如果b的值为true,计算x的值,运算结果为x的值:否则,计算y,运算结果为y的值. 一个条件表达式从不会又计算x,也计算y.条件操作符是向右关联的,也就是说,从左向右分组计算. C# 操作符之三元操作符"?:"操作实例: 表达式a?b:c?d:e将按a?b:(C?d:e)形式执行. ?:的第二

.Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用_C#教程

中午没事,把去年刚毕业那会画的几张图翻出来了,大概介绍Winform应用程序运行的过程,以及TCP协议在Winform中的应用.如果有Windows消息机制等基础,很好理解这两张图. (1)Winform应用程序运行结构图 开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用_C#教程-tcp ip协议 层结构图"> (2)TCP通讯协议在Winform程序中的应用示意图 熟悉整个程序的来龙去脉,编程的时候就会很轻松,不会云里雾里. 另附公司招聘面试题一份,用了几

从头开始学JavaScript (五)——操作符(二)

原文:从头开始学JavaScript (五)--操作符(二) 一.乘性操作符 1.乘法:*      乘法操作符的一些特殊规则: 如果操作数都是数值,按照常规的乘法计算,如果乘积超过了ECMAscript数值的表示范围,则返回infinity或者-infinity 如果有一个操作数是NaN,那返回结果就是NaN 如果是infinity与0相乘,返回NaN 如果infinity与非0数相乘,返回infinity或者-infinity infinity与infinity相乘,返回infinity 如

C#基础知识 全面解析可空类型_C#教程

引言: C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚开始觉得可空类型使用过程中比较简单,觉得没有讲的必要,但是考虑到这个系列的完整性,决定还是唠叨下吧,希望对一些不熟悉的人有帮助). 一.为什么会有可空类型   如果朋友们看了我之前的分享,对于这一部分都不会陌生,因为我一般介绍C#特性经常会以这样的方式开头的, 因为每个特性都是有它出现的原因的(有一

.Net WInform开发笔记(三)谈谈自制控件(自定义控件)_C#教程

末日这天写篇博客吧,既然没来,那就纪念一下. 这次谈谈自制控件,也就是自定义控件,先上图,再说 1.扩展OpenFileDialog,在OpenFileDialog中添加各种文件(.txt,.jpg,.excel等等)的预览功能 开发笔记(三)谈谈自制控件(自定义控件)_C#教程-winform自定义控件"> 2.重写ListBox,增加折叠.鼠标背影.分类等功能 -----------------------------分割线-------------------------------

使用VS2010 C#开发ActiveX控件(下),完整代码打包下载_C#教程

其实如果我们不进行设置,只是修改了代码,运行程序以后,其出错界面如下图1所示: 开发ActiveX控件(下),完整代码打包下载_C#教程-vs2010使用教程 c"> 图1 抛出异常如下: ************** Exception Text ************** System.MethodAccessException: Attempt by security transparent method 'Rare.Card.Libary.Controls. ReadCardCo

C#中如何利用操作符重载和转换操作符

原文:C#中如何利用操作符重载和转换操作符 操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整数加到一起的代码. 当编译器发现两个string类型的实例使用+操作符的时候,编译器会生成把两个字符串连接到一起的代码.那么编译器怎么就会知道这样做呢?如何进行操作符重载呢? 下面C#代码展示了一个类中如何进行操作符重载: namespace Do

C# 常见操作符整理_C#教程

常见的操作符 赋值操作符:= 复合赋值运算符:+=,-=,*=,/=,%= 算数运算符:+,-,*,/,%(ß二元运算符),++,--(ß一元运算符) 条件运算符:>,<,>=,<=,!=,== 逻辑运算符:&&,||,|,! 几乎所有的操作符都只能操作基本数据类型,但是"=","=="和"!=",这些操作符能操作所有的对象.除此以外String类支持"+"和"+="