各种运算符注意事项

Java运算符详解
本文详细介绍了Java中的各类运算符,包括算术运算符、赋值语句、比较运算符、逻辑运算符及位运算符,并提供了应用技巧和注意事项。

各种运算符注意事项

1.算术运算符注意事项

+”除字符串相加功能外,还能把非字符串转换成字符串 ,如: “x+123;的结果是“x123” 。 

如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论了。

对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 int x=3510;x=x/1000*1000;实际运行结果是3000 ,想想为什么? 

 

1.1算术运算符的应用技巧

思考题1:某个培训中心要为新到的学员安排房间,假设共有x个学员,每个房间可以住6人,让你用一个公式来计算他们要住的房间数?

答案:(x+5)/6。这种算法还可用在查看留言板的分页显示上: 其中x是总共的留言数,6是每页显示的留言数,结果就是总共有多少页。

思考题2:假设你要让x的值在09之间循环变化,请写出相应的程序代码。

答案:

int x=0;

while(true)

{

x = (x+1)%10;

}

 

2.赋值语句注意事项

1:在JAVA里可以把赋值语句连在一起,如:

   x = y = z = 5 ;

        在这个语句中,所有三个变量都得到同样的值5

x += 3等效于x = x + 3,等于*= -=/=依此类推。

 

3.比较运算符注意事项

1:比较运算符的结果都是boolean型,也就是要么是true,要么是false

2:比较运算符“==”不能误写成“=” ,切记!切记!

 

4.逻辑运算注意事项

1:逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型 。

2:“&”和“&&”的区别在于,如果使用前者连接,那么无论任何情况,“&”两边的表达式都会参与计算。如果使用后者连接,当“&&”的左边为false,则将不会计算其右边的表达式。“|”和“||”的区别与“&”和“&&”的区别一样。

 

4.1&”和“&&”的区别分析

  public class TestAnd
  {
     public static void main(String[] args)
     {
         int x=0;
         int y=3;
         if(x!=0 && y==y/x)
        	System.out.println("y = "+y);
     }
  }

上面例子中,由于if语句的判断条件中的第一个布尔表达式是不成立的,程序就不会判断第二个布尔表达式的值,这就是“短路”。如果两个表达式之间用“&”来连接,如果正好碰到上面所示的特殊情况,程序运行时就会出错 。


5.位运算符

任何信息在计算机中都是以二进制的形式保存的,&,|,^除了可以作为逻辑运算符,也可以做为位算符,它们对两个操作数中的每一个二进制位都进行运算。

×××只有参加运算的两位都为1&运算的结果才为1,否则就为0

×××只有参加运算的两位都为0|运算的结果才为0,否则就为1

×××只有参加运算的两位不同,^运算的结果才为1,否则就为0

我们可以对数据按二进制位进行移位操作,java的移位运算符有三种:

<<  左移

>>  右移

>>> 无符号右移


5.1 java对位运算的编译原理

“ < <”,   “> > ”,   “> > > ”在Java中是左移、有符号右移和无符号右移运算符。位移运算符只对int值进行操作,如果不是int,编译器会报错。在Java中,一个int的长度始终是32bit,也就是4个字节。

比如t> > > n的含义就是把整数t右移n位,高位补上零。所以如果t是个负数,最高位是1,那么经过无符号右移之后,就成了一个正数。比如   -1> > > 31=1。
值得注意的是,虚拟机在进行位移操作之前,把位移的位数(即“t> > > n”中的n)对32取了模,左移或右移33位等价于移动1位,而且无论任何数,使其移动32位,其值都不会发生变化。因为在虚拟机看来,t> > > 32与t> > > 0是等价的(同理t < <32等价于t < <0)。移动64位也是如此,以此类推。
那如果移动的位数   n   是负数怎么办呢?。
这时虚拟机会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到   n   变成一个正数。比如(k> > > -1)   ==>   (k> > > 31);   (k> > -43)   ==>   (k> > -11)   ==>   (k> > > 21)。

 

5.2>>”和“>>>” 区别的实例分析

public class ShiftTest{
	public static void main(String [] args){
	        int x=0x80000000;
	        int y=0x80000000;
		x=x>>1;
		y=y>>>1;
		System.out.println(“0x80000000>>1 = ” + Integer.toHexString(x));
		System.out.println(“0x80000000>>>1 = ” + Integer.toHexString(y));
	}
}

运行结果如下:

0x80000000>>1 = c0000000

0x80000000>>>1 = 40000000


5.3移位运算符注意事项

移位运算符适用类型有byteshortcharintlong

对低于int型的操作数将先自动转换为int型再移位。

对于int型整数移位a>>b,系统先将b32取模,得到的结果才是真正移位的位数。例如:a>>33a>>1结果是一样的,a>>32的结果还是a原来的数字。

对于long型整数移位时a>>b ,则是先将移位位数b64取模。

移位不会改变变量本身的值。如a>>1;在一行语句中单独存在,毫无意义 。

x>>1的结果和x/2的结果是一样的,x<<2x*4的结果也是一样的。总之,一个数左移n位,就是等于这个数乘以2n次方,一个数右移n位,就是等于这个数除以2n次方。

思考:

1.如何用程序实现求2x次方。答案:y = 1<< x; 

2.对于int a =2; int b= a + 3 * a++;这样的语句,b最终等于多少呢?

试验得到的结果是8

3.对于int a =2; int b= (a ++)+ 3 * a;这样的语句,b最终等于多少呢?

试验得到的结果是11

 

 
















运算符重载需要注意以下方面: ### 操作对象要求 为防止对标准类型进行运算符重载,规定重载运算符的操作对象至少有一个不是标准类型,而是用户自定义的类型。例如,不能重载 `1 + 2`,但可以重载 `cow + 2` 和 `2 + cow`(`cow` 是自定义的对象)[^4]。 ### 语法规则限制 - 不能改变原运算符的语法规则,如不能把双目运算符重载为单目运算符,也不能将单目运算符重载为双目运算符。比如不能将 `++` 重载为双目运算符,因为 `++` 原本是单目运算符[^3][^4]。 - 不能改变原运算符的优先级。例如重载 `+` 运算符后,其优先级仍和原来的 `+` 运算符一样[^3][^4]。 - 不能创建新的运算符,像 `operator**` 就是非法的,而 `operator*` 是合法的[^4]。 ### 重载方式限制 - `=` 赋值运算符、`()` 函数调用运算符、`[]` 下标运算符、`->` 通过指针访问类成员运算符不能重载为类的友元函数,只能使用成员函数形式进行重载,否则可能和 C++ 的其他规则矛盾[^4]。 - 如果运算符的第一个操作数要求使用隐式类型转换,则必须为友元函数,因为成员函数方式的第一个参数是 `this` 指针[^4]。 - 同一个运算符重载,不能同时使用成员函数和友元函数两种方式,否则会导致编译器不知道选择哪一个,产生二义性[^4]。 ### 其他注意事项 - 重载的运算符的操作数必须有一个是自定义类型,否则会报错。若没有自定义类型,就是对内置类型进行重载,这是非法的[^3]。 - 重载之后,运算符的优先级和结合性保持不变,不能改变操作数的个数和顺序,也不能设置默认参数[^3]。 - 重载 `||` 和 `&&` 之后,运算符不再具备短路特性[^3]。 - 不能臆造一个并不存在的运算符,尽量使重载的运算符的语义与内置类型保持一致[^3]。 示例代码展示 `+` 运算符的重载: ```cpp #include <iostream> class Complex { public: Complex(double real = 0.0, double imag = 0.0) : real(real), imag(imag) {} // 重载 + 运算符 Complex operator+(const Complex& other) const { return Complex(real + other.real, imag + other.imag); } void display() const { std::cout << real << " + " << imag << "i" << std::endl; } private: double real; double imag; }; int main() { Complex c1(1.0, 2.0); Complex c2(3.0, 4.0); Complex c3 = c1 + c2; c3.display(); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值