short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确

这个问题以前碰到过,也研究过,发表一下:
    如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确。这两个表达式都被称为赋值表达式。第二个表达式使用的是简单赋值操作符(=),而第一个表达式使用的是复合赋值操作符。Java语言规范中讲到,复合赋值(E1 op=E2)等价于简单赋值(E1=(T)((E1) op (E2))),其中T是E1的类型,除非E1只被计算一次。
    换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。
    因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于byte、short或char类型的变量。

因为S1short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升。也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过。   
      后面的那个不会发生类型的提升,JAVA规范上说     e1+=e2     实际上是     e1=(T1)(e1+e2),其中T1是e1的数据类型。   s1+=1等效于   s1=(short)(s1+1),所以是正确的。

时间: 2024-08-02 06:55:49

short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确的相关文章

6、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?-Java面试题答案

先说一下Java的基本数据类型转换规则,大的数据类型转换为小的数据类型需要强制转换,反之可以自动转换. 赋值表达式等号两侧的转换的规则是右侧的向左侧的看齐,即右侧表达式要转换到和左边的类型一样. 第一题:short s1 = 1; s1 = s1 + 1; 错! s1 + 1,s1是short类型,1是int型,s1会自动转换为int型的1,与1相加后,得到int型的2,要向左侧的short类型的s1看齐,即需要通过强制类型转换.正确写法:s1 = (short) (s1 + 1); 第二题:s

C 在一个字串s1中查找一子串s2,若存在则返回s1中s2的个数和位置

在一个字串s1中查找一子串s2,若存在则返回s1中s2出现次数和位置 #include<stdio.h> #include<string.h> void main() { char s1[100],s2[10]; int i,j,k,len1,len2,b[10]; gets(s1); gets(s2); len1=strlen(s1); len2=strlen(s2); for(i=0,k=0;i<len1;i++) { for(j=0;j<len2;j++) if(

一份不太简短的LaTeX教程 lshort – A short in&#173;tro&#173;duc&#173;tion to LATEX 2elshort – A short in&#173;tro&#173;duc&#173;tion to LATEX 2e

Lshort started as a trans­la­tion and ra­tio­nal­i­sa­tion of a ground-break­ing Ger­man-lan­guage in­tro­duc­tion to LATEX. It has since taken on a mo­men­tum of its own, and has it­self been trans­lated into a num­ber of lan­guages. Thus we have in

Unity3D 5.0版本 加载dll报错, 换用4.5 版本可以正确运行与导出(x86版本)

在Unity3D环境下测试UnityWebCore和awesomium等用来在Unity中显示网页的插件时, 发现总是不能加载dll文件. Win64环境, Unity5.0(64bit) 报错内容如下: Failed to load 'Assets/Plugins/awesomium.dll', expected 64 bit architecture (IMAGE_FILE_MACHINE_AMD64), but was IMAGE_FILE_MACHINE_I386. 网上的回答都是说该d

转!!Java 基础面试题的剖析: short s1=1;s1 = s1 +1 报错? s1+=1 呢

short s1=1;s1 = s1 +1会报错吗? package common; public class ShortTypeTest { /* * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub short s1 = 1; s1 = (short) (s1 + 1);//简单类型 short s2=1; s2 +=1;//复合类型,复合赋值操作符+=, Sy

对于char *s1 和 char s2[] 的认识

对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误. char *s1 = "hello"; char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错. char s2[]的s2 是数组对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改

经典算法面试题目-判断s2是否是s1的旋转字符串(1.8)

题目 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., "waterbottle" is a rotation of &qu

ACPI电源管理中的S0 S1 S2 S3 S4 S5

电源选项中S0,S1,S2,S3,S4,S5的含义以 ACPI 的规格来说吧!ACPI(Advanced Configuration and Power Interface),即高级配置与电源接口.这种新的能源管理可以通过诸如软件控制'开关'系统,亦可以用Modem信号唤醒和关闭系统. ACPI在运行中有以下几种模式: S0 正常. S1 CPU停止工作.唤醒时间:0秒. S2 CPU关闭.唤醒时间:0.1秒. S3 除了内存外的部件都停止工作.唤醒时间:0.5秒. S4 内存信息写入硬盘,所有

返回指定字符串位置的函数FIELD(S,S1,S2,...) 与 FIND_IN_SET(S1,S2) 函数

FIELD(S,S1,S2,...)  与 FIND_IN_SET(S,S1) 函数  ------> 这2个函数都是返回指定字符串在源串中的出现的位置(皆是第一次出现的位置),但2个函数的参数不一样,前者是以列表形式的参数,后者是整体为一个整串的参数.(上边S皆为指定串,前者S1和S2为串列表,后者S1为一个整串) FIELD(S,S1,S2,...) : 返回指定字符串位置的函数FIELD(S,S1,S2,...) FIELD(S,S1,S2,...)返回字符串s在列表s1,s2,.....