java中赋值运算符“+=”的问题
publicclassDemo3{publicstaticvoidmain(String[]args){intsum=0;sum+=Math.pow(2,3);Syste...
public class Demo3{
public static void main(String[] args) {
int sum=0;
sum += Math.pow(2,3);
System.out.println("sum = " + sum);
}
}
运行上段代码没有问题,但是将第四行代码改写成sum =sum+ Math.pow(2,3);就会提示:
Demo3.java:4: 错误: 不兼容的类型: 从double转换到int可能会有损失
这是为什么?
——java学习新手 展开
public static void main(String[] args) {
int sum=0;
sum += Math.pow(2,3);
System.out.println("sum = " + sum);
}
}
运行上段代码没有问题,但是将第四行代码改写成sum =sum+ Math.pow(2,3);就会提示:
Demo3.java:4: 错误: 不兼容的类型: 从double转换到int可能会有损失
这是为什么?
——java学习新手 展开
3个回答
推荐于2018-04-30
展开全部
要点1: *=,+=,-=,%= 等符号的应用是同道理的: 即把左边的移过右边运算(右边用括号包住,表示先运算),结果再给左边(注意左边只能是变量,不可为表达式)
A += B 等价于A = A + (B); (B可以是值或表达式,这里的=仍是赋值号哦,B打括号是因为它可以是表达式)
如 x += 1; ===== x= x+1; x += 1+2+3; ===== x =x+(1+2+3); x += a+b+1 ==== x= x+(a+b+1);
要点2:就个这样的符号的运算,则从最右边的那个开始计算,一直到左边
例如: A += B %= A -= B
--------------3------2----1 (3个这样的符号)
从*最右边*来分析(按符号顺序):
1: A=A-(B) ,得到了A的新值
2:B = B%(A), 得到了B的新值 (注意该A是新值哦)
3: A=A+(B), 再次得到了A的新值 (注意右边的A也是1的新值,B是2的新值)
懂了上面,你应该可以分析自己的了~~~
许而泗谨凇朐娴执酋豹亮服莎立瑕浠器堂瓜裳履
A += B 等价于A = A + (B); (B可以是值或表达式,这里的=仍是赋值号哦,B打括号是因为它可以是表达式)
如 x += 1; ===== x= x+1; x += 1+2+3; ===== x =x+(1+2+3); x += a+b+1 ==== x= x+(a+b+1);
要点2:就个这样的符号的运算,则从最右边的那个开始计算,一直到左边
例如: A += B %= A -= B
--------------3------2----1 (3个这样的符号)
从*最右边*来分析(按符号顺序):
1: A=A-(B) ,得到了A的新值
2:B = B%(A), 得到了B的新值 (注意该A是新值哦)
3: A=A+(B), 再次得到了A的新值 (注意右边的A也是1的新值,B是2的新值)
懂了上面,你应该可以分析自己的了~~~
许而泗谨凇朐娴执酋豹亮服莎立瑕浠器堂瓜裳履
展开全部
1.
"+"如果是数值运算
int
a
=
1,b
=
2;则a
+
b
=
3
如果是2个字符串相加
其功能就是
String
a
=
"a",b
=
"b";则a
+
b
=
"ab";
2.位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。
位运算符有:
&(按位与)、|(按位或)、^(按位异或)、~
(按位取反)。
其中,按位取反运算符是单目运算符,其余均为双目运算符。
位运算符的优先级从高到低,依次为~、&、^、|,
其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符。
按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:
0
&
0
=
0,
0
&
1
=
0,
1
&
0
=
0,
1
&
1
=
1。
即同为
1
的位,结果为
1,否则结果为
0。
逻辑运算
(logical
operators)
通常用来测试真假值。最常见到的逻辑运算就是循环的处理,用来判断是否该离开循环或继续执行循环内的指令。
<
小于;
>
大于;<=
小于或等于;>=
大于或等于;==
等于;!=
不等于;&&
而且
(And);and
而且
(And);||
或者
(Or);or
或者
(Or);xor
异或
(Xor);!
不
(Not)
3.
&&
表示前后2个条件一定要同时满足
才能为真
有一个条件为假的时候就是假
则不执行
一般用在
if(x
>
0
&&
y
>
0)
{
System.out.print("x和y都是大于0");
}
else
{
System.out.print("x和y中有一个不是正数");
}
"||"这个“或”呢
属于条件取舍型的,也就是说c
=
a||b
只要a或者b为真的时候
这条表达式c就是为真
4.
右移
System.out.println(-3>>1);
结果是-2,为什么会是-2呢?下面我们来看一下.
System.out.println(Integer.toHexString(-3));得到-3的16进制为fffffffd(此为-3的补码,计算机中负数用补码表示).
转换成2进制为1111
1111
1111
1111
1111
1111
1111
1101
右移一位为1111
1111
1111
1111
1111
1111
1111
1110,显而易见此为-2补码.
左移
System.out.println(-3<<1);左移相对来说比较简单.
1111
1111
1111
1111
1111
1111
1111
1101左移一位为
1111
1111
1111
1111
1111
1111
1111
1010,其为-6的补码.
无符号右移
System.out.println(-3>>>1);
1111
1111
1111
1111
1111
1111
1111
1101无符号右移,高位补0,
01111
1111
1111
1111
1111
1111
1111
1110,其为2147483646的原码.
"+"如果是数值运算
int
a
=
1,b
=
2;则a
+
b
=
3
如果是2个字符串相加
其功能就是
String
a
=
"a",b
=
"b";则a
+
b
=
"ab";
2.位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。
位运算符有:
&(按位与)、|(按位或)、^(按位异或)、~
(按位取反)。
其中,按位取反运算符是单目运算符,其余均为双目运算符。
位运算符的优先级从高到低,依次为~、&、^、|,
其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符。
按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:
0
&
0
=
0,
0
&
1
=
0,
1
&
0
=
0,
1
&
1
=
1。
即同为
1
的位,结果为
1,否则结果为
0。
逻辑运算
(logical
operators)
通常用来测试真假值。最常见到的逻辑运算就是循环的处理,用来判断是否该离开循环或继续执行循环内的指令。
<
小于;
>
大于;<=
小于或等于;>=
大于或等于;==
等于;!=
不等于;&&
而且
(And);and
而且
(And);||
或者
(Or);or
或者
(Or);xor
异或
(Xor);!
不
(Not)
3.
&&
表示前后2个条件一定要同时满足
才能为真
有一个条件为假的时候就是假
则不执行
一般用在
if(x
>
0
&&
y
>
0)
{
System.out.print("x和y都是大于0");
}
else
{
System.out.print("x和y中有一个不是正数");
}
"||"这个“或”呢
属于条件取舍型的,也就是说c
=
a||b
只要a或者b为真的时候
这条表达式c就是为真
4.
右移
System.out.println(-3>>1);
结果是-2,为什么会是-2呢?下面我们来看一下.
System.out.println(Integer.toHexString(-3));得到-3的16进制为fffffffd(此为-3的补码,计算机中负数用补码表示).
转换成2进制为1111
1111
1111
1111
1111
1111
1111
1101
右移一位为1111
1111
1111
1111
1111
1111
1111
1110,显而易见此为-2补码.
左移
System.out.println(-3<<1);左移相对来说比较简单.
1111
1111
1111
1111
1111
1111
1111
1101左移一位为
1111
1111
1111
1111
1111
1111
1111
1010,其为-6的补码.
无符号右移
System.out.println(-3>>>1);
1111
1111
1111
1111
1111
1111
1111
1101无符号右移,高位补0,
01111
1111
1111
1111
1111
1111
1111
1110,其为2147483646的原码.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
sum + Math.pow(2,3);他会加int型的sum变量强制转换为double类型,而你再讲double类型的值赋给int型就会出现,赋值的时候类型不会隐式转换,必须自己去强制转换,实际上+=就是和下面的代码等价的。
int sum=0;
sum = (int)(sum + Math.pow(2,3));
System.out.println("sum = " + sum);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询